/** * @file d_a_e_zh.cpp * */ #include "d/dolzel_rel.h" #include "d/actor/d_a_e_zh.h" #include "d/actor/d_a_obj_carry.h" #include "d/d_com_inf_game.h" #include "d/d_s_play.h" #include "d/d_camera.h" #include "Z2AudioLib/Z2Instances.h" #include "d/d_debug_viewer.h" enum E_ZH_RES_File_ID { /* BCK */ /* 0x05 */ BCK_ZH_ACT01 = 0x5, /* 0x06 */ BCK_ZH_CATCH01, /* 0x07 */ BCK_ZH_CATCH02, /* 0x08 */ BCK_ZH_CATCHDAMAGE, /* 0x09 */ BCK_ZH_CATCHDROP, /* 0x0A */ BCK_ZH_CATCHMOVE, /* 0x0B */ BCK_ZH_OPEN, /* 0x0C */ BCK_ZH_PIYO2, /* 0x0D */ BCK_ZH_SERCH, /* 0x0E */ BCK_ZH_START, /* 0x0F */ BCK_ZH_WAIT01, /* 0x10 */ BCK_ZH_WAKEUP, /* BMDV */ /* 0x13 */ BMDV_ZH = 0x13, /* 0x14 */ BMDV_ZH_ENTRANCE, /* BTK */ /* 0x17 */ BTK_ZH_LOOP = 0x17, }; enum Action { /* 0x00 */ ACTION_EXECUTE_START_DEMO, /* 0x01 */ ACTION_EXECUTE_WAIT, /* 0x02 */ ACTION_EXECUTE_BALL_WAIT, /* 0x03 */ ACTION_EXECUTE_OPEN_START, /* 0x04 */ ACTION_EXECUTE_SEARCH_MOVE, /* 0x05 */ ACTION_EXECUTE_BG_HIT_SH_MOVE, /* 0x06 */ ACTION_EXECUTE_CATCH_MOVE, /* 0x07 */ ACTION_EXECUTE_CATCH_FLY_MOVE, /* 0x08 */ ACTION_EXECUTE_FLY_DELETE, /* 0x09 */ ACTION_EXECUTE_RETURN_DEMO, /* 0x0A */ ACTION_EXECUTE_DAMAGE, /* 0x0B */ ACTION_EXECUTE_DEAD_STOP, /* 0x0C */ UNK_ACTION }; enum Particle { /* 0x8A62 */ ZL2_HAHEN_1 = 0x8A62, /* 0x8A63 */ ZL2_SMOKE00_1, /* 0x8A64 */ ZL2_HAHEN_2, /* 0x8A65 */ ZL2_SMOKE00_2, /* 0x8A66 */ ZL2_HAHEN_3, /* 0x8A67 */ ZL2_SMOKE00_3, /* 0x8A68 */ ZL2_HAHEN_4, /* 0x8A69 */ ZL2_SMOKE00_4, /* 0x8A6A */ ZL2_SMOKE00_5, /* 0x8A6B */ ZL2_HAHEN_5, /* 0x8A6C */ ZL2_SMOKE00_6, /* 0x8A6D */ ZL2_RING_HALO02, /* 0x8A6E */ ZL2_KAITENGIRI128, /* 0x8A6F */ ZL2_SHOCK01, /* 0x8A70 */ ZL2_SMOKE00_7, }; /* 8082F440-8082F480 000020 0040+00 0/1 0/0 0/0 .data cc_zhSph_src__22@unnamed@d_a_e_zh_cpp@ */ namespace { static dCcD_SrcSph cc_zhSph_src = { { {0, {{AT_TYPE_0, 0, 0}, {0xD84860BA, 3}, 0x15}}, {dCcD_SE_METAL, 0, 0, 0, 0}, {dCcD_SE_METAL, 1, 0, 0, 3}, {0} }, { {{0.0f, 0.0f, 0.0f}, 40.0f}, } }; /* 8082F480-8082F4C4 000060 0044+00 0/1 0/0 0/0 .data cc_zhCyl_src__22@unnamed@d_a_e_zh_cpp@ */ static dCcD_SrcCyl cc_zhCyl_src = { { {0, {{AT_TYPE_0, 0, 0}, {0xD84860BA, 3}, 0x15}}, {dCcD_SE_METAL, 0, 0, 0, 0}, {dCcD_SE_METAL, 1, 0, 0, 3}, {0} }, { {0.0f, 0.0f, 0.0f}, 50.0f, 300.0f, } }; /* 8082F4C4-8082F508 0000A4 0044+00 0/1 0/0 0/0 .data cc_zhCyl_at_src__22@unnamed@d_a_e_zh_cpp@ */ static dCcD_SrcCyl cc_zhCyl_at_src = { { {0, {{AT_TYPE_CSTATUE_SWING, 4, 0xD}, {0, 0}, 0}}, {dCcD_SE_METAL, 0, 2, 0, 0}, {dCcD_SE_NONE, 1, 0, 0, 2}, {0}, }, { {0.0f, 0.0f, 0.0f}, 50.0f, 300.0f, } }; } /* 8082902C-8082907C 0000EC 0050+00 1/1 0/0 0/0 .text __ct__12daE_ZH_HIO_cFv */ daE_ZH_HIO_c::daE_ZH_HIO_c() { field_0x4 = -1; model_size = 1.0f; ascent_rate = 10.0f; wandering_area = 500.0f; wait_time = 100; piyori_time = 300; dungeon_bit_check = 0; } /* 8082F725 0003+00 data_8082F725 None */ static u8 l_initHIO; /* 8082F734-8082F750 000054 001C+00 8/9 0/0 0/0 .bss l_HIO */ static daE_ZH_HIO_c l_HIO; /* 8082F750-8082F754 000070 0004+00 4/5 0/0 0/0 .bss mStartFlag */ static int mStartFlag; /* 8082907C-8082934C 00013C 02D0+00 1/1 0/0 0/0 .text draw__8daE_ZH_cFv */ int daE_ZH_c::draw() { GXColor i_color, i_color2; if (WREG_S(0) != 0) { cXyz i_pos = home.pos; i_color.r = 0x82; i_color.g = 0x82; i_color.b = 0xFF; i_color.a = 0xFA; if (arg0 == 2) { i_pos.y += 10.0f; dDbVw_drawCircleXlu(i_pos, field_0x778, i_color, 1, 12); } if (mActionMode == ACTION_EXECUTE_BG_HIT_SH_MOVE && (field_0x6bc.x || field_0x6bc.y || field_0x6bc.z)) { i_color2.r = 0x1E; i_color2.g = 0x46; i_color2.b = 0x9B; i_color2.a = 0xFA; dDbVw_drawCircleXlu(field_0x6bc, l_HIO.wandering_area, i_color2, 1, 12); } if (mS_Ball != NULL) { i_color.r = 0x82; i_color.g = 0x82; i_color.b = 0xFF; i_color.a = 0xFA; i_pos.set(mS_Ball->current.pos); i_pos.y += 50.0f; for (int i = 0; i < 8; i++) { if (field_0x6f8[i].x || field_0x6f8[i].z) { i_color.r = (u8)i * 20 + 100; if (i > 3) { i_color.b = (u8)i * 20 + 100; } i_color.a = field_0x758[i]; dDbVw_drawLineXlu(i_pos, field_0x6f8[i], i_color, 1, 12); } } } if (WREG_S(1) != 0) { i_color.r = 0x82; i_color.g = 0x82; i_color.b = 0xFF; i_color.a = 0xFA; dDbVw_drawLineXlu(current.pos, field_0x680, i_color, 1, 12); } if (WREG_S(2) != 0) { i_color.r = 0xFA; i_color.g = 0x82; i_color.b = 0x82; i_color.a = 0xFA; i_pos.set(current.pos); i_pos.y += 10.0f; dDbVw_drawLineXlu(i_pos, field_0x68c, i_color, 1, 12); } if (WREG_S(3) != 0) { i_color.r = 0x7D; i_color.g = 0xFF; i_color.b = 0x7D; i_color.a = 0xFA; if (mRetrunStartLine.x || mRetrunStartLine.z) { dDbVw_drawLineXlu(mRetrunStartLine, mRetrunEndLine, i_color, 1, 12); } } if (WREG_S(4) != 0 && mS_Ball != NULL) { cXyz i_end = mS_Ball->current.pos + mBallHosei; i_color.r = 0xFF; i_color.g = 0x14; i_color.b = 0x14; i_color.a = 0xFA; for (int i = 0; i < 3; i++) { dDbVw_drawLineXlu(field_0x6c8[i], i_end, i_color, 1, 12); } } } J3DModelData* modelData; J3DMaterial* matNodeP; if (arg0 == 2) { return 1; } if (field_0x7ae != 0) { return 1; } #ifdef DEBUG mBgc.DrawWall(dComIfG_Bgsp()); #endif if (arg0 == 1) { g_env_light.settingTevStruct(8, ¤t.pos, &tevStr); g_env_light.setLightTevColorType_MAJI(mEntranceModel, &tevStr); modelData = mEntranceModel->getModelData(); for (u16 i = 0; i < modelData->getMaterialNum(); i++) { matNodeP = modelData->getMaterialNodePointer(i); if (matNodeP != NULL) { matNodeP->getTevKColor(3)->a = field_0x77c; } } mDoExt_modelUpdateDL(mEntranceModel); if (mStartFlag == 0) { return 1; } } if ((mActionMode == ACTION_EXECUTE_BALL_WAIT && mMoveMode < 2) || (mActionMode == ACTION_EXECUTE_DEAD_STOP && mMoveMode == 10)) { return 1; } J3DModel* model = mpModelMorf->getModel(); g_env_light.settingTevStruct(8, ¤t.pos, &tevStr); g_env_light.setLightTevColorType_MAJI(model, &tevStr); modelData = model->getModelData(); for (u16 i = 0; i < modelData->getMaterialNum(); i++) { matNodeP = modelData->getMaterialNodePointer(i); if (matNodeP != NULL) { matNodeP->getTevColor(1)->r = (int)field_0x764[0] & 0xFF; matNodeP->getTevColor(1)->g = (int)field_0x764[1] & 0xFF; matNodeP->getTevColor(1)->b = (int)field_0x764[2] & 0xFF; } } mpBtkAnm->entry(model->getModelData()); fopAcM_setEffectMtx(this, model->getModelData()); mpModelMorf->entryDL(); cXyz sp68; sp68.set(current.pos.x, current.pos.y + 10.0f, current.pos.z); mShadowKey = dComIfGd_setShadow(mShadowKey, 0, model, &sp68, BREG_F(18) + 1200.0f, BREG_F(19) + 0.0f, current.pos.y, mBgc.GetGroundH(), mBgc.m_gnd, &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); return 1; } /* 80829388-808293A8 000448 0020+00 1/0 0/0 0/0 .text daE_ZH_Draw__FP8daE_ZH_c */ static int daE_ZH_Draw(daE_ZH_c* i_this) { return i_this->draw(); } /* 808293A8-80829454 000468 00AC+00 10/10 0/0 0/0 .text setBck__8daE_ZH_cFiUcff */ void daE_ZH_c::setBck(int i_anm, u8 i_attr, f32 i_morf, f32 i_rate) { mpModelMorf->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("E_ZH", i_anm), i_attr, i_morf, i_rate, 0.0f, -1.0f); mAnm = i_anm; } /* 80829454-80829460 000514 000C+00 14/14 0/0 0/0 .text setActionMode__8daE_ZH_cFii */ void daE_ZH_c::setActionMode(int i_action, int i_mode) { mActionMode = i_action; mMoveMode = i_mode; } /* 80829460-80829500 000520 00A0+00 3/3 0/0 0/0 .text s_BallSearch__FPvPv */ static void* s_BallSearch(void* i_actor, void* i_data) { if (fopAcM_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_Obj_Carry && ((daObjCarry_c*)i_actor)->prm_chk_type_lightball() && ((((daE_ZH_c*)i_data)->bitSw == 16 && ((daObjCarry_c*)i_actor)->getType() == 8) || (((daE_ZH_c*)i_data)->bitSw == 17 && ((daObjCarry_c*)i_actor)->getType() == 9))) { return i_actor; } return NULL; } /* 80829500-80829570 0005C0 0070+00 2/2 0/0 0/0 .text s_BallSearch_Tag__FPvPv */ static void* s_BallSearch_Tag(void* i_actor, void* i_data) { if (fopAcM_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_Obj_Carry && ((daObjCarry_c*)i_actor)->prm_chk_type_lightball()) { return i_actor; } return NULL; } /* 80829570-80829658 000630 00E8+00 4/4 0/0 0/0 .text startDemoCheck__8daE_ZH_cFv */ bool daE_ZH_c::startDemoCheck() { camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); camera_class* camera2 = dComIfGp_getCamera(0); if (!eventInfo.checkCommandDemoAccrpt()) { fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 0); eventInfo.onCondition(dEvtCnd_CANDEMO_e); mDemoCamEye = camera2->lookat.eye; mDemoCamCenter = camera2->lookat.center; return false; } camera->mCamera.Stop(); camera->mCamera.SetTrimSize(3); daPy_getPlayerActorClass()->changeOriginalDemo(); return true; } /* 80829658-808298BC 000718 0264+00 2/2 0/0 0/0 .text mBallBGCheck__8daE_ZH_cFv */ void daE_ZH_c::mBallBGCheck() { // NONMATCHING mBallHosei.zero(); if (mS_Ball != NULL) { s16 sVar1 = 0; cXyz spa4, spb0, start; dBgS_LinChk lin_chk; start.set(mS_Ball->current.pos); start.y += 50.0f; for (int i = 0; i < 8; i++) { cMtx_YrotS(*calc_mtx, sVar1); spa4.x = 0.0f; spa4.y = 100.0f; spa4.z = BREG_F(10) + 180.0f; MtxPosition(&spa4, &spb0); field_0x6f8[i] = spb0 + mS_Ball->current.pos; lin_chk.Set(&start, &field_0x6f8[i], this); if (dComIfG_Bgsp().LineCross(&lin_chk)) { field_0x758[i] ^= 0xFF; cMtx_YrotS(*calc_mtx, sVar1 + 0x8000); spa4.x = 0.0f; spa4.y = 100.0f; spa4.z = BREG_F(10) + 180.0f; MtxPosition(&spa4, &spb0); if (fabsf(mBallHosei.x) < fabsf(spb0.x)) { mBallHosei.x = spb0.x; } if (fabsf(mBallHosei.z) < fabsf(spb0.z)) { mBallHosei.z = spb0.z; } } else { field_0x758[i] = 0xFF; } if (i != 3) { sVar1 += 0x4000; } else if (i == 3) { if (mBallHosei.x || mBallHosei.z) { return; } sVar1 = 0x2000; } } } } /* 808298BC-808299F8 00097C 013C+00 3/3 0/0 0/0 .text mGateOpen__8daE_ZH_cFv */ void daE_ZH_c::mGateOpen() { // NONMATCHING switch (field_0x794[2]) { case 0: field_0x77c = 0.0f; mSound.startCreatureSound(Z2SE_EN_ZH_MV_WALL, 0, -1); field_0x794[2]++; // fallthrough case 1: cLib_addCalc2(&field_0x77c, 255.0f, NREG_F(4) + 0.5f, NREG_F(5) + 10.0f); break; case 2: field_0x7a4 += NREG_F(6) + 5.0f; cLib_addCalc2(&field_0x77c, NREG_F(7) + 80.0f + (cM_ssin((s16)(field_0x7a4 << 8)) * 40.0f), NREG_F(4) + 0.5f, NREG_F(5) + 10.0f); break; case 3: cLib_addCalc0(&field_0x77c, NREG_F(4) + 0.5f, NREG_F(5) + 10.0f); break; } } /* 808299F8-80829AD8 000AB8 00E0+00 4/4 0/0 0/0 .text mColorSet__8daE_ZH_cFbff */ bool daE_ZH_c::mColorSet(bool param_1, f32 param_2, f32 param_3) { bool rv; if (!param_1) { cLib_addCalc0(&field_0x764[0], 0.8f, param_2); cLib_addCalc0(&field_0x764[2], 0.8f, param_3); return field_0x764[0] < 1.0f; } cLib_addCalc2(&field_0x764[0], 255.0f, 0.8f, param_2); cLib_addCalc2(&field_0x764[2], 50.0f, 0.8f, param_3); if (field_0x764[0] > 253.0f) { field_0x764[0] = 255.0f; field_0x764[2] = 50.0f; return true; } return false; } /* 80829AD8-80829E44 000B98 036C+00 2/2 0/0 0/0 .text mReturnLineMove__8daE_ZH_cFv */ bool daE_ZH_c::mReturnLineMove() { // NONMATCHING if (mS_Ball == NULL) { setActionMode(ACTION_EXECUTE_FLY_DELETE, 0); return false; } static cXyz mRoomLine_dt[6] = { cXyz(-3950.0f, -500.0f, 7612.0f), cXyz(-3950.0f, -725.0f, 253.0f), cXyz(3950.0f, -500.0f, 7442.0f), cXyz(3950.0f, -725.0f, 352.0f), cXyz(3950.0f, -725.0f, 352.0f), cXyz(3950.0f, -725.0f, 352.0f), }; u32 uVar1 = 0; cXyz sp2c; switch (fopAcM_GetRoomNo(this)) { case 1: break; case 2: uVar1 = 1; break; case 4: uVar1 = 2; break; case 5: uVar1 = 3; break; } if (arg0 == 0) { mRetrunEndLine.set(home.pos); mRetrunStartLine.set(0.0f, 0.0f, -800.0f); } else { mRetrunEndLine.set(mRoomLine_dt[uVar1]); mRetrunEndLine.z = mRoomLine_dt[uVar1 ^ 1].z; mRetrunStartLine.set(mRoomLine_dt[uVar1]); } mRetrunStartLine.y = current.pos.y; cLib_addCalc2(¤t.pos.x, mRetrunStartLine.x, 0.7f, 5.0f); sp2c = mRetrunStartLine - current.pos; sp2c.z = 0.0f; cLib_addCalcAngleS2(&mRollAngle, 0x400, 8, 0x40); cLib_addCalcAngleS2(¤t.angle.y, (s16)sp2c.atan2sX_Z(), 8, mRollAngle); cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, 8, mRollAngle); if (fabsf(current.pos.x - mRetrunStartLine.x) < 20.0f) { return true; } return false; } /* 80829E44-8082A01C 000F04 01D8+00 2/2 0/0 0/0 .text mBallBgLineCheck__8daE_ZH_cFv */ bool daE_ZH_c::mBallBgLineCheck() { dBgS_LinChk lin_chk; cXyz sp9c, end; s16 sVar1 = end.atan2sX_Z(); s16 sVar2 = 0; int iVar1 = 0; for (int i = 0; i < 3; i++) { cMtx_YrotS(*calc_mtx, sVar1 + sVar2); sp9c.x = 0.0f; sp9c.y = 100.0f; sp9c.z = BREG_F(12) + 170.0f; MtxPosition(&sp9c, &field_0x6c8[i]); field_0x6c8[i] += current.pos; end.set(current.pos); if (mS_Ball != NULL) { end = mS_Ball->current.pos + mBallHosei; } end.y += 100.0f; lin_chk.Set(&field_0x6c8[i], &end, this); field_0x6ec[iVar1] = 0; if (dComIfG_Bgsp().LineCross(&lin_chk)) { field_0x6ec[iVar1] = 1; iVar1++; } if (i != 0) { sVar2 = -0x4000; } else { sVar2 = 0x4000; } } if (iVar1 != 0) { return true; } return false; } /* 8082A01C-8082A390 0010DC 0374+00 2/2 0/0 0/0 .text mSearchMove__8daE_ZH_cFUc */ bool daE_ZH_c::mSearchMove(u8 param_1) { if (mS_Ball == NULL) { setActionMode(ACTION_EXECUTE_FLY_DELETE, 0); return NULL; } cXyz sp50, sp5c; bool rv = false; mBallBGCheck(); if (param_1 != 0 || (!mBallHosei.x && !mBallHosei.z)) { cMtx_YrotS(*calc_mtx, current.angle.y); sp50.x = 0.0f; sp50.y = 0.0f; sp50.z = field_0x774; MtxPosition(&sp50, &sp5c); if (param_1 == 0) { sp5c += mS_Ball->current.pos; if (mBgc.GetGroundH() != -1000000000.0f && mBgc.GetGroundH() > mS_Ball->current.pos.y) { sp5c.y = mBgc.GetGroundH(); } } else { sp5c += home.pos; if (param_1 == 2) { sp5c.y -= 600.0f; } } } else if (mBallHosei.x || mBallHosei.z) { sp5c = mS_Ball->current.pos + mBallHosei; } sp5c.y = current.pos.y; f32 suu = cLib_addCalcPos(¤t.pos, sp5c, 0.7f, 5.0f, 1.0f); sp50 = sp5c - current.pos; cLib_addCalcAngleS2(&mRollAngle, BREG_S(5) + 0x400, 8, BREG_S(6) + 0x40); if (mBallHosei.x || mBallHosei.z) { field_0x7af = 1; } else { field_0x7af = 0; } s16 angle; if (param_1 == 0) { angle = fopAcM_searchActorAngleY(this, mS_Ball); Z2GetAudioMgr()->changeBgmStatus(suu + 100.0f); } else { angle = (s16)sp50.atan2sX_Z(); Z2GetAudioMgr()->changeBgmStatus(99); } cLib_addCalcAngleS2(&shape_angle.y, angle, 8, mRollAngle); current.angle.y = shape_angle.y; if (NREG_S(0) != 0) { OS_REPORT("suu %f\n", suu); OS_REPORT("angle %x\n", angle); OS_REPORT("mRollAngle %x\n", mRollAngle); OS_REPORT("mBallHosei.x %f\n", mBallHosei.x); OS_REPORT("mBallHosei.z %f\n", mBallHosei.z); OS_REPORT("アングル %x\n", abs((s16)(shape_angle.y - angle))); // Angle %x\n OS_REPORT("\n"); } if (param_1 != 1) { if (suu <= BREG_F(13) + 8.0f && abs((s16)(shape_angle.y - angle)) < 0x1000) { rv = true; } } else if (suu <= BREG_F(14) + 100.0f && abs((s16)(shape_angle.y - angle)) < 0x2000) { rv = true; } if (mBallBgLineCheck()) { if (mBgc.ChkWallHit() && mActionMode != ACTION_EXECUTE_CATCH_FLY_MOVE) { mRollAngle = 0; setActionMode(ACTION_EXECUTE_BG_HIT_SH_MOVE, 0); rv = false; } } else if (mBgc.ChkWallHit() && suu <= BREG_F(15) + 170.0f) { field_0x7af = 1; rv = true; } return rv; } struct eff_dt { /* 0x0 */ u16 field_0x0; /* 0x2 */ s16 field_0x2; /* 0x4 */ int field_0x4; }; /* 8082A390-8082A4C8 001450 0138+00 1/1 0/0 0/0 .text mStartParticleSet__8daE_ZH_cFv */ void daE_ZH_c::mStartParticleSet() { static eff_dt const START_EFF_DT[11] = { {ZL2_HAHEN_1, 0, 7}, {ZL2_SMOKE00_1, 0, 7}, {ZL2_HAHEN_2, 0, 9}, {ZL2_SMOKE00_2, 0, 9}, {ZL2_HAHEN_3, 0, 16}, {ZL2_SMOKE00_3, 0, 16}, {ZL2_HAHEN_4, 0, 4}, {ZL2_SMOKE00_4, 0, 4}, {ZL2_SMOKE00_5, 0, 5}, {ZL2_HAHEN_5, 0, 5}, {ZL2_SMOKE00_6, 0, 5}, }; for (int i = 0; i < 11; i++) { JPABaseEmitter* emitter = dComIfGp_particle_set(START_EFF_DT[i].field_0x0, ¤t.pos, NULL, NULL); if (emitter != NULL) { emitter->setGlobalSRTMatrix(mpModelMorf->getModel()->getAnmMtx(START_EFF_DT[i].field_0x4)); } } fopAcM_OnStatus(this, 0); attention_info.flags |= 4; mSound.startCreatureSound(Z2SE_EN_ZH_START, 0, -1); setBck(BCK_ZH_START, 0, 3.0f, 1.0f); } /* 8082A4C8-8082A534 001588 006C+00 1/1 0/0 0/0 .text mCutTypeCheck__8daE_ZH_cFv */ bool daE_ZH_c::mCutTypeCheck() { daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); if (player->getCutType() == daPy_py_c::CUT_TYPE_LARGE_JUMP || player->getCutType() == daPy_py_c::CUT_TYPE_LARGE_JUMP_FINISH || player->getCutType() == daPy_py_c::CUT_TYPE_LARGE_TURN_LEFT || player->getCutType() == daPy_py_c::CUT_TYPE_LARGE_TURN_RIGHT || player->getCutType() == daPy_py_c::CUT_TYPE_MORTAL_DRAW_A || player->getCutType() == daPy_py_c::CUT_TYPE_MORTAL_DRAW_B) { return true; } if (player->getCutType() == daPy_py_c::CUT_TYPE_HEAD_JUMP || player->getCutType() == daPy_py_c::CUT_TYPE_TWIRL) { return true; } return false; } /* 8082A534-8082A88C 0015F4 0358+00 1/1 0/0 0/0 .text damage_check__8daE_ZH_cFv */ void daE_ZH_c::damage_check() { if (field_0x7a8 != 0 || mActionMode == ACTION_EXECUTE_BALL_WAIT || mActionMode == ACTION_EXECUTE_RETURN_DEMO) { return; } if ((l_HIO.dungeon_bit_check == 0 && strcmp(dComIfGp_getStartStageName(), "T_ENE02") != 0 && ((bitSw == 16 && !fopAcM_isSwitch(this, 20)) || (bitSw == 17 && !fopAcM_isSwitch(this, 21))))) { return; } if (field_0xa08.ChkTgHit() || field_0xb40.ChkTgHit()) { csXyz local_28; cXyz sp20; field_0x7a8 = 8; if (field_0xa08.ChkTgHit()) { mAtInfo.mpCollider = field_0xa08.GetTgHitObj(); sp20.set(*field_0xa08.GetTgHitPosP()); } else { mAtInfo.mpCollider = field_0xb40.GetTgHitObj(); sp20.set(*field_0xb40.GetTgHitPosP()); } local_28.x = 0; local_28.y = sp20.atan2sX_Z(); local_28.z = 0; if (mActionMode != ACTION_EXECUTE_DEAD_STOP && mActionMode != ACTION_EXECUTE_DAMAGE && mActionMode != ACTION_EXECUTE_OPEN_START && !mAtInfo.mpCollider->ChkAtType(AT_TYPE_SLINGSHOT) && mAnm != BCK_ZH_OPEN && mAnm != BCK_ZH_START) { dComIfGp_setHitMark(1, this, &sp20, &local_28, NULL, 0); cc_at_check(this, &mAtInfo); health = 1000; field_0x560 = 1000; field_0xa08.ClrTgHit(); field_0xb40.ClrTgHit(); if (mActionMode == ACTION_EXECUTE_WAIT) { setActionMode(ACTION_EXECUTE_OPEN_START, 0); } else { if (mCutTypeCheck()) { field_0x78c = 2; } dComIfGs_offOneZoneSwitch(5, fopAcM_GetRoomNo(this)); if (mS_Ball != NULL) { mS_Ball->offCarryHookOK(); } setActionMode(ACTION_EXECUTE_DAMAGE, 0); } } else { dCcD_GObjInf* tgHitObj; if (!field_0xa08.ChkTgHit()) { tgHitObj = (dCcD_GObjInf*)field_0xb40.GetTgHitObj(); } else { tgHitObj = (dCcD_GObjInf*)field_0xa08.GetTgHitObj(); } dComIfGp_setHitMark(2, this, &sp20, &local_28, NULL, 0); if (!mAtInfo.mpCollider->ChkAtType(AT_TYPE_SLINGSHOT)) { mSound.startCollisionSE(tgHitObj->getHitSeID(tgHitObj->GetAtSe(), 0), 0x28); } else { mSound.startCollisionSE(Z2SE_HIT_PACHINKO, 0x2D); } } } mStts.Move(); } /* 8082A88C-8082ABDC 00194C 0350+00 1/1 0/0 0/0 .text executeStartDemo__8daE_ZH_cFv */ void daE_ZH_c::executeStartDemo() { camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); cXyz sp48; f32 fVar1, fVar2; switch (mMoveMode) { case 0: if (startDemoCheck()) { dComIfGp_getEvent().startCheckSkipEdge(this); mDemoCamCenter.set(-30.0f, 650.0f, 1955.0f); mDemoCamEye.set(-25.0f, 720.0f, 2330.0f); field_0x794[0] = 60; mMoveMode++; } break; case 1: if (field_0x794[0] != 0) { if (field_0x794[0] == 30) { mDemoCamCenter.set(-25.0f, 435.0f, -3355.0f); mDemoCamEye.set(-30.0f, 505.0f, -3140.0f); } break; } sp48.set(-10.0f, 280.0f, -3835.0f); fVar1 = cLib_addCalcPos(&mDemoCamCenter, sp48, 0.7f, ZREG_F(10) + 10.0f, ZREG_F(11) + 2.0f); sp48.set(-15.0f, 350.0f, -3620.0f); fVar2 = cLib_addCalcPos(&mDemoCamEye, sp48, 0.7f, ZREG_F(10) + 10.0f, ZREG_F(11) + 2.0f); if (fVar1 > 4.0f || fVar2 > 4.0f) { break; } field_0x794[0] = 30; mMoveMode++; // fallthrough case 2: if (field_0x794[0] == 0) { mDemoCamCenter.set(-5.0f, 590.0f, 2130.0f); mDemoCamEye.set(-10.0f, 680.0f, 2340.0f); camera->mCamera.Reset(mDemoCamCenter, mDemoCamEye); camera->mCamera.Start(); camera->mCamera.SetTrimSize(0); dComIfGp_event_reset(); fopAcM_onSwitch(this, 0x12); fopAcM_OffStatus(this , fopAcM_STATUS_UNK_004000); setActionMode(ACTION_EXECUTE_WAIT, 1); } break; } if (mMoveMode != 0 && mActionMode != ACTION_EXECUTE_WAIT) { if (dComIfGp_getEvent().checkSkipEdge()) { fopAcM_onSwitch(this, 0x12); dStage_changeScene(2, 0.0f, 0, fopAcM_GetRoomNo(this), 0, -1); } } if (mMoveMode != 0) { camera->mCamera.Set(mDemoCamCenter, mDemoCamEye); } } /* 8082ABDC-8082ACA8 001C9C 00CC+00 1/1 0/0 0/0 .text executeWait__8daE_ZH_cFv */ void daE_ZH_c::executeWait() { if (mS_Ball != NULL) { mS_Ball->current.pos.set(field_0x668); } switch (mMoveMode) { case 0: attention_info.distances[2] = 3; fopAcM_OnStatus(this, 0); attention_info.flags |= 4; setBck(BCK_ZH_WAIT01, 0, 3.0f, 1.0f); field_0x78c = 0; mMoveMode = 1; break; case 1: break; } cLib_addCalcPos(¤t.pos, home.pos, 0.7f, 5.0f, 1.0f); } /* 8082ACA8-8082B284 001D68 05DC+00 2/1 0/0 0/0 .text executeBallWait__8daE_ZH_cFv */ void daE_ZH_c::executeBallWait() { dBgS_LinChk lin_chk; camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); cXyz spa4, spb0; switch (mMoveMode) { case 0: cMtx_YrotS(*calc_mtx, shape_angle.y); spa4.x = 0.0f; spa4.y = 0.0f; spa4.z = WREG_F(1) + 2000.0f; MtxPosition(&spa4, &spb0); field_0x680 = spb0 + current.pos; lin_chk.OnBackFlag(); lin_chk.Set(¤t.pos, &field_0x680, this); if (dComIfG_Bgsp().LineCross(&lin_chk)) { cMtx_YrotS(*calc_mtx, shape_angle.y); spa4.x = 0.0f; spa4.y = 0.0f; spa4.z = WREG_F(2) + 5.0f; MtxPosition(&spa4, &spb0); field_0x68c = lin_chk.GetCross() + spb0; cMtx_YrotS(*calc_mtx, shape_angle.y); spa4.x = 0.0f; spa4.y = 0.0f; spa4.z = -(WREG_F(3) + 300.0f); MtxPosition(&spa4, &spb0); current.pos = lin_chk.GetCross() + spb0; home.pos.x = current.pos.x; home.pos.z = current.pos.z; } setBck(BCK_ZH_SERCH, 2, 20.0f, 1.0f); mMoveMode++; break; case 1: if (bitSw != 0xFF && fopAcM_isSwitch(this, bitSw) && mStartFlag != 0) { fopAcM_OnStatus(this, 0); attention_info.flags |= 4; attention_info.distances[2] = 3; mMoveMode = 10; } break; case 2: mGateOpen(); mSound.startCreatureSoundLevel(Z2SE_EN_ZH_MV, 0, -1); if (field_0x77c < 254.0f) break; mMoveMode = 20; break; case 10: if (!startDemoCheck()) break; field_0x794[0] = 20; mMoveMode++; // fallthrough case 11: mSound.startCreatureSoundLevel(Z2SE_EN_ZH_MV, 0, -1); if (field_0x794[0] != 0 || field_0x77c < 254.0f) { break; } dCam_getBody()->StartBlure(100, this, 0.8f, 1.4f); dComIfGp_getEvent().startCheckSkipEdge(this); mMoveMode++; // fallthrough case 12: if (dComIfGp_getEvent().checkSkipEdge()) { dCam_getBody()->ResetBlure(); field_0x794[2] = 2; camera->mCamera.Start(); camera->mCamera.SetTrimSize(0); dComIfGp_event_reset(); mMoveMode = 20; } // fallthrough case 20: mSound.startCreatureSoundLevel(Z2SE_EN_ZH_MV, 0, -1); cMtx_YrotS(*calc_mtx, shape_angle.y); spa4.x = 0.0f; spa4.y = 0.0f; spa4.z = WREG_F(3) + 200.0f; MtxPosition(&spa4, &spb0); spb0 += field_0x68c; if (cLib_addCalcPos(¤t.pos, spb0, 0.8f, WREG_F(4) + 3.0f, WREG_F(5) + 1.0f) <= WREG_F(6) + 20.0f) { if (mMoveMode == 20) { field_0x794[2] = 2; setActionMode(ACTION_EXECUTE_SEARCH_MOVE, 0); } else { field_0x794[2] = 2; camera->mCamera.Start(); camera->mCamera.SetTrimSize(0); dComIfGp_event_reset(); setActionMode(ACTION_EXECUTE_SEARCH_MOVE, 0); } } break; } if (mMoveMode >= 11 && mMoveMode <= 12 || mMoveMode == 20) { mGateOpen(); } if (mMoveMode == 11) { cMtx_YrotS(*calc_mtx, shape_angle.y); spa4.x = ZREG_F(0); spa4.y = ZREG_F(1) + 20.0f; spa4.z = ZREG_F(2); MtxPosition(&spa4, &spb0); spb0 += field_0x68c; mDemoCamCenter.set(spb0); cMtx_YrotS(*calc_mtx, shape_angle.y); spa4.x = ZREG_F(3) + -200.0f; spa4.y = ZREG_F(4) + -200.0f; spa4.z = ZREG_F(5) + 600.0f; MtxPosition(&spa4, &spb0); spb0 += field_0x68c; mDemoCamEye.set(spb0); camera->mCamera.Set(mDemoCamCenter, mDemoCamEye, 62.0f, 0); } } /* 8082B284-8082B820 002344 059C+00 2/1 0/0 0/0 .text executeOpenStart__8daE_ZH_cFv */ void daE_ZH_c::executeOpenStart() { camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); cXyz sp28, sp34; field_0xb40.OnCoSPrmBit(0x40); switch (mMoveMode) { case 0: setBck(BCK_ZH_OPEN, 0, 3.0f, 1.0f); if (mS_Ball != NULL) { fopAcM_cancelCarryNow(mS_Ball); if (bitSw != 0xFF) { fopAcM_onSwitch(this, bitSw); } } else { setActionMode(ACTION_EXECUTE_FLY_DELETE, 0); break; } field_0x794[0] = BREG_S(8) + 6 & 0xFF; mMoveMode = 1; break; case 1: if (!mpModelMorf->isStop()) { if (field_0x794[0] != 0) { mColorSet(true, 42.5f, 8.333333f); break; } mColorSet(false, 42.5f, 8.333333f); break; } if (mStartFlag == 0 && ((fopAcM_GetRoomNo(this) == 51 && !fopAcM_isSwitch(this, 0x5A)) || fopAcM_GetRoomNo(this) == 52 && !fopAcM_isSwitch(this, 0x5B))) { mMoveMode = 10; break; } field_0x794[0] = l_HIO.wait_time & 0xFF; mMoveMode = 2; // fallthrough case 2: if (field_0x794[0] == 0 && mColorSet(true, 10.0f, 10.0f)) { mStartParticleSet(); mMoveMode = 3; } break; case 3: if (mpModelMorf->isStop()) { setActionMode(ACTION_EXECUTE_SEARCH_MOVE, 0); } break; case 10: if (mStartFlag == 0) { break; } if (!startDemoCheck()) { break; } if (fopAcM_GetRoomNo(this) == 51) { fopAcM_onSwitch(this, 0x5A); } else { fopAcM_onSwitch(this, 0x5B); } mStartFlag = 2; field_0x794[0] = 20; mMoveMode++; // fallthrough case 11: mDemoCamCenter.set(-60.0f, 180.0f, -3875.0f); mDemoCamEye.set(-250.0f, 50.0f, -3515.0f); camera->mCamera.Set(mDemoCamCenter, mDemoCamEye, 40.0f, 0); if (field_0x794[0] == 0) { mMoveMode++; } break; case 12: if (mColorSet(true, 10.0f, 10.0f)) { mStartParticleSet(); mMoveMode++; } break; case 13: if ((int)mpModelMorf->getFrame() < 84) { break; } if ((int)mpModelMorf->getFrame() == 84) { dCam_getBody()->StartBlure(50, this, 0.8f, 1.2f); } mDemoCamCenter.set(-60.0f, 180.0f, -3875.0f); sp34.set(-280.0f, 30.0f, -3460.0f); cLib_addCalcPos(&mDemoCamEye, sp34, 0.7f, 30.0f, 10.0f); camera->mCamera.Set(mDemoCamCenter, mDemoCamEye, 40.0f, 0); if (!mpModelMorf->isStop()) { break; } #ifdef DEBUG if (ZREG_S(0) == 0) { break; } #endif field_0x794[0] = 20; mMoveMode++; // fallthrough case 14: if (field_0x794[0] != 0) { break; } field_0x794[0] = 50; mMoveMode++; // fallthrough case 15: sp34.y = mS_Ball->current.pos.y + 600.0f; if (mBgc.GetGroundH() != -1000000000.0f) { sp34.y = mBgc.GetGroundH() + 600.0f; } cLib_addCalc2(¤t.pos.y, sp34.y, 0.7f, 10.0f); mSound.startCreatureSoundLevel(Z2SE_EN_ZH_MV, 0, -1); if (field_0x794[0] != 0) { break; } mMoveMode++; // fallthrough case 16: camera->mCamera.Start(); camera->mCamera.SetTrimSize(0); dComIfGp_event_reset(); setActionMode(ACTION_EXECUTE_SEARCH_MOVE, 0); break; } } /* 8082B820-8082BA18 0028E0 01F8+00 1/1 0/0 0/0 .text executeSearchMove__8daE_ZH_cFv */ void daE_ZH_c::executeSearchMove() { if (mS_Ball == NULL) { setActionMode(ACTION_EXECUTE_FLY_DELETE, 0); return; } cXyz ato; ato.y = mS_Ball->current.pos.y + 600.0f; if (mBgc.GetGroundH() != -1000000000.0f && mBgc.GetGroundH() + 500.0f > ato.y) { ato.y = mBgc.GetGroundH() + 500.0f; } if (mBgc.GetRoofHeight() != 1000000000.0f && ato.y > mBgc.GetRoofHeight()) { ato.y = mBgc.GetRoofHeight() - 150.0f; } switch (mMoveMode) { case 0: cLib_addCalc2(¤t.pos.y, ato.y, 0.7f, 10.0f); if (XREG_S(0) != 0) { OS_REPORT("mBgc.GetRoofHeight() %f\n", mBgc.GetRoofHeight()); OS_REPORT("ato.y %f\n", ato.y); OS_REPORT("mBgc.ChkRoofHit() %d\n", mBgc.ChkRoofHit()); } if (fabsf(current.pos.y - ato.y) < 50.0f || mBgc.ChkRoofHit()) { if (mAnm != BCK_ZH_SERCH) { setBck(BCK_ZH_SERCH, 2, 20.0f, 1.0f); field_0x794[0] = 20; } mRollAngle = 0; field_0xb40.OffCoSPrmBit(0x40); field_0x774 = BREG_F(5) + -150.0f; mMoveMode = 1; } break; case 1: if (fabsf(current.pos.y - ato.y) > 20.0f) { cLib_addCalc2(¤t.pos.y, ato.y, 0.7f, 10.0f); } break; } mSound.startCreatureSoundLevel(Z2SE_EN_ZH_MV, 0, -1); if (mMoveMode != 0 && field_0x794[0] == 0 && mSearchMove(0)) { setActionMode(ACTION_EXECUTE_CATCH_MOVE, 0); } } /* 8082BA18-8082BE20 002AD8 0408+00 1/1 0/0 0/0 .text executeBgHitSHMove__8daE_ZH_cFv */ void daE_ZH_c::executeBgHitSHMove() { if (mS_Ball == NULL) { setActionMode(ACTION_EXECUTE_FLY_DELETE, 0); return; } dBgS_LinChk lin_chk; cXyz spa8, spb4, spc0; mBallBGCheck(); if (NREG_S(0) != 0) { OS_REPORT("mRetrunStartLine.x %f\n", mRetrunStartLine.x); OS_REPORT("mRetrunEndLine.x %f\n", mRetrunEndLine.x); OS_REPORT("mRetrunStartLine.z %f\n", mRetrunStartLine.z); OS_REPORT("mRetrunEndLine.z %f\n", mRetrunEndLine.z); OS_REPORT("\n"); } switch (mMoveMode) { case 0: field_0x6bc.zero(); if (!mReturnLineMove()) break; field_0x6bc.set(current.pos); mMoveMode++; // fallthrough case 1: field_0x794[0] = cM_rndF(100.0f) + 100.0f; spa8 = field_0x6bc - current.pos; if (spa8.abs() < l_HIO.wandering_area) { field_0x7b2 = shape_angle.y + cM_rndFX(16384.0f); } else { field_0x794[0] = 20; field_0x7b2 = spa8.atan2sX_Z(); } cMtx_YrotS(*calc_mtx, field_0x7b2); spb4.x = 0.0f; spb4.y = 0.0f; spb4.z = l_HIO.wandering_area - 50.0f; MtxPosition(&spb4, &spc0); spc0 += field_0x6bc; spb4 = spc0 - current.pos; field_0x7b2 = spb4.atan2sX_Z(); mRollAngle = 0; mMoveMode++; // fallthrough case 2: if (field_0x794[0] == 0) { mMoveMode = 1; } else { cLib_addCalcAngleS2(&mRollAngle, 0x400, 8, 0x40); cLib_addCalcAngleS2(¤t.angle.y, field_0x7b2, 8, mRollAngle); cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, 8, mRollAngle); if (abs((s16)(shape_angle.y - field_0x7b2)) <= 0x200) { cMtx_YrotS(*calc_mtx, shape_angle.y); spb4.x = 0.0f; spb4.y = 0.0f; spb4.z = l_HIO.wandering_area - 50.0f; MtxPosition(&spb4, &spc0); spc0 += field_0x6bc; cLib_addCalcPos(¤t.pos, spc0, 0.7f, 5.0f, 1.0f); } } break; } if (!mBallBgLineCheck()) { setActionMode(ACTION_EXECUTE_SEARCH_MOVE, 0); } } /* 8082BE20-8082C670 002EE0 0850+00 1/1 0/0 0/0 .text executeCatchMove__8daE_ZH_cFv */ void daE_ZH_c::executeCatchMove() { if (mS_Ball == NULL) { setActionMode(ACTION_EXECUTE_FLY_DELETE, 0); return; } cXyz sp3c, sp48; f32 fVar1 = 150.0f; sp48 = mS_Ball->current.pos - current.pos; sp48.y = 0.0f; f32 fVar2 = sp48.abs(); Z2GetAudioMgr()->changeBgmStatus(fVar2 + 100.0f); switch (mMoveMode) { case 0: field_0x794[0] = (int)JREG_S(1) + 11 & 0xFF; field_0x794[1] = (int)JREG_S(1) + 11 & 0xFF; field_0x7ad = (int)JREG_S(1) + 11; setBck(BCK_ZH_ACT01, 0, 3.0f, 1.0f); mSound.startCreatureSound(Z2SE_EN_ZH_ATK_PRE, 0, -1); mMoveMode++; break; case 1: if (!mpModelMorf->isStop()) { if (field_0x794[0] != 0) { mColorSet(false, 31.875f, 6.25f); if (field_0x794[0] == 1) { field_0x794[1] = field_0x7ad; } } else if (field_0x794[1] != 0) { mColorSet(true, 31.875f, 6.25f); if (field_0x794[1] == 1) { field_0x7ad -= 2; if (field_0x7ad < 2) { field_0x7ad = 2; } field_0x794[0] = field_0x7ad; } } } else { field_0x764[0] = 255.0f; field_0x764[2] = 50.0f; field_0x760 = 40.0f; setBck(BCK_ZH_CATCH01, 0, 3.0f, 1.0f); mSound.startCreatureSound(Z2SE_EN_ZH_ATK, 0, -1); mMoveMode++; } break; case 2: gravity = -5.0f; if (mBgc.GetGroundH() + 100.0f > current.pos.y) { mMoveMode++; } break; case 3: if (mAnm == BCK_ZH_CATCH02) { Z2GetAudioMgr()->changeBgmStatus(99); } if (mBgc.ChkGroundHit()) { gravity = 0.0f; speed.y = 0.0f; dComIfGp_getVibration().StartShock(5, 31, cXyz(0.0f, 1.0f, 0.0f)); cXyz sp54(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size); static u16 effId[4] = {ZL2_RING_HALO02, ZL2_KAITENGIRI128, ZL2_SHOCK01, ZL2_SMOKE00_7}; for (int i = 0; i < 3; i++) { field_0xddc[i] = dComIfGp_particle_set(field_0xddc[i], effId[i], &field_0x668, NULL, NULL); } field_0xde8 = dComIfGp_particle_setPolyColor(field_0xde8, effId[3], mBgc.m_gnd, &field_0x668, &tevStr, &shape_angle, &sp54, 0, NULL, -1, NULL); if (mAnm == BCK_ZH_CATCH02) { dComIfGs_onOneZoneSwitch(5, fopAcM_GetRoomNo(this)); mMoveMode++; } else { field_0x794[0] = 30; mMoveMode = 5; setBck(BCK_ZH_CATCH02, 0, 3.0f, 1.0f); mSound.startCreatureSound(Z2SE_EN_ZH_FALL, 0, -1); } } break; case 4: Z2GetAudioMgr()->changeBgmStatus(99); mS_Ball->current.pos.set(field_0x668); field_0x794[0] = 30; setActionMode(ACTION_EXECUTE_CATCH_FLY_MOVE, 0); break; case 5: if (field_0x794[0] == 0) { setBck(BCK_ZH_SERCH, 2, 10.0f, 1.0f); setActionMode(ACTION_EXECUTE_SEARCH_MOVE, 0); } break; } if (mMoveMode == 2 || mMoveMode == 3) { sp48 = eyePos; sp48.y = current.pos.y; sp3c = mS_Ball->current.pos - sp48; if (field_0x7af != 0) { fVar1 = 270.0f; } if (sp3c.abs() < fVar1) { if (mAnm != BCK_ZH_CATCH02 && fopAcM_checkCarryNow(mS_Ball)) { fopAcM_cancelCarryNow(mS_Ball); } else if (mAnm != BCK_ZH_CATCH02) { setBck(BCK_ZH_CATCH02, 0, 3.0f, 1.0f); mSound.startCreatureSound(Z2SE_EN_ZH_FALL, 0, -1); fopAcM_setCarryNow(mS_Ball, 0); Z2GetAudioMgr()->changeBgmStatus(99); if (bitSw != 0xFF && fopAcM_isSwitch(this, bitSw)) { fopAcM_offSwitch(this, bitSw); } } else { mS_Ball->current.pos.set(field_0x668); } } } } /* 8082C670-8082CD34 003730 06C4+00 2/1 0/0 0/0 .text executeCatchFlyMove__8daE_ZH_cFv */ void daE_ZH_c::executeCatchFlyMove() { if (mS_Ball == NULL) { setActionMode(ACTION_EXECUTE_FLY_DELETE, 0); return; } if (mS_Ball->checkRecover()) { dComIfGs_offOneZoneSwitch(5, fopAcM_GetRoomNo(this)); mS_Ball->offCarryHookOK(); field_0x78c = 2; setActionMode(ACTION_EXECUTE_DAMAGE, 0); return; } cXyz sp30, sp3c; if (mMoveMode != 5) { pmRoofPos = home.pos.y; if (arg0 == 0) { if (mBgc.GetGroundH() != -1000000000.0f) { pmRoofPos = mBgc.GetGroundH() + 600.0f; } else { pmRoofPos = home.pos.y + 600.0f; } } if (mBgc.GetRoofHeight() != 1000000000.0f && pmRoofPos > mBgc.GetRoofHeight()) { pmRoofPos = mBgc.GetRoofHeight() - 150.0f; } f32 fVar1 = l_HIO.ascent_rate; if (mMoveMode > 1) { fVar1 = l_HIO.ascent_rate * 0.1f; } cLib_addCalc2(¤t.pos.y, pmRoofPos, 0.7f, fVar1); } switch (mMoveMode) { case 0: mS_Ball->onCarryHookOK(); field_0xa08.SetTgType(0xd84820ba); field_0xb40.SetTgType(0xd84820ba); if (field_0x794[0] != 0) break; gravity = 0.0f; speed.y = 0.0f; setBck(BCK_ZH_CATCHMOVE, 2, 20.0f, 1.0f); mMoveMode++; // fallthrough case 1: if (XREG_S(0) != 0) { OS_REPORT("mBgc.GetRoofHeight() %f\n", mBgc.GetRoofHeight()); OS_REPORT("pmRoofPos %f\n", pmRoofPos); OS_REPORT("mBgc.ChkRoofHit() %d\n", mBgc.ChkRoofHit()); } if (current.pos.y >= pmRoofPos - 20.0f) { if (arg0 != 0) { mRollAngle = 0; field_0x794[0] = 20; mReturnLineMove(); mMoveMode = 10; } else { mRollAngle = 0; field_0x794[0] = 20; mMoveMode++; } } break; case 2: if (field_0x794[0] != 0 || !mReturnLineMove()) break; mMoveMode++; // fallthrough case 3: field_0x774 = BREG_F(7); if (mSearchMove(1)) { field_0x760 = 5.0f; setBck(BCK_ZH_OPEN, 0, 30.0f, -1.0f); mMoveMode++; } break; case 4: cMtx_YrotS(*calc_mtx, current.angle.y); sp30.x = 0.0f; sp30.y = 0.0f; sp30.z = field_0x774; MtxPosition(&sp30, &sp3c); sp3c += home.pos; cLib_addCalcPos(¤t.pos, sp3c, 0.8f, 10.0f, 5.0f); cLib_addCalcAngleS2(&shape_angle.y, home.angle.y, 4, BREG_S(5) + 0x400); current.angle.y = shape_angle.y; if (mBgc.ChkGroundHit()) { dComIfGp_getVibration().StartShock(5, 31, cXyz(0.0f, 1.0f, 0.0f)); field_0x760 = 0.0f; current.angle.y = home.angle.y; current.pos.set(home.pos); field_0x774 = BREG_F(5) + -150.0f; mSound.startCreatureSound(JA_SE_OBJ_BLOCK_FALL_NORMAL, 0, -1); mMoveMode++; } break; case 5: if (!mColorSet(false, 5.0f, 5.0f)) break; setActionMode(ACTION_EXECUTE_WAIT, 0); // fallthrough case 12: fopAcM_OffStatus(this, 0); attention_info.flags &= 0xFFFFFFFB; attention_info.distances[2] = 0; for (int i = 0; i < 3; i++) { field_0x764[i] = 0.0f; } dComIfGs_offOneZoneSwitch(5, fopAcM_GetRoomNo(this)); if (bitSw == 16) { /* dSv_event_flag_c::F_0311 - Palace of Twilight - Palace of Twilight use 1 */ dComIfGs_offEventBit(0x2640); /* dSv_event_flag_c::F_0313 - Palace of Twilight - Palace of Twilight use 3 */ dComIfGs_offEventBit(0x2610); /* dSv_event_flag_c::F_0315 - Palace of Twilight - Palace of Twilight use 5 */ dComIfGs_offEventBit(0x2604); /* dSv_event_flag_c::F_0317 - Palace of Twilight - Palace of Twilight use 7 */ dComIfGs_offEventBit(0x2601); /* dSv_event_flag_c::F_0319 - Palace of Twilight - Palace of Twilight use 9 */ dComIfGs_offEventBit(0x2740); } else { /* dSv_event_flag_c::F_0312 - Palace of Twilight - Palace of Twilight use 2 */ dComIfGs_offEventBit(0x2620); /* dSv_event_flag_c::F_0314 - Palace of Twilight - Palace of Twilight use 4 */ dComIfGs_offEventBit(0x2608); /* dSv_event_flag_c::F_0316 - Palace of Twilight - Palace of Twilight use 6 */ dComIfGs_offEventBit(0x2602); /* dSv_event_flag_c::F_0318 - Palace of Twilight - Palace of Twilight use 8 */ dComIfGs_offEventBit(0x2780); /* dSv_event_flag_c::F_0320 - Palace of Twilight - Palace of Twilight use 10 */ dComIfGs_offEventBit(0x2720); } field_0xa08.SetTgType(0xd84860ba); field_0xb40.SetTgType(0xd84860ba); mS_Ball->offCarryHookOK(); if (mMoveMode == 12) { fopAcM_delete(mS_Ball); setActionMode(ACTION_EXECUTE_DEAD_STOP, 10); } break; case 10: if (!mReturnLineMove()) break; mRollAngle = 0; mMoveMode++; // fallthrough case 11: field_0x774 = 0.0f; mSearchMove(2); sp3c = field_0x68c - current.pos; if (sp3c.abs() < 400.0f) { dComIfGs_onOneZoneSwitch(6, fopAcM_GetRoomNo(this)); dComIfGs_onSaveDunSwitch(0x28); setActionMode(ACTION_EXECUTE_RETURN_DEMO, 0); } } mS_Ball->current.pos.set(field_0x668); } /* 8082CD34-8082D154 003DF4 0420+00 1/1 0/0 0/0 .text executeReturnDemo__8daE_ZH_cFv */ void daE_ZH_c::executeReturnDemo() { camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); cXyz sp1c, sp28; s16 sVar1; switch (mMoveMode) { case 0: sVar1 = home.angle.y + 0x8000; current.angle.y = sVar1; shape_angle.y = sVar1; cMtx_YrotS(*calc_mtx, shape_angle.y + 0x8000); sp1c.x = ZREG_F(0); sp1c.y = ZREG_F(1); sp1c.z = ZREG_F(2) + 200.0f; MtxPosition(&sp1c, &sp28); current.pos = field_0x68c + sp28; field_0x794[2] = 0; if (!startDemoCheck()) break; mMoveMode++; // fallthrough case 1: cMtx_YrotS(*calc_mtx, shape_angle.y + 0x8000); sp1c.x = ZREG_F(0); sp1c.y = ZREG_F(1) + 20.0f; sp1c.z = ZREG_F(2); MtxPosition(&sp1c, &sp28); sp28 += field_0x68c; mDemoCamCenter.set(sp28); cMtx_YrotS(*calc_mtx, shape_angle.y + 0x8000); sp1c.x = ZREG_F(3) + 300.0f; sp1c.y = ZREG_F(4) + 200.0f; sp1c.z = ZREG_F(5) + 420.0f; MtxPosition(&sp1c, &sp28); sp28 += field_0x68c; mDemoCamEye.set(sp28); camera->mCamera.Set(mDemoCamCenter, mDemoCamEye, 62.0f, 0); cLib_addCalcPos(¤t.pos, home.pos, 0.8f, WREG_F(4) + 3.0f, WREG_F(5) + 1.0f); sp28 = field_0x68c - current.pos; if (sp28.abs() > 5.0f || ZREG_S(0) != 0) break; field_0x794[0] = 70; mMoveMode++; // fallthrough case 2: cLib_addCalcPos(¤t.pos, home.pos, 0.8f, WREG_F(4) + 3.0f, WREG_F(5) + 1.0f); if (field_0x794[0] == 0) { field_0x794[2] = 3; if (field_0x77c > 2.0f) { break; } camera->mCamera.Start(); camera->mCamera.SetTrimSize(0); dComIfGp_event_reset(); setActionMode(ACTION_EXECUTE_CATCH_FLY_MOVE, 12); } break; } mGateOpen(); if (mS_Ball != NULL) { mS_Ball->current.pos.set(field_0x668); } } /* 8082D154-8082D2F0 004214 019C+00 1/1 0/0 0/0 .text executeFlyDelete__8daE_ZH_cFv */ void daE_ZH_c::executeFlyDelete() { switch (mMoveMode) { case 0: fopAcM_OffStatus(this, 0); attention_info.flags &= 0xFFFFFFFB; attention_info.distances[2] = 0; if (bitSw != 0xFF && fopAcM_isSwitch(this, bitSw)) { fopAcM_offSwitch(this, bitSw); } gravity = 0.0f; speed.y = 0.0f; if (mAnm != BCK_ZH_SERCH) { setBck(BCK_ZH_SERCH, 2, 10.0f, 1.0f); } mMoveMode = 1; break; case 1: if (fopAcM_rc_c::roofCheck(¤t.pos)) { cLib_addCalc2(¤t.pos.y, fopAcM_rc_c::getRoofY() + 200.0f, 0.7f, 10.0f); if (fabsf(current.pos.y - (fopAcM_rc_c::getRoofY() + 200.0f)) < 20.0f) { fopAcM_OffStatus(this, 0); attention_info.flags &= 0xFFFFFFFB; attention_info.distances[2] = 0; if (arg0 == 0) { setActionMode(ACTION_EXECUTE_WAIT, 0); } else { setActionMode(ACTION_EXECUTE_BALL_WAIT, 0); } } } break; } } /* 8082D2F0-8082D97C 0043B0 068C+00 1/1 0/0 0/0 .text executeDamage__8daE_ZH_cFv */ void daE_ZH_c::executeDamage() { cXyz sp2c, sp38; switch (mMoveMode) { case 0: gravity = 0.0f; speed.y = 0.0f; field_0xa08.SetTgType(0xd84860ba); field_0xb40.SetTgType(0xd84860ba); if (field_0x78c == 2) { setBck(BCK_ZH_CATCHDROP, 0, 3.0f, 1.0f); mSound.startCreatureSound(Z2SE_EN_ZH_DROP, 0, -1); if (current.pos.y < mBgc.GetGroundH() + 400.0f) { speedF = -40.0f; } } else { setBck(BCK_ZH_CATCHDAMAGE, 0, 3.0f, 1.0f); mSound.startCreatureSound(Z2SE_EN_ZH_DMG, 0, -1); } field_0x794[0] = (int)BREG_S(8) + 8 & 0xFF; mMoveMode++; return; case 1: if (field_0x78c == 2) { if (mS_Ball != NULL) { if ((int)mpModelMorf->getFrame() == 1 && bitSw != 0xFF && !fopAcM_isSwitch(this, bitSw)) { fopAcM_cancelCarryNow(mS_Ball); fopAcM_onSwitch(this, bitSw); } } if ((int)mpModelMorf->getFrame() >= 1) { if ((int)mpModelMorf->getFrame() <= 6 && current.pos.y < mBgc.GetGroundH() + 300.0f) { cLib_addCalc2(¤t.pos.y, mBgc.GetGroundH() + 300.0f, 0.7f, 30.0f); } } cLib_addCalc0(&speedF, 0.8f, 4.0f); } else if (bitSw != 0xFF && !fopAcM_isSwitch(this, bitSw) && mS_Ball != NULL) { mS_Ball->current.pos.set(field_0x668); } if (!mpModelMorf->isStop()) { if (field_0x794[0] != 0) { mColorSet(false, 31.875f, 6.25f); return; } mColorSet(true, 31.875f, 6.25f); return; } if (mS_Ball != NULL) { field_0x78c++; if (field_0x78c < 3) { if (bitSw != 0xFF && !fopAcM_isSwitch(this, bitSw)) { field_0x794[0] = 0; setActionMode(ACTION_EXECUTE_CATCH_FLY_MOVE, 0); return; } gravity = 0.0f; speed.y = 0.0f; setActionMode(ACTION_EXECUTE_SEARCH_MOVE, 0); return; } setBck(BCK_ZH_PIYO2, 2, 3.0f, 1.0f); field_0x794[0] = l_HIO.piyori_time; mMoveMode++; } else { field_0x78c = 0; setActionMode(ACTION_EXECUTE_FLY_DELETE, 0); } return; case 2: if (field_0x794[0] != 0) { if (field_0x794[0] > l_HIO.piyori_time / 3.0f) { mColorSet(false, 10.0f, 10.0f); return; } if (field_0x794[0] == l_HIO.piyori_time / 3.0f) { mSound.startCreatureSound(Z2SE_EN_ZH_BLINK, 0, -1); } if ((field_0x794[0] & 16) == 0) { mColorSet(true, 10.0f, 10.0f); return; } mColorSet(false, 10.0f, 10.0f); return; } mColorSet(true, 10.0f, 10.0f); if (!mColorSet(true, 10.0f, 10.0f)) { return; } mMoveMode++; // fallthrough case 3: cLib_addCalc2(&field_0x764[0], 255.0f, 0.8f, 10.0f); cLib_addCalc2(&field_0x764[1], 255.0f, 0.8f, 10.0f); cLib_addCalc2(&field_0x764[2], 255.0f, 0.8f, 10.0f); if (field_0x764[1] > 254.0f) { return; } field_0x764[2] = 255.0f; field_0x764[1] = 255.0f; field_0x764[0] = 255.0f; setBck(BCK_ZH_WAKEUP, 0, 3.0f, 1.0f); mSound.startCreatureSound(Z2SE_EN_ZH_WAKEUP, 0, -1); mMoveMode++; // fallthrough case 4: if (!mpModelMorf->isStop()) { cLib_addCalc2(&field_0x764[0], 255.0f, 0.8f, 10.0f); cLib_addCalc0(&field_0x764[1], 0.8f, 10.0f); cLib_addCalc2(&field_0x764[2], 50.0f, 0.8f, 10.0f); return; } mMoveMode++; // fallthrough case 5: cLib_addCalc2(&field_0x764[0], 255.0f, 0.8f, 10.0f); cLib_addCalc0(&field_0x764[1], 0.8f, 10.0f); cLib_addCalc2(&field_0x764[2], 50.0f, 0.8f, 10.0f); if (field_0x764[1] > 2.0f) { return; } field_0x764[0] = 255.0f; field_0x764[1] = 0.0f; field_0x764[2] = 50.0f; field_0x78c = 0; setActionMode(ACTION_EXECUTE_SEARCH_MOVE, 0); } } /* 8082D97C-8082D9B0 004A3C 0034+00 1/1 0/0 0/0 .text executeDeadStop__8daE_ZH_cFv */ void daE_ZH_c::executeDeadStop() { switch (mMoveMode) { case 0: mMoveMode++; break; case 1: break; case 10: break; } } /* 8082D9B0-8082DB64 004A70 01B4+00 1/1 0/0 0/0 .text executeEntryCheck__8daE_ZH_cFv */ void daE_ZH_c::executeEntryCheck() { daObjCarry_c* s_Ball = (daObjCarry_c *)fpcM_Search(s_BallSearch_Tag, this); if (s_Ball != NULL) { cXyz sp1c; switch (mMoveMode) { case 0: mMoveMode++; // fallthrough case 1: sp1c = s_Ball->current.pos - current.pos; sp1c.y = 0.0f; if (sp1c.abs() < field_0x778 && mStartFlag == 0) { mStartFlag = 1; } break; } } } /* 8082DB64-8082DB84 004C24 0020+00 1/1 0/0 0/0 .text tagAction__8daE_ZH_cFv */ void daE_ZH_c::tagAction() { executeEntryCheck(); } /* 8082DB84-8082DE18 004C44 0294+00 2/1 0/0 0/0 .text action__8daE_ZH_cFv */ void daE_ZH_c::action() { mS_Ball = (daObjCarry_c*)fpcM_Search(s_BallSearch, this); damage_check(); mBallHosei.zero(); for (int i = 0; i < 8; i++) { field_0x6f8[i].zero(); } if (field_0x794[2] == 2) { mGateOpen(); } switch (mActionMode) { case ACTION_EXECUTE_START_DEMO: executeStartDemo(); break; case ACTION_EXECUTE_WAIT: executeWait(); break; case ACTION_EXECUTE_BALL_WAIT: executeBallWait(); break; case ACTION_EXECUTE_OPEN_START: executeOpenStart(); break; case ACTION_EXECUTE_SEARCH_MOVE: executeSearchMove(); break; case ACTION_EXECUTE_BG_HIT_SH_MOVE: executeBgHitSHMove(); break; case ACTION_EXECUTE_CATCH_MOVE: executeCatchMove(); break; case ACTION_EXECUTE_CATCH_FLY_MOVE: executeCatchFlyMove(); break; case ACTION_EXECUTE_FLY_DELETE: executeFlyDelete(); break; case ACTION_EXECUTE_RETURN_DEMO: executeReturnDemo(); break; case ACTION_EXECUTE_DAMAGE: executeDamage(); break; case ACTION_EXECUTE_DEAD_STOP: executeDeadStop(); break; } if (mActionMode != ACTION_EXECUTE_SEARCH_MOVE && mActionMode != ACTION_EXECUTE_CATCH_MOVE && mActionMode != ACTION_EXECUTE_CATCH_FLY_MOVE) { Z2GetAudioMgr()->changeBgmStatus(99); } if (NREG_S(0) != 0) { OS_REPORT("\n\n\n"); OS_REPORT("mActionMode %d\n", mActionMode); OS_REPORT("mMoveMode %d\n", mMoveMode); OS_REPORT("\n\n\n"); } if ((mAnm == BCK_ZH_SERCH && mActionMode != ACTION_EXECUTE_BALL_WAIT || mAnm == BCK_ZH_CATCHMOVE) && mActionMode != ACTION_EXECUTE_DEAD_STOP) { mSound.startCreatureSoundLevel(Z2SE_EN_ZH_MV, 0, -1); } if (mAnm == BCK_ZH_PIYO2) { mSound.startCreatureSoundLevel(Z2SE_EN_ZH_PIYO, 0, -1); } fopAcM_posMoveF(this, mStts.GetCCMoveP()); if (mActionMode != ACTION_EXECUTE_BALL_WAIT) { if (mActionMode != ACTION_EXECUTE_BALL_WAIT && mActionMode != ACTION_EXECUTE_RETURN_DEMO && mActionMode != ACTION_EXECUTE_FLY_DELETE) { mBgc.SetRoofCrrHeight(BREG_F(2) + 100.0f); mAcchCir.SetWall(100.0f, BREG_F(1) + 150.0f); mBgc.SetGroundUpY(field_0x760 + BREG_F(0)); mBgc.CrrPos(dComIfG_Bgsp()); } mpBtkAnm->play(); mpModelMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); } } /* 8082DE18-8082DF44 004ED8 012C+00 1/1 0/0 0/0 .text mtx_set__8daE_ZH_cFv */ void daE_ZH_c::mtx_set() { mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); mDoMtx_stack_c::ZXYrotM(shape_angle); mDoMtx_stack_c::transM(0.0f, 0.0f, BREG_F(4) + -100.0f); mDoMtx_stack_c::scaleM(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size); J3DModel* model = mpModelMorf->getModel(); model->setBaseTRMtx(mDoMtx_stack_c::get()); mpModelMorf->modelCalc(); mDoMtx_stack_c::copy(model->getAnmMtx(5)); cXyz sp28; sp28.set(JREG_F(0) + 20.0f, JREG_F(1) + -105.0f, JREG_F(2)); mDoMtx_stack_c::multVec(&sp28, &field_0x668); if (arg0 == 1) { mDoMtx_stack_c::transS(field_0x68c.x, field_0x68c.y, field_0x68c.z); mDoMtx_stack_c::scaleM(l_HIO.model_size, l_HIO.model_size, l_HIO.model_size); mEntranceModel->setBaseTRMtx(mDoMtx_stack_c::get()); } } /* 8082DF44-8082E2FC 005004 03B8+00 1/1 0/0 0/0 .text cc_set__8daE_ZH_cFv */ void daE_ZH_c::cc_set() { cXyz sp24, sp30; J3DModel* model = mpModelMorf->getModel(); mDoMtx_stack_c::copy(model->getAnmMtx(0)); if (mActionMode == ACTION_EXECUTE_WAIT) { sp24.set(200.0f, -100.0f, 0.0f); } else if (mActionMode == ACTION_EXECUTE_OPEN_START || mAnm == BCK_ZH_OPEN || mAnm == BCK_ZH_START) { sp24.set(250.0f, 0.0f, 0.0f); } else { sp24.set(150.0f, 50.0f, 0.0f); } mDoMtx_stack_c::multVec(&sp24, &eyePos); attention_info.position = eyePos; attention_info.position.y += 25.0f; if (mActionMode == ACTION_EXECUTE_CATCH_FLY_MOVE && mS_Ball != NULL) { cXyz sp3c, sp48; cMtx_YrotS(*calc_mtx, shape_angle.y); sp3c.x = 0.0f; sp3c.y = 0.0f; sp3c.z = ZREG_F(17) + 30.0f; MtxPosition(&sp3c, &sp48); sp48 += mS_Ball->current.pos; eyePos.set(sp48); attention_info.position = eyePos; attention_info.position.y += ZREG_F(18) + 100.0f; } mDoMtx_stack_c::copy(model->getAnmMtx(0)); if (mActionMode == ACTION_EXECUTE_WAIT || mActionMode == ACTION_EXECUTE_DEAD_STOP || field_0x78c >= 3) { sp24.set(140.0f, -90.0f, 0.0f); mDoMtx_stack_c::multVec(&sp24, &sp30); field_0xa08.SetC(sp30); field_0xa08.SetR(120.0f); dComIfG_Ccsp()->Set(&field_0xa08); } else if (mActionMode == ACTION_EXECUTE_OPEN_START || mAnm == BCK_ZH_OPEN || mAnm == BCK_ZH_START) { mDoMtx_stack_c::multVecZero(&sp30); field_0xb40.SetC(sp30); field_0xb40.SetH(250.0f); field_0xb40.SetR(55.0f); dComIfG_Ccsp()->Set(&field_0xb40); } else { sp24.set(170.0f, -20.0f, 0.0f); mDoMtx_stack_c::multVec(&sp24, &sp30); field_0xb40.SetC(sp30); field_0xb40.SetH(100.0f); field_0xb40.SetR(170.0f); dComIfG_Ccsp()->Set(&field_0xb40); } if (mActionMode == ACTION_EXECUTE_WAIT || mActionMode == ACTION_EXECUTE_OPEN_START) { return; } sp24.set(BREG_F(10) + 170.0f, BREG_F(11) + -20.0f, BREG_F(12)); mDoMtx_stack_c::multVec(&sp24, &sp30); field_0xc7c.SetC(sp30); field_0xc7c.SetH(BREG_F(13) + 100.0f); if (field_0x7af != 0) { field_0xc7c.SetR(BREG_F(14) + 150.0f); } else { field_0xc7c.SetR(BREG_F(14) + 130.0f); } if (gravity) { dComIfG_Ccsp()->Set(&field_0xc7c); } } /* 8082E2FC-8082E3C0 0053BC 00C4+00 1/1 0/0 0/0 .text execute__8daE_ZH_cFv */ int daE_ZH_c::execute() { if (field_0x7ae != 0) { return 1; } for (int i = 0; i < 2; i++) { if (field_0x794[i]) { field_0x794[i]--; } } if (field_0x7a8 != 0) { field_0x7a8--; } if (field_0x7a0 != 0) { field_0x7a0--; } if (arg0 == 2) { tagAction(); } else { action(); mtx_set(); cc_set(); } return 1; } /* 8082E3C0-8082E3E0 005480 0020+00 2/1 0/0 0/0 .text daE_ZH_Execute__FP8daE_ZH_c */ static int daE_ZH_Execute(daE_ZH_c* i_this) { return i_this->execute(); } /* 8082E3E0-8082E3E8 0054A0 0008+00 1/0 0/0 0/0 .text daE_ZH_IsDelete__FP8daE_ZH_c */ static int daE_ZH_IsDelete(daE_ZH_c* i_this) { return 1; } /* 8082E3E8-8082E4C4 0054A8 00DC+00 1/1 0/0 0/0 .text _delete__8daE_ZH_cFv */ int daE_ZH_c::_delete() { dComIfG_resDelete(&mPhase, "E_ZH"); if (arg0 == 2) { return 1; } if (mActionMode == ACTION_EXECUTE_CATCH_FLY_MOVE && bitSw != 0xFF && !fopAcM_isSwitch(this, bitSw)) { daObjCarry_c* s_Ball = (daObjCarry_c*)fpcM_Search(s_BallSearch, this); if (s_Ball != NULL) { s_Ball->reset(); } } if (field_0xe04 != 0) { l_initHIO = 0; } if (heap != NULL) { mSound.deleteObject(); } return 1; } /* 8082E4C4-8082E4E4 005584 0020+00 1/0 0/0 0/0 .text daE_ZH_Delete__FP8daE_ZH_c */ static int daE_ZH_Delete(daE_ZH_c* i_this) { return i_this->_delete(); } /* 8082E4E4-8082E6C8 0055A4 01E4+00 1/1 0/0 0/0 .text CreateHeap__8daE_ZH_cFv */ int daE_ZH_c::CreateHeap() { J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("E_ZH", BMDV_ZH); JUT_ASSERT(3305, modelData != 0); mpModelMorf = new mDoExt_McaMorfSO(modelData, NULL, NULL, (J3DAnmTransform*)dComIfG_getObjectRes("E_ZH", BCK_ZH_WAIT01), 2, 1.0f, 0, -1, &mSound, 0, 0x31000284); if (mpModelMorf == NULL || mpModelMorf->getModel() == NULL) { return 0; } mpBtkAnm = new mDoExt_btkAnm(); if (mpBtkAnm == NULL) { return 0; } if (!mpBtkAnm->init(mpModelMorf->getModel()->getModelData(), (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("E_ZH", BTK_ZH_LOOP), 1, 2, 1.0f, 0, -1)) { return 0; } if (arg0 == 1) { modelData = (J3DModelData*)dComIfG_getObjectRes("E_ZH", BMDV_ZH_ENTRANCE); JUT_ASSERT(3342, modelData != 0); mEntranceModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203); if (mEntranceModel == NULL) { return 0; } } return 1; } /* 8082E710-8082E730 0057D0 0020+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */ static int useHeapInit(fopAc_ac_c* a_this) { daE_ZH_c* i_this = (daE_ZH_c*)a_this; return i_this->CreateHeap(); } /* 8082E730-8082ECEC 0057F0 05BC+00 1/1 0/0 0/0 .text create__8daE_ZH_cFv */ cPhs__Step daE_ZH_c::create() { fopAcM_SetupActor(this, daE_ZH_c); cPhs__Step phase = (cPhs__Step)dComIfG_resLoad(&mPhase, "E_ZH"); if (phase == cPhs_COMPLEATE_e) { OS_REPORT("E_ZH PARAM %x\n", fopAcM_GetParam(this)); arg0 = fopAcM_GetParam(this); bitSw = fopAcM_GetParam(this) >> 8; bitSwEnd = fopAcM_GetParam(this) >> 16; field_0x7ac = fopAcM_GetParam(this) >> 24; if (bitSwEnd != 0xFF && fopAcM_isSwitch(this, bitSwEnd)) { return cPhs_ERROR_e; } if (arg0 == 0xFF) { arg0 = 0; } OS_REPORT("arg0 %d\n", arg0); OS_REPORT("bitSw %d\n", bitSw); OS_REPORT("bitSwEnd %d\n", bitSwEnd); if (arg0 == 2) { fopAcM_OffStatus(this, 0); attention_info.flags &= 0xFFFFFFFB; attention_info.distances[2] = 0; fopAcM_SetGroup(this, 0); fopAcM_SetMin(this, -2000.0f, -2000.0f, -2000.0f); fopAcM_SetMax(this, 2000.0f, 2000.0f, 2000.0f); if (field_0x7ac == 0xFF || field_0x7ac == 0) { field_0x778 = 100.0f; } else { field_0x778 = field_0x7ac * 10.0f; } mS_Ball = (daObjCarry_c*)fpcM_Search(s_BallSearch_Tag, this); if (mS_Ball == NULL) { return cPhs_ERROR_e; } setActionMode(UNK_ACTION, 0); } else { u32 i_size = 0x17C0; if (arg0 == 1) { i_size = 0x2500; } if (!fopAcM_entrySolidHeap(this, useHeapInit, i_size)) { return cPhs_ERROR_e; } if (l_initHIO == 0) { l_initHIO = 1; field_0xe04 = 1; l_HIO.field_0x4 = -1; } attention_info.flags = 4; fopAcM_SetMtx(this, mpModelMorf->getModel()->getBaseTRMtx()); fopAcM_SetMin(this, -20000.0f, -20000.0f, -20000.0f); fopAcM_SetMax(this, 20000.0f, 20000.0f, 20000.0f); mBgc.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), NULL, NULL); mBgc.ClrRoofNone(); mBgc.SetRoofCrrHeight(100.0f); mAcchCir.SetWall(100.0f, 150.0f); mStts.Init(0xFF, 0, this); health = 1000; field_0x560 = 1000; field_0x774 = -150.0f; field_0xa08.Set(cc_zhSph_src); field_0xa08.SetStts(&mStts); field_0xb40.Set(cc_zhCyl_src); field_0xb40.SetStts(&mStts); field_0xc7c.Set(cc_zhCyl_at_src); field_0xc7c.SetStts(&mStts); mSound.init(¤t.pos, &eyePos, 3, 1); mAtInfo.mpSound = &mSound; mAtInfo.mPowerType = 1; gravity = 0.0f; for (int i = 0; i < 3; i++) { field_0x764[i] = 0.0f; } shape_angle.z = 0; shape_angle.x = 0; attention_info.distances[2] = 3; fopAcM_OffStatus(this, 0); attention_info.flags &= 0xFFFFFFFB; for (int i = 0; i < 8; i++) { field_0x758[i] = 0xFF; } for (int i = 0; i < 3; i++) { field_0x6c8[i].set(current.pos); } field_0xa08.OnTgNoHitMark(); field_0xb40.OnTgNoHitMark(); onWolfNoLock(); if (arg0 == 0) { mS_Ball = (daObjCarry_c*)fpcM_Search(s_BallSearch, this); if (mS_Ball != NULL) { if (!fopAcM_checkCarryNow(mS_Ball)) { mS_Ball->current.pos.set(current.pos); mS_Ball->current.pos.y += 100.0f; mS_Ball->current.pos.z += 90.0f; fopAcM_setCarryNow(mS_Ball, 0); mStartFlag = 0; setBck(BCK_ZH_WAIT01, 0, 3.0f, 1.0f); field_0x78c = 0; attention_info.distances[2] = 3; fopAcM_OffStatus(this, 0); attention_info.flags &= 0xFFFFFFFB; if (fopAcM_GetRoomNo(this) == 0x33 && !fopAcM_isSwitch(this, 18)) { fopAcM_OnStatus(this, fopAcM_STATUS_UNK_004000); setActionMode(ACTION_EXECUTE_START_DEMO, 0); } else { setActionMode(ACTION_EXECUTE_WAIT, 1); } } else { setActionMode(ACTION_EXECUTE_SEARCH_MOVE, 0); } } else { setActionMode(ACTION_EXECUTE_DEAD_STOP, 0); } } else { attention_info.distances[2] = 0; field_0x764[0] = 255.0f; field_0x764[2] = 50.0f; mStartFlag = 0; setActionMode(ACTION_EXECUTE_BALL_WAIT, 0); } } daE_ZH_Execute(this); if (arg0 == 0 && mS_Ball != NULL) { mS_Ball->current.pos.set(field_0x668); } } return phase; } /* 8082F0F8-8082F118 0061B8 0020+00 1/0 0/0 0/0 .text daE_ZH_Create__FP8daE_ZH_c */ static int daE_ZH_Create(daE_ZH_c* i_this) { return i_this->create(); } AUDIO_INSTANCES; /* 8082F60C-8082F62C -00001 0020+00 1/0 0/0 0/0 .data l_daE_ZH_Method */ static actor_method_class l_daE_ZH_Method = { (process_method_func)daE_ZH_Create, (process_method_func)daE_ZH_Delete, (process_method_func)daE_ZH_Execute, (process_method_func)daE_ZH_IsDelete, (process_method_func)daE_ZH_Draw, }; /* 8082F62C-8082F65C -00001 0030+00 0/0 0/0 1/0 .data g_profile_E_ZH */ extern actor_process_profile_definition g_profile_E_ZH = { fpcLy_CURRENT_e, // mLayerID 7, // mListID fpcPi_CURRENT_e, // mListPrio PROC_E_ZH, // mProcName &g_fpcLf_Method.base, // sub_method sizeof(daE_ZH_c), // mSize 0, // mSizeOther 0, // mParameters &g_fopAc_Method.base, // sub_method 173, // mPriority &l_daE_ZH_Method, // sub_method 0x00040100, // mStatus fopAc_ENV_e, // mActorType fopAc_CULLBOX_CUSTOM_e, // cullType };