/** * @file d_a_b_zant.cpp * */ #include "d/dolzel_rel.h" #include "d/actor/d_a_b_zant.h" #include "d/actor/d_a_b_zant_mobile.h" #include "d/actor/d_a_nbomb.h" #include "d/actor/d_a_obj_pillar.h" #include "d/d_com_inf_game.h" #include "d/actor/d_a_alink.h" #include "d/actor/d_a_mirror.h" #include "d/d_s_play.h" #include "f_op/f_op_msg_mng.h" #include "SSystem/SComponent/c_math.h" #include "Z2AudioLib/Z2Instances.h" #include "JSystem/JAudio2/JAUSectionHeap.h" #include enum Joint { /* 0x00 */ JNT_CENTER, /* 0x01 */ JNT_BACKBONE, /* 0x02 */ JNT_NECK, /* 0x03 */ JNT_HEAD, /* 0x04 */ JNT_CHIN, /* 0x05 */ JNT_HELMET, /* 0x06 */ JNT_TONGUE1, /* 0x07 */ JNT_TONGUE2, /* 0x08 */ JNT_TONGE3, /* 0x09 */ JNT_TONGUE4, /* 0x0A */ JNT_TONGUE5, /* 0x0B */ JNT_MOUTH, /* 0x0C */ JNT_SHOULDERL, /* 0x0D */ JNT_ARML1, /* 0x0E */ JNT_ARML2, /* 0x0F */ JNT_ARML3, /* 0x10 */ JNT_ARML4, /* 0x11 */ JNT_HIRALB1, /* 0x12 */ JNT_HIRALB2, /* 0x13 */ JNT_HIRALF1, /* 0x14 */ JNT_HIRALF2, /* 0x15 */ JNT_SPADL, /* 0x16 */ JNT_SHOULDERR, /* 0x17 */ JNT_ARMR1, /* 0x18 */ JNT_ARMR2, /* 0x19 */ JNT_ARMR3, /* 0x1A */ JNT_ARMR4, /* 0x1B */ JNT_HIRARB1, /* 0x1C */ JNT_HIRARB2, /* 0x1D */ JNT_HIRARF1, /* 0x1E */ JNT_HIRARF2, /* 0x1F */ JNT_SPADR, /* 0x20 */ JNT_WAIST, /* 0x21 */ JNT_LEGL1, /* 0x22 */ JNT_LEGL2, /* 0x23 */ JNT_FOOTL, /* 0x24 */ JNT_LEGR1, /* 0x25 */ JNT_LEGR2, /* 0x26 */ JNT_FOOTR, /* 0x27 */ JNT_TAREB1, /* 0x28 */ JNT_TAREB2, /* 0x29 */ JNT_TAREF1, /* 0x2A */ JNT_TAREF2, }; enum OPENING_MODE { MODE_START_DEMO, MODE_START_DEMO_WAIT, MODE_PAN_GROUND, MODE_MSG_1 = 4, MODE_MSG_1_WAIT, MODE_WARP_OUT_SE, MODE_START_WARP, MODE_WARP_WAIT = 100, MODE_PAN_THRONE, MODE_ZOOM_THRONE, MODE_MSG_2, MODE_FLY_UP, MODE_CLOSE_UP, MODE_SET_BOSS_TITLE, MODE_WARP_IN_SE = 20, MODE_WARP_IN_SCALE, MODE_WARP_IN_WAIT, MODE_ZOOM_OUT_ROOM_CHANGE, MODE_START_ROOM_CHANGE, MODE_ROOM_CHANGE, MODE_END_ROOM_CHANGE, MODE_END_DEMO, }; static u8 const lit_3757[12] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; namespace { /* 8064EEAC-8064EEEC 000020 0040+00 0/1 0/0 0/0 .data cc_zant_src__24@unnamed@d_a_b_zant_cpp@ */ dCcD_SrcSph cc_zant_src = { { {0x0, {{0x400, 0x1, 0x4}, {0xD8FBFDFF, 0x43}, 0x75}}, // mObj {dCcD_SE_METAL, 0x0, 0x1, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 40.0f} // mSph } // mSphAttr }; /* 8064EEEC-8064EF2C 000060 0040+00 0/1 0/0 0/0 .data cc_zant_sword_src__24@unnamed@d_a_b_zant_cpp@ */ dCcD_SrcSph cc_zant_sword_src = { { {0x0, {{0x400, 0x1, 0x4}, {0xD8FBFDFF, 0x0}, 0x0}}, // mObj {dCcD_SE_METAL, 0x0, 0x0, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 40.0f} // mSph } // mSphAttr }; /* 8064EF2C-8064EF70 0000A0 0044+00 0/1 0/0 0/0 .data cc_zant_roll_src__24@unnamed@d_a_b_zant_cpp@ */ dCcD_SrcCyl cc_zant_roll_src = { { {0x0, {{0x400, 0x2, 0x4}, {0xD8FBFDFF, 0x42}, 0x74}}, // mObj {dCcD_SE_METAL, 0x0, 0x6, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x2, 0x0, 0x0, 0x303}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {0.0f, 0.0f, 0.0f}, // mCenter 40.0f, // mRadius 40.0f // mHeight } // mCyl }; /* 8064EF70-8064EFB0 0000E4 0040+00 0/1 0/0 0/0 .data cc_zant_foot_src__24@unnamed@d_a_b_zant_cpp@ */ dCcD_SrcSph cc_zant_foot_src = { { {0x0, {{0x0, 0x0, 0x0}, {0x400000, 0x3}, 0x0}}, // mObj {dCcD_SE_METAL, 0x0, 0xA, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x106}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 40.0f} // mSph } // mSphAttr }; /* 8064EFB0-8064EFF0 000124 0040+00 0/1 0/0 0/0 .data cc_zant_foot_src2__24@unnamed@d_a_b_zant_cpp@ */ dCcD_SrcSph cc_zant_foot_src2 = { { {0x0, {{0x400, 0x2, 0x1E}, {0xD8BBFDFF, 0x43}, 0x75}}, // mObj {dCcD_SE_METAL, 0x0, 0xD, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x2, 0x0, 0x0, 0x3}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 40.0f} // mSph } // mSphAttr }; /* 8064EFF0-8064F030 000164 0040+00 0/1 0/0 0/0 .data cc_zant_camera_src__24@unnamed@d_a_b_zant_cpp@ */ dCcD_SrcSph cc_zant_camera_src = { { {0x0, {{0x400, 0x2, 0x1E}, {0xD8BBFDFF, 0x0}, 0x5}}, // mObj {dCcD_SE_METAL, 0x0, 0xD, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x2, 0x0, 0x0, 0x3}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 40.0f} // mSph } // mSphAttr }; /* 8064F030-8064F038 0001A4 0007+01 4/4 0/0 0/0 .data warp_next_room__24@unnamed@d_a_b_zant_cpp@ */ static s8 warp_next_room[] = { 50, 53, 54, 55, 56, 57, 60, }; } /* 8063E10C-8063E19C 0000EC 0090+00 1/1 0/0 0/0 .text __ct__14daB_ZANT_HIO_cFv */ daB_ZANT_HIO_c::daB_ZANT_HIO_c() { field_0x4 = -1; mModelSize = 1.0f; mMahojinWaitTime = 10.0f; mBulletNum = 15.0f; mAttackAnmSpeed = 1.7f; mBulletSpeed = 100.0f; mBulletSpeedUnderwater = 40.0f; mDemoWarpTime = 22.0f; mPlayWarpTime = 0.0f; mSwordAttackSize = 1.2f; mMahojinSize = 0.5f; mMahojinOffsetX = 0.0f; mMahojinOffsetY = 200.0f; mMahojinOffsetZ = -100.0f; mAppearAnmSpeed = 2.0f; mDisappearAnmSpeed = 0.5f; } /* 8063E19C-8063E264 00017C 00C8+00 1/1 0/0 0/0 .text ctrlJoint__10daB_ZANT_cFP8J3DJointP8J3DModel */ int daB_ZANT_c::ctrlJoint(J3DJoint* i_joint, J3DModel* i_model) { u16 jnt_no = i_joint->getJntNo(); mDoMtx_stack_c::copy(i_model->getAnmMtx(jnt_no)); switch (jnt_no) { case JNT_BACKBONE: mDoMtx_stack_c::ZrotM(mBackboneRotZ); break; case JNT_NECK: mDoMtx_stack_c::ZXYrotM(mNeckRotX, 0, mNeckRotZ); break; } i_model->setAnmMtx(jnt_no, mDoMtx_stack_c::get()); cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); return 1; } /* 8063E264-8063E2B0 000244 004C+00 1/1 0/0 0/0 .text JointCallBack__10daB_ZANT_cFP8J3DJointi */ int daB_ZANT_c::JointCallBack(J3DJoint* i_joint, int param_1) { if (param_1 == 0) { J3DModel* model = j3dSys.getModel(); daB_ZANT_c* actor = (daB_ZANT_c*)model->getUserArea(); if (actor != NULL) { actor->ctrlJoint(i_joint, model); } } return 1; } namespace { /* 8064EB5C-8064EB74 000040 0018+00 1/4 0/0 0/0 .rodata iron_tg_cc__24@unnamed@d_a_b_zant_cpp@ */ static int const iron_tg_cc[] = { 0, 1, 2, 4, 5, 6, }; } /* 8063E2B0-8063E568 000290 02B8+00 1/1 0/0 0/0 .text draw__10daB_ZANT_cFv */ int daB_ZANT_c::draw() { J3DModel* model = mpModelMorf->getModel(); g_env_light.settingTevStruct(0, ¤t.pos, &tevStr); g_env_light.setLightTevColorType_MAJI(model, &tevStr); mpModelMorf->entryDL(); daMirror_c::entry(model); cXyz sp38; sp38.set(current.pos.x, current.pos.y + 100.0f, current.pos.z); f32 var_f31; if (mFightPhase == PHASE_YO) { var_f31 = 2000.0f - current.pos.y; if (var_f31 < 0.0f) { var_f31 = 0.0f; } tevStr.field_0x344 = (var_f31 * 3.0f) / 2000.0f; if (tevStr.field_0x344 >= 1.0f) { tevStr.field_0x344 = 1.0f; } mShadowKey = dComIfGd_setShadow(mShadowKey, 0, model, &sp38, 1500.0f, 0.0f, current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); } else { mShadowKey = dComIfGd_setShadow(mShadowKey, 1, model, &sp38, 800.0f, 0.0f, current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); } if (mDrawSwords) { g_env_light.setLightTevColorType_MAJI(mpSwordLModel, &tevStr); mDoExt_modelUpdateDL(mpSwordLModel); dComIfGd_addRealShadow(mShadowKey, mpSwordLModel); g_env_light.setLightTevColorType_MAJI(mpSwordRModel, &tevStr); mDoExt_modelUpdateDL(mpSwordRModel); dComIfGd_addRealShadow(mShadowKey, mpSwordRModel); } if (mMahojinAnmMode != 0) { g_env_light.setLightTevColorType_MAJI(mpMahojinModel, &tevStr); mpMahojinEndBrk->entry(mpMahojinModel->getModelData()); mpMahojinBtk->entry(mpMahojinModel->getModelData()); mpMahojinStartBtk->entry(mpMahojinModel->getModelData()); mDoExt_modelUpdateDL(mpMahojinModel); if (mMahojin2AnmMode) { g_env_light.setLightTevColorType_MAJI(mpMahojinModel2, &tevStr); mpMahojinBrk2->entry(mpMahojinModel2->getModelData()); mpMahojinStartBtk2->entry(mpMahojinModel2->getModelData()); mDoExt_modelUpdateDL(mpMahojinModel2); } } return 1; } /* 8063E5A4-8063E5C4 000584 0020+00 1/0 0/0 0/0 .text daB_ZANT_Draw__FP10daB_ZANT_c */ static int daB_ZANT_Draw(daB_ZANT_c* i_this) { return i_this->draw(); } /* 8063E5C4-8063E668 0005A4 00A4+00 23/23 0/0 0/0 .text setBck__10daB_ZANT_cFiUcff */ void daB_ZANT_c::setBck(int i_resID, u8 i_attr, f32 i_morf, f32 i_speed) { mpModelMorf->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("B_zan", i_resID), i_attr, i_morf, i_speed, 0.0f, -1.0f); } /* 8063E668-8063E6C4 000648 005C+00 3/3 0/0 0/0 .text checkBck__10daB_ZANT_cFi */ bool daB_ZANT_c::checkBck(int i_resID) { return mpModelMorf->getAnm() == (J3DAnmTransform*)dComIfG_getObjectRes("B_zan", i_resID) ? TRUE : FALSE; } /* 8063E6C4-8063E6F8 0006A4 0034+00 24/24 0/0 0/0 .text setActionMode__10daB_ZANT_cFii */ void daB_ZANT_c::setActionMode(int i_action, int i_mode) { mSwordSize = 1.0f; field_0x701 = 0; field_0x702 = 1; field_0x717 = 0; mLastAction = mAction; mAction = i_action; mMode = i_mode; } /* 8063E6F8-8063E79C 0006D8 00A4+00 2/2 0/0 0/0 .text checkBigDamage__10daB_ZANT_cFv */ bool daB_ZANT_c::checkBigDamage() { daPy_py_c* player = daPy_getPlayerActorClass(); BOOL taken_big_dmg = false; if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_NORMAL_SWORD) && daPy_py_c::checkMasterSwordEquip()) { if (mAtInfo.mpCollider->GetAtAtp() >= 4) { taken_big_dmg = true; } else if (player->getSwordAtUpTime() != 0) { taken_big_dmg = true; } else if (player->getCutCount() >= 4) { taken_big_dmg = true; } } return taken_big_dmg; } /* 8063E79C-8063E810 00077C 0074+00 2/2 0/0 0/0 .text checkDamageType__10daB_ZANT_cFv */ int daB_ZANT_c::checkDamageType() { if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_HOOKSHOT) && mFightPhase == PHASE_OI) { return DMGTYPE_HOOK_OI; } if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_HOOKSHOT) || mAtInfo.mpCollider->ChkAtType(AT_TYPE_SPINNER) || mAtInfo.mpCollider->ChkAtType(AT_TYPE_ARROW) || mAtInfo.mpCollider->ChkAtType(AT_TYPE_SHIELD_ATTACK)) { return DMGTYPE_OBJ; } if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_BOOMERANG) || mAtInfo.mpCollider->ChkAtType(AT_TYPE_40)) { return DMGTYPE_BOOMERANG; } if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_MASTER_SWORD)) { return DMGTYPE_SWORD; } return DMGTYPE_MISC; } /* 8063E810-8063E938 0007F0 0128+00 2/2 0/0 0/0 .text setDamageSe__10daB_ZANT_cFP8dCcD_Sphi */ void daB_ZANT_c::setDamageSe(dCcD_Sph* i_hitSph, int i_dmgAmount) { health -= i_dmgAmount; if (health < 0) { health = 0; } BOOL var_r29; u8 at_se = ((dCcD_GObjInf*)mAtInfo.mpCollider)->GetAtSe(); if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_HOOKSHOT) && !fopAcM_CheckStatus(this, 0x280000)) { var_r29 = 1; } else { var_r29 = 0; } u32 var_r30 = 30; if (mAtInfo.mHitStatus == 1) { var_r30 = 31; } else if (mAtInfo.mHitStatus == 2) { var_r30 = 32; } mSound.startCollisionSE(i_hitSph->getHitSeID(at_se, var_r29), var_r30); if (mAtInfo.mHitStatus == 0) { dComIfGp_setHitMark(1, this, i_hitSph->GetTgHitPosP(), NULL, NULL, 0); } else { dComIfGp_setHitMark(3, this, i_hitSph->GetTgHitPosP(), NULL, NULL, 0); } } /* 8064F5F4-8064F5F8 -00001 0004+00 2/2 0/0 0/0 .bss None */ /* 8064F5F5 0003+00 l_initHIO None */ static u8 l_initHIO; /* 8064F604-8064F648 000054 0044+00 12/13 0/0 0/0 .bss l_HIO */ static daB_ZANT_HIO_c l_HIO; namespace { /* 8064F66C-8064F690 0000BC 0024+00 4/5 0/0 0/0 .bss fly_warp_pos__24@unnamed@d_a_b_zant_cpp@ */ static cXyz fly_warp_pos[] = { cXyz(0.0f, 400.0f, 1000.0f), cXyz(1000.0f, 400.0f, 1500.0f), cXyz(-1000.0f, 400.0f, 1500.0f), }; } /* 8063E938-8063F0F4 000918 07BC+00 1/1 0/0 0/0 .text damage_check__10daB_ZANT_cFv */ void daB_ZANT_c::damage_check() { field_0x9a4.Move(); if (mAction != ACT_ROOM_CHANGE) { mAtInfo.mpSound = NULL; if (field_0x702 != 0) { mBodySphCc[0].OnTgNoHitMark(); mBodySphCc[1].OnTgNoHitMark(); if (mBodySphCc[0].ChkTgShield()) { mAtInfo.mpSound = &mSound; } } mAtInfo.mpCollider = NULL; dCcD_Sph tg_hit_sph; if (mBodySphCc[0].ChkTgHit()) { mAtInfo.mpCollider = mBodySphCc[0].GetTgHitObj(); tg_hit_sph = mBodySphCc[0]; } else if (mBodySphCc[1].ChkTgHit()) { mAtInfo.mpCollider = mBodySphCc[1].GetTgHitObj(); tg_hit_sph = mBodySphCc[1]; } if (mAtInfo.mpCollider != NULL) { daPy_py_c* player = daPy_getPlayerActorClass(); if (tg_hit_sph.ChkTgShield()) { mAtInfo.field_0x18 = 42; mAtInfo.mpCollider->SetAtAtp(0); } else { mAtInfo.field_0x18 = 0; } s16 prev_hp = health; int dmg_amount = 0; if (field_0x702 != 0) { health = 280; cc_at_check(this, &mAtInfo); } else { cc_at_check(this, &mAtInfo); dmg_amount = prev_hp - health; } health = prev_hp; if (!mAtInfo.mpCollider->ChkAtType(AT_TYPE_MASTER_SWORD)) { dScnPly_c::setPauseTimer(0); } if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_WOLF_ATTACK | AT_TYPE_WOLF_CUT_TURN | AT_TYPE_10000000 | AT_TYPE_MIDNA_LOCK)) { field_0x6e4 = 20; } else { field_0x6e4 = 10; } if (mAtInfo.mAttackPower <= 1) { field_0x6e4 = 10; } mTakenBigDmg = checkBigDamage(); switch (mFightPhase) { case PHASE_BB: if (field_0x70c == 0) { setActionMode(ACT_FLY, 10); } else { switch (checkDamageType()) { case DMGTYPE_SWORD: setDamageSe(&tg_hit_sph, dmg_amount); if (mAction != ACT_DAMAGE) { field_0x6f4 = 100; } setActionMode(ACT_DAMAGE, pl_cut_LRC(player->getCutType())); break; case DMGTYPE_MISC: field_0x70c = 0; gravity = 0.0f; mFlyWarpPosID = (f32)mFlyWarpPosID + cM_rndF(1.9f) + 1.0f; mFlyWarpPos = fly_warp_pos[mFlyWarpPosID % 3]; field_0x711 = 2; setActionMode(ACT_WARP, 1); break; case DMGTYPE_BOOMERANG: setActionMode(ACT_CONFUSE, 5); break; case DMGTYPE_OBJ: setActionMode(ACT_CONFUSE, 0); break; } } break; case PHASE_MG: switch (checkDamageType()) { case DMGTYPE_SWORD: setDamageSe(&tg_hit_sph, dmg_amount); if (mAction != ACT_DAMAGE) { field_0x6f4 = 100; } setActionMode(ACT_DAMAGE, pl_cut_LRC(player->getCutType())); break; case DMGTYPE_MISC: setActionMode(ACT_SIMA_JUMP, 11); break; case DMGTYPE_BOOMERANG: setActionMode(ACT_CONFUSE, 5); break; case DMGTYPE_OBJ: setActionMode(ACT_CONFUSE, 0); break; } break; case PHASE_OI: switch (checkDamageType()) { case DMGTYPE_SWORD: setDamageSe(&tg_hit_sph, dmg_amount); if (mAction != ACT_DAMAGE) { field_0x6f4 = 100; } setActionMode(ACT_DAMAGE, pl_cut_LRC(player->getCutType())); break; case DMGTYPE_HOOK_OI: setActionMode(ACT_HOOK, 0); break; } break; case PHASE_MK: if (field_0x707 != 0) { if (mAction != ACT_MONKEY_FALL) { if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_BOOMERANG) || mAtInfo.mpCollider->ChkAtType(AT_TYPE_40)) { setActionMode(ACT_MONKEY_FALL, 20); } else { setActionMode(ACT_CONFUSE, 0); } } else { setActionMode(ACT_MONKEY_FALL, 10); } } else { switch (checkDamageType()) { case DMGTYPE_SWORD: setDamageSe(&tg_hit_sph, dmg_amount); setActionMode(ACT_MONKEY_DAMAGE, 0); break; case DMGTYPE_MISC: setNearPillarPos(); field_0x711 = 0; setActionMode(ACT_WARP, 1); break; case DMGTYPE_BOOMERANG: case DMGTYPE_OBJ: field_0x6f0 = 0; setActionMode(ACT_MONKEY_DAMAGE, 0); break; } } break; case PHASE_LAST: if (!tg_hit_sph.ChkTgShield()) { switch (checkDamageType()) { case DMGTYPE_SWORD: setDamageSe(&tg_hit_sph, dmg_amount); if (mAction == ACT_LAST_ATTACK && mMode == 13) { mAction = ACT_LAST_TIRED; } setActionMode(ACT_LAST_DAMAGE, pl_cut_LRC(player->getCutType())); break; case DMGTYPE_MISC: mSwordCc[0].OffAtSetBit(); mSwordCc[1].OffAtSetBit(); setTgHitBit(0); setLastWarp(1, 0); break; case DMGTYPE_BOOMERANG: setActionMode(ACT_LAST_DAMAGE, 20); break; case DMGTYPE_OBJ: setActionMode(ACT_LAST_DAMAGE, 10); break; case DMGTYPE_HOOK_OI: break; } } break; } mBodySphCc[0].ClrTgHit(); mBodySphCc[1].ClrTgHit(); return; } } } /* 8063F524-8063F84C 001504 0328+00 1/1 0/0 0/0 .text ice_damage_check__10daB_ZANT_cFv */ void daB_ZANT_c::ice_damage_check() { field_0xc74.Move(); if (field_0x6e4 == 0) { s16 prev_hp = health; mAtInfo.mpCollider = NULL; for (int i = 0; i < 6; i++) { int tg_idx = iron_tg_cc[i]; if (mFootCc[tg_idx].ChkTgHit()) { field_0x6e4 = 10; mAtInfo.mpCollider = mFootCc[tg_idx].GetTgHitObj(); if (!mFootCc[tg_idx].ChkTgShield()) { if (mAction == ACT_ICE_STEP || mAction == ACT_ICE_JUMP) { setDamageSe(&mFootCc[tg_idx], 0); if (i < 2) { setActionMode(ACT_ICE_DAMAGE, 0); } else { setActionMode(ACT_ICE_DAMAGE, 1); } } else if (mAction == ACT_ICE_DAMAGE) { setActionMode(ACT_ICE_DAMAGE, 30); mModeTimer = 0; } } for (int j = 0; j < 6; j++) { mFootCc[iron_tg_cc[j]].ClrTgHit(); } return; } } for (int i = 0; i < 11; i++) { if (mFoot2Cc[i].ChkTgHit()) { if (field_0x6e4 == 0) { mAtInfo.mpCollider = mFoot2Cc[i].GetTgHitObj(); if (mFoot2Cc[i].ChkTgShield()) { mAtInfo.field_0x18 = 42; mAtInfo.mpCollider->SetAtAtp(0); } else { mAtInfo.field_0x18 = 0; } cc_at_check(this, &mAtInfo); int dmg_amount = prev_hp - health; health = prev_hp; if (!mAtInfo.mpCollider->ChkAtType(AT_TYPE_MASTER_SWORD)) { dScnPly_c::setPauseTimer(0); } if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_WOLF_ATTACK | AT_TYPE_WOLF_CUT_TURN | AT_TYPE_10000000 | AT_TYPE_MIDNA_LOCK)) { field_0x6e4 = 20; } else { field_0x6e4 = 10; } if (mAtInfo.mAttackPower <= 1) { field_0x6e4 = 10; } mTakenBigDmg = checkBigDamage(); if (mAction == ACT_ICE_DAMAGE && mAtInfo.field_0x18 != 42) { switch (checkDamageType()) { case DMGTYPE_BOOMERANG: setActionMode(ACT_ICE_DAMAGE, 40); mModeTimer = 0; break; case DMGTYPE_OBJ: setActionMode(ACT_ICE_DAMAGE, 20); mModeTimer = 0; break; case DMGTYPE_MISC: setActionMode(ACT_ICE_DAMAGE, 30); mModeTimer = 0; break; case DMGTYPE_SWORD: setDamageSe(&mFoot2Cc[i], dmg_amount); setActionMode(ACT_ICE_DAMAGE, 10); break; } } } mFoot2Cc[i].ClrTgHit(); } } } } /* 8063F84C-8063F970 00182C 0124+00 3/3 0/0 0/0 .text setNextDamageMode__10daB_ZANT_cFi */ bool daB_ZANT_c::setNextDamageMode(BOOL i_checkHealth) { if (i_checkHealth) { if (mFightCycle == 0 && health < 140) { mFightCycle++; setBaseActionMode(2); return true; } } else if (mFightCycle == 0) { if (mTakenBigDmg) { mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG, -1); mFightCycle++; setBaseActionMode(2); return true; } } else if (health <= 0 || mTakenBigDmg) { mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG, -1); mFightCycle = 0; setActionMode(ACT_ROOM_CHANGE, 0); return true; } return false; } /* 8063F970-8063FAB4 001950 0144+00 1/1 0/0 0/0 .text s_obj_sub__FPvPv */ static void* s_obj_sub(void* i_actor, void* i_data) { if (fopAcM_IsActor(i_actor)) { if (!fpcM_IsCreating(fopAcM_GetID(i_actor)) && !fopAcM_checkCarryNow((fopAc_ac_c*)i_actor)) { f32 obj_dist = fopAcM_searchActorDistanceXZ((fopAc_ac_c*)i_actor, (fopAc_ac_c*)i_data); if (obj_dist < 300.0f && fopAcM_GetSpeed((fopAc_ac_c*)i_actor).y) { if (fopAcM_GetName(i_actor) == PROC_Obj_Carry) { return i_actor; } if (fopAcM_GetName(i_actor) == PROC_NBOMB) { return i_actor; } } if (obj_dist < 300.0f && fopAcM_GetName(i_actor) == PROC_NBOMB && ((daNbomb_c*)i_actor)->getExTime() < 10) { return i_actor; } if (obj_dist < 700.0f && fopAcM_GetName(i_actor) == PROC_ARROW && fopAcM_GetSpeedF((fopAc_ac_c*)i_actor)) { s16 actor_angle = ((fopAc_ac_c*)i_actor)->current.angle.y; s16 angle_to_boss = fopAcM_searchActorAngleY((fopAc_ac_c*)i_actor, (fopAc_ac_c*)i_data); if (abs((s16)(actor_angle - angle_to_boss)) < 0x2000) { return i_actor; } } } } return NULL; } /* 8063FAB4-8063FF6C 001A94 04B8+00 3/3 0/0 0/0 .text checkAvoidWeapon__10daB_ZANT_cFi */ bool daB_ZANT_c::checkAvoidWeapon(BOOL i_allowBoomerang) { if (i_allowBoomerang == 2) { return FALSE; } daPy_py_c* player = daPy_getPlayerActorClass(); // avoid bomb, arrow, carry obj fopAc_ac_c* obj = (fopAc_ac_c*)fpcM_Search(s_obj_sub, this); if (obj != NULL) { return TRUE; } // avoid clawshot if (dComIfGp_checkPlayerStatus0(0, 0x4000)) { cXyz* ppos = player->getHookshotTopPos(); if (ppos != NULL && ppos->absXZ(current.pos) < 300.0f) { return TRUE; } } // avoid ball and chain cXyz* ppos = player->getIronBallCenterPos(); if (ppos != NULL) { daAlink_c* player_alink = daAlink_getAlinkActorClass(); if ((player_alink->checkIronBallThrowMode() || player_alink->checkIronBallThrowReturnMode()) && !player->checkIronBallGroundStop()) { if (ppos->absXZ(current.pos) < 300.0f) { return TRUE; } } } // avoid boomerang if (!i_allowBoomerang && player->getThrowBoomerangActor() != NULL) { fopAc_ac_c* pboomerang = (fopAc_ac_c*)player->getThrowBoomerangActor(); if (pboomerang->current.pos.absXZ(current.pos) < 300.0f) { return TRUE; } } return FALSE; } /* 8063FF6C-8063FFAC 001F4C 0040+00 18/18 0/0 0/0 .text setTgHitBit__10daB_ZANT_cFi */ void daB_ZANT_c::setTgHitBit(BOOL i_onBit) { if (i_onBit) { mBodySphCc[0].OnTgSetBit(); mBodySphCc[1].OnTgSetBit(); } else { mBodySphCc[0].OffTgSetBit(); mBodySphCc[1].OffTgSetBit(); } } /* 8063FFAC-8063FFEC 001F8C 0040+00 2/2 0/0 0/0 .text setCoHitBit__10daB_ZANT_cFi */ void daB_ZANT_c::setCoHitBit(BOOL i_onBit) { if (i_onBit) { mBodySphCc[0].OnCoSetBit(); mBodySphCc[1].OnCoSetBit(); } else { mBodySphCc[0].OffCoSetBit(); mBodySphCc[1].OffCoSetBit(); } } /* 8063FFEC-806400BC 001FCC 00D0+00 2/2 0/0 0/0 .text setTgShield__10daB_ZANT_cFi */ void daB_ZANT_c::setTgShield(BOOL i_onShield) { if (i_onShield) { mBodySphCc[0].OnTgShield(); mBodySphCc[0].OnTgSpinnerReflect(); mBodySphCc[0].OnTgIronBallRebound(); mBodySphCc[1].OnTgShield(); mBodySphCc[1].OnTgSpinnerReflect(); mBodySphCc[1].OnTgIronBallRebound(); mBodySphCc[0].OffTgNoHitMark(); mBodySphCc[1].OffTgNoHitMark(); mBodySphCc[0].SetTgHitMark(CcG_Tg_UNK_MARK_2); mBodySphCc[1].SetTgHitMark(CcG_Tg_UNK_MARK_2); } else { mBodySphCc[0].OffTgShield(); mBodySphCc[0].OffTgSpinnerReflect(); mBodySphCc[0].OffTgIronBallRebound(); mBodySphCc[1].OffTgShield(); mBodySphCc[1].OffTgSpinnerReflect(); mBodySphCc[1].OffTgIronBallRebound(); mBodySphCc[0].SetTgHitMark(CcG_Tg_UNK_MARK_0); mBodySphCc[1].SetTgHitMark(CcG_Tg_UNK_MARK_0); } } /* 806400BC-806400C8 00209C 000C+00 3/3 0/0 0/0 .text setTgType__10daB_ZANT_cFUl */ void daB_ZANT_c::setTgType(u32 i_type) { mBodySphCc[0].SetTgType(i_type); mBodySphCc[1].SetTgType(i_type); } /* 806400C8-80640104 0020A8 003C+00 1/1 0/0 0/0 .text setZantMessage__10daB_ZANT_cFi */ void daB_ZANT_c::setZantMessage(int i_msgNo) { mMsgNo = i_msgNo; mMsgID = fopMsgM_messageSet(i_msgNo, 1000); } /* 80640104-80640180 0020E4 007C+00 1/1 0/0 0/0 .text doZantMessage__10daB_ZANT_cFv */ int daB_ZANT_c::doZantMessage() { if (mpMsg != NULL) { if (mpMsg->mode == 14) { mpMsg->mode = 16; } else if (mpMsg->mode == 18) { mpMsg->mode = 19; mMsgID = fpcM_ERROR_PROCESS_ID_e; return 1; } } else { mpMsg = fopMsgM_SearchByID(mMsgID); } return 0; } /* 80640180-80640310 002160 0190+00 2/2 0/0 0/0 .text setIceLandingEffect__10daB_ZANT_cFi */ void daB_ZANT_c::setIceLandingEffect(BOOL i_landFootR) { static u16 l_landing_effect_id[] = { 0x86DC, 0x86DD, 0x86DE, 0x86DF, 0x86E0, 0x86E1, }; cXyz particle_pos; if (!i_landFootR) { mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTL)); } else { mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTR)); } mDoMtx_stack_c::transM(10.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(&particle_pos); particle_pos.y = 2.0f; cXyz size(1.0f, 1.0f, 1.0f); for (int i = 0; i < 6; i++) { dComIfGp_particle_set(l_landing_effect_id[i], &particle_pos, &tevStr, &shape_angle, &size); } particle_pos.set(0.0f, 0.0f, 0.0f); dComIfGp_particle_set(0x86E2, &particle_pos, &tevStr, &shape_angle, NULL); } /* 80640310-806403D4 0022F0 00C4+00 1/1 0/0 0/0 .text setWaterBubble__10daB_ZANT_cFv */ void daB_ZANT_c::setWaterBubble() { cXyz particle_pos; mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_MOUTH)); mDoMtx_stack_c::multVecZero(&particle_pos); field_0x389c[0] = dComIfGp_particle_set(field_0x389c[0], 0x1E8, &particle_pos, &tevStr); } /* 806403D4-80640478 0023B4 00A4+00 1/1 0/0 0/0 .text setMonkeyFallEffect__10daB_ZANT_cFv */ void daB_ZANT_c::setMonkeyFallEffect() { static u16 l_landing_effect_id[] = {0x8901, 0x8902, 0x8903}; for (int i = 0; i < 3; i++) { dComIfGp_particle_set(l_landing_effect_id[i], ¤t.pos, &tevStr, &shape_angle, NULL); } } /* 80640478-80640584 002458 010C+00 1/1 0/0 0/0 .text setLastRollEffect__10daB_ZANT_cFv */ void daB_ZANT_c::setLastRollEffect() { static u16 l_roll_effect_id[] = {0x8904, 0x8905}; mSound.startCreatureSoundLevel(Z2SE_EN_ZAN_CTL_SPIN_ATK, 0, -1); for (int i = 0; i < 2; i++) { field_0x38ac[i] = dComIfGp_particle_set(field_0x38ac[i], l_roll_effect_id[i], ¤t.pos, &tevStr, &shape_angle, NULL, 0xFF, NULL, -1, NULL, NULL, NULL); } fopAcM_effSmokeSet2(&field_0x3894, &field_0x3898, ¤t.pos, NULL, 2.0f, &tevStr); } /* 8064F690-8064F694 0000E0 0004+00 2/2 0/0 0/0 .bss target_info_count */ static int target_info_count; /* 80640584-80640654 002564 00D0+00 1/1 0/0 0/0 .text s_pillar_sub__FPvPv */ static void* s_pillar_sub(void* i_actor, void* i_data) { if (fopAcM_IsActor(i_actor)) { if (!fpcM_IsCreating(fopAcM_GetID(i_actor)) && fopAcM_GetName(i_actor) == PROC_Obj_Pillar) { if (((daPillar_c*)i_actor)->getMdlType() != 0) { ((daB_ZANT_c*)i_data)->mPillarIDs[8] = fopAcM_GetID(i_actor); } else { ((daB_ZANT_c*)i_data)->mPillarIDs[target_info_count] = fopAcM_GetID(i_actor); target_info_count++; } } } return NULL; } /* 80640654-80640664 002634 0010+00 0/0 0/0 1/1 .text getMagicSpeed__10daB_ZANT_cFv */ f32 daB_ZANT_c::getMagicSpeed() { return l_HIO.mBulletSpeed; } /* 80640664-80640674 002644 0010+00 0/0 0/0 1/1 .text getMagicWaterSpeed__10daB_ZANT_cFv */ f32 daB_ZANT_c::getMagicWaterSpeed() { return l_HIO.mBulletSpeedUnderwater; } /* 80640674-80640C20 002654 05AC+00 1/1 0/0 0/0 .text executeSmallAttack__10daB_ZANT_cFv */ void daB_ZANT_c::executeSmallAttack() { cXyz sp44; s16 aim_target_angle = fopAcM_searchPlayerAngleY(this); if (mFightPhase == PHASE_OI) { fopAc_ac_c* pmobile; fopAcM_SearchByID(mMobileIDs[mCorrectMobileNo], &pmobile); if (pmobile != NULL) { s16 var_r26 = pmobile->shape_angle.y - aim_target_angle; if (abs(var_r26) > 0x1400) { if (var_r26 < 0) { aim_target_angle = pmobile->shape_angle.y + 0x1000; } else { aim_target_angle = pmobile->shape_angle.y - 0x1000; } } } } switch (mMode) { case 0: setTgHitBit(TRUE); attention_info.flags = fopAc_AttnFlag_BATTLE_e; mMode = 2; field_0x6fd = 0; if (field_0x711 != 0) { setBck(BCK_ZAN_MAGICSHOOTA_B, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); } else { setBck(BCK_ZAN_MAGICSHOOTA_B_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); } field_0x717 = 1; break; case 2: if (field_0x711 != 0) { if (mpModelMorf->checkFrame(15)) { mSound.startCreatureVoice(Z2SE_EN_ZAN_V_ATK_BALL, -1); } } else { if (mpModelMorf->checkFrame(16)) { mSound.startCreatureVoice(Z2SE_EN_ZAN_V_ATK_BALL, -1); } } cLib_addCalcAngleS(&shape_angle.y, aim_target_angle, 8, 0x400, 0x80); if (mpModelMorf->isStop()) { f32 anm_speed = l_HIO.mAttackAnmSpeed; if (mFightPhase == PHASE_OI) { anm_speed = 1.0f; } if (field_0x711 != 0) { setBck(BCK_ZAN_MAGICSHOOTA_C, J3DFrameCtrl::EMode_LOOP, 3.0f, anm_speed); } else { setBck(BCK_ZAN_MAGICSHOOTA_B_B, J3DFrameCtrl::EMode_LOOP, 3.0f, anm_speed); } mMode = 3; field_0x6fd = 0; } break; case 3: cLib_addCalcAngleS(&shape_angle.y, aim_target_angle, 8, 0x400, 0x80); if (mpModelMorf->checkFrame(3) || mpModelMorf->checkFrame(13)) { if (mpModelMorf->checkFrame(13)) { mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_ARML4)); } else { mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_ARMR4)); } mDoMtx_stack_c::multVecZero(&sp44); u32 parameter = field_0x6fd + 1; if (field_0x703 < 10) { parameter += 2; } if (parameter > 6) { parameter = 6; } fopAcM_createChild(PROC_B_ZANTM, fopAcM_GetID(this), parameter, &sp44, fopAcM_GetRoomNo(this), &shape_angle, NULL, -1, NULL); dComIfGp_particle_set(0x886B, &sp44, &shape_angle, NULL); field_0x6fd++; field_0x704++; } else if ((mpModelMorf->checkFrame(9) || mpModelMorf->checkFrame(19)) && field_0x6fd >= field_0x703) { mMode = 4; if (field_0x711 != 0) { setBck(BCK_ZAN_MAGICSHOOTA_D, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); } else { setBck(BCK_ZAN_MAGICSHOOTA_B_C, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); } field_0x717 = 0; } break; case 4: if (mpModelMorf->isStop()) { attention_info.flags = fopAc_AttnFlag_BATTLE_e; if (mFightPhase == PHASE_BB) { field_0x711 = 1; setActionMode(ACT_WARP, 1); } else if (mFightPhase == PHASE_MG) { setActionMode(ACT_SIMA_JUMP, 0); } else if (mFightPhase == PHASE_OI) { setActionMode(ACT_WATER, 0); } else if (mFightPhase == PHASE_MK) { setActionMode(ACT_MONKEY, 0); } } break; } if (mFightPhase == PHASE_BB && checkAvoidWeapon(TRUE)) { field_0x711 = 1; setActionMode(ACT_WARP, 1); } } /* 80640C20-80640D14 002C00 00F4+00 3/3 0/0 0/0 .text calcScale__10daB_ZANT_cFi */ bool daB_ZANT_c::calcScale(BOOL param_0) { if (!param_0) { cLib_addCalc(&mModelScaleXZ, 0.0f, 0.5f, 0.25f, 0.1f); cLib_addCalc(&mModelScaleY, 1.2f, 0.5f, 0.1f, 0.1f); if (!mModelScaleXZ) { mModelScaleY = 0.0f; mModelScaleXZ = 0.0f; return true; } } else { cLib_addCalc(&mModelScaleY, 1.0f, 0.5f, 0.2f, 0.1f); if (mModelScaleY > 0.5f) { cLib_addCalc(&mModelScaleXZ, 1.0f, 0.5f, 0.2f, 0.1f); } if (mModelScaleY == 1.0f && mModelScaleXZ == 1.0f) { return true; } } return false; } /* 80640D14-80641230 002CF4 051C+00 1/1 0/0 0/0 .text executeWarp__10daB_ZANT_cFv */ void daB_ZANT_c::executeWarp() { switch (mMode) { case 0: case 1: attention_info.flags = 0; setTgHitBit(FALSE); setCoHitBit(FALSE); if (mFightPhase != PHASE_MK && mFightPhase != PHASE_YO && mFightPhase != PHASE_LAST) { if (field_0x711 & 1) { setBck(BCK_ZAN_FLOAT_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); } else { setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); } } mMode += 2; speed.y = 0.0f; speedF = 0.0f; dComIfGp_particle_set(0x88FF, ¤t.pos, &shape_angle, NULL); dComIfGp_particle_set(0x8900, ¤t.pos, &shape_angle, NULL); mSound.startCreatureSound(Z2SE_EN_ZAN_WARP_OUT, 0, -1); case 2: case 3: if (calcScale(0)) { mMode += 2; switch (mFightPhase) { case PHASE_BB: if (field_0x70b == 0) { field_0x70b = 1; mModeTimer = 120; } else if (mFightCycle == 0) { mModeTimer = 40; } else { mModeTimer = 15; } break; case PHASE_MG: mModeTimer = 15; break; case PHASE_OI: mModeTimer = 60; break; case PHASE_MK: if (mLastAction == ACT_MONKEY) { mModeTimer = 15; } else { mModeTimer = 60; } break; case PHASE_YO: mModeTimer = 60; break; case PHASE_LAST: if (mFlyWarpPosID != 0) { mModeTimer = 60; } else { mModeTimer = 15; } break; } mModeTimer += (int)l_HIO.mPlayWarpTime; } break; case 4: case 5: if (mModeTimer == 0) { if (mMode == 4) { dBgS_ObjGndChk gndchk; gndchk.SetPos(&mFlyWarpPos); f32 gnd_y = dComIfG_Bgsp().GroundCross(&gndchk); if (gnd_y != -1000000000.0f) { mFlyWarpPos.y = gnd_y; } shape_angle.y = field_0x6b8; shape_angle.x = 0; current.pos = mFlyWarpPos; } else { current.pos = mFlyWarpPos; shape_angle.x = 0; shape_angle.y = fopAcM_searchPlayerAngleY(this); } old.pos = current.pos; mMode = 6; if (field_0x711 & 2) { field_0x711 = (field_0x711 & 1) ^ 1; } else { field_0x711 &= 1; } if (field_0x711 != 0) { setBck(BCK_ZAN_FLOAT_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); } else { setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); } dComIfGp_particle_set(0x88FE, ¤t.pos, &shape_angle, NULL); mSound.startCreatureSound(Z2SE_EN_ZAN_WARP_IN, 0, -1); } break; case 6: if (calcScale(1)) { attention_info.flags = fopAc_AttnFlag_BATTLE_e; setCoHitBit(TRUE); setBaseActionMode(0); } break; } } /* 806412A8-806414E4 003288 023C+00 1/1 0/0 0/0 .text executeDamage__10daB_ZANT_cFv */ void daB_ZANT_c::executeDamage() { switch (mMode) { case 0: case 1: case 2: attention_info.flags = fopAc_AttnFlag_BATTLE_e; if (setNextDamageMode(FALSE)) { setTgHitBit(FALSE); return; } else if (mFightPhase == PHASE_OI && setNextDamageMode(TRUE)) { setTgHitBit(FALSE); return; } field_0x702 = 0; speedF = 0.0f; setTgHitBit(TRUE); if (mMode == 0) { if (cM_rnd() < 0.5f) { mMode = 1; } else { mMode = 2; } } if (mFightPhase == PHASE_OI) { if (mMode == 1) { setBck(BCK_ZAN_FLOAT_DAMAGEL, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); } else { setBck(BCK_ZAN_FLOAT_DAMAGER, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); } speed.y = 0.0f; speedF = 0.0f; } else if (mMode == 1) { setBck(BCK_ZAN_DAMAGEL_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); } else { setBck(BCK_ZAN_DAMAGER_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); } mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG, -1); mMode = 5; mModeTimer = 40; case 5: if (field_0x6f4 == 0) { setTgHitBit(FALSE); } if (mpModelMorf->isStop() && !setNextDamageMode(TRUE)) { setBaseActionMode(0); } break; } } /* 806414E4-80641640 0034C4 015C+00 1/1 0/0 0/0 .text executeConfuse__10daB_ZANT_cFv */ void daB_ZANT_c::executeConfuse() { switch (mMode) { case 0: attention_info.flags = fopAc_AttnFlag_BATTLE_e; speedF = 0.0f; speed.y = 0.0f; mMode = 1; setBck(BCK_ZAN_GROUND_REACTION, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_ZAN_V_NO_DMG, -1); field_0x702 = 0; case 1: if (mpModelMorf->isStop()) { setBaseActionMode(0); } break; case 5: setBck(BCK_ZAN_FAINT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); speedF = 0.0f; speed.y = 0.0f; field_0x702 = 0; mModeTimer = 20; mMode = 6; case 6: if (mModeTimer == 0) { setBaseActionMode(0); } break; } } /* 80641640-806427EC 003620 11AC+00 2/2 0/0 0/0 .text executeOpening__10daB_ZANT_cFv */ void daB_ZANT_c::executeOpening() { camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); daPy_py_c* player = daPy_getPlayerActorClass(); cXyz sp34(0.0f, 0.0f, 0.0f); cXyz sp40; cXyz sp4C; switch (mMode) { case MODE_START_DEMO: current.pos.set(0.0f, 0.0f, 160.0f); shape_angle.y = -0x8000; if (!eventInfo.checkCommandDemoAccrpt()) { fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 4); eventInfo.onCondition(2); return; } Z2GetAudioMgr()->setDemoName("force_start"); fopAcM_OffStatus(this, 0x4000); sp34.set(0.0f, 0.0f, -700.0f); player->setPlayerPosAndAngle(&sp34, 0, 0); setBck(BCK_ZAN_OP_1, J3DFrameCtrl::EMode_LOOP, 0.0f, 1.0f); mMode = MODE_START_DEMO_WAIT; mModeTimer = 30; camera->mCamera.Stop(); camera->mCamera.SetTrimSize(3); field_0x77c = 220.0f; case MODE_START_DEMO_WAIT: sp4C.set(0.0f, 175.0f, 3.0f); sp40.set(0.0f, 270.0f, -194.0f); mDemoCamCenter = sp4C; mDemoCamEye = sp40; mDemoCamBank = 30.0f; if (mModeTimer == 0) { mMode = MODE_PAN_GROUND; mModeTimer = 80; } break; case MODE_PAN_GROUND: sp4C.set(0.0f, 81.0f, -187.0f); sp40.set(0.0f, 67.0f, -408.0f); cLib_addCalcPos2(&mDemoCamCenter, sp4C, 0.1f, 4.3f); cLib_addCalcPos2(&mDemoCamEye, sp40, 0.1f, 6.0f); if (mModeTimer == 0) { mMode = MODE_MSG_1; setBck(BCK_ZAN_OP_2, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_ZAN_OP_V_WAKEUP, -1); } break; case MODE_MSG_1: if (mpModelMorf->getFrame() > 5.0f) { sp4C.set(0.0f, 86.0f, -9.0f); sp40.set(0.0f, 10.0f, -209.0f); cLib_addCalcPos2(&mDemoCamCenter, sp4C, 0.5f, 26.0f); cLib_addCalcPos2(&mDemoCamEye, sp40, 0.5f, 30.0f); } if (mpModelMorf->isStop()) { mMode = MODE_MSG_1_WAIT; mModeTimer = 20; setBck(BCK_ZAN_OP_3, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); setZantMessage(0xE3B); // My god had only one wish... } break; case MODE_MSG_1_WAIT: if (doZantMessage() == true) { mModeTimer = 20; mMode = MODE_WARP_OUT_SE; } break; case MODE_WARP_OUT_SE: if (mModeTimer == 0) { mMode = MODE_START_WARP; mSound.startCreatureSound(Z2SE_EN_ZAN_WARP_OUT, 0, -1); } break; case MODE_START_WARP: if (calcScale(0)) { current.pos.set(0.0f, 225.0f, -1700.0f); sp34.set(0.0f, 0.0f, -500.0f); player->setPlayerPosAndAngle(&sp34, 0, 0); player->changeOriginalDemo(); player->changeDemoMode(1, 0, 0, 0); mMode = MODE_WARP_WAIT; mDemoCamCenter.set(0.0f, 200.0f, -1700.0f); mDemoCamEye.set(0.0f, 70.0f, -300.0f); mDemoCamBank = 68.0f; mModeTimer = 15; } break; case MODE_WARP_WAIT: if (mModeTimer == 0) { setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); player->changeDemoMode(0x48, 0, 0, 0); mMode = MODE_PAN_THRONE; mModeTimer = 105; } break; case MODE_PAN_THRONE: sp4C.set(32.0f, 290.0f, -1678.0f); sp40.set(100.0f, 70.0f, -300.0f); cLib_addCalcPos2(&mDemoCamCenter, sp4C, 0.1f, 1.0f); cLib_addCalcPos2(&mDemoCamEye, sp40, 0.1f, 1.0f); if (mModeTimer <= 30) { if (mModeTimer == 30) { current.angle.y = 0; shape_angle.y = 0; dComIfGp_particle_set(0x88FE, ¤t.pos, &shape_angle, NULL); mSound.startCreatureSound(Z2SE_EN_ZAN_WARP_IN, 0, -1); } calcScale(1); } if (mModeTimer == 0) { mMode = MODE_ZOOM_THRONE; mModeTimer = 30; } break; case MODE_ZOOM_THRONE: calcScale(1); sp4C.set(32.0f, 290.0f, -1678.0f); sp40.set(66.0f, 180.0f, -989.0f); cLib_addCalcPos2(&mDemoCamCenter, sp4C, 0.5f, 60.0f); cLib_addCalcPos2(&mDemoCamEye, sp40, 0.5f, 60.0f); if (mModeTimer == 0) { mMode = MODE_MSG_2; setZantMessage(0xE3C); } break; case MODE_MSG_2: if (doZantMessage() == true) { setBck(BCK_ZAN_OP_RISE, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f); mMode = MODE_FLY_UP; mModeTimer = 90; mSound.startCreatureSound(Z2SE_EN_ZAN_OP_FLY, 0, -1); } break; case MODE_FLY_UP: current.pos.y += 3.0f; mDemoCamCenter.y += 2.0f; if (mModeTimer == 0) { mMode = MODE_CLOSE_UP; } break; case MODE_CLOSE_UP: if (mModeTimer == 0) { mDoMtx_stack_c::YrotS(-0x8000); mDoMtx_stack_c::transM(0.0f, 300.0f, 700.0f); mDoMtx_stack_c::multVecZero(¤t.pos); current.pos.y += 100.0f; current.pos.z -= 800.0f; old.pos = current.pos; speedF = 0.0f; speed.y = 0.0f; gravity = 0.0f; shape_angle.y = fopAcM_searchPlayerAngleY(this); shape_angle.x = -fopAcM_searchPlayerAngleX(this) * 0.5f; setBck(BCK_ZAN_OP_RISE, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); sp34.x = -140.0f; sp34.y += 250.0f; sp34.z = -800.0f; player->setPlayerPosAndAngle(&sp34, 0x8000, 0); player->changeOriginalDemo(); player->changeDemoPos0(&sp34); player->changeDemoMode(0x17, 1, 4, 0); mDemoCamBank = 58.0f; mDoMtx_stack_c::YrotS(-0x8000); mDoMtx_stack_c::transM(-85.0f, 344.0f, 382.0f); mDoMtx_stack_c::multVecZero(&mDemoCamEye); mDemoCamEye.y += 250.0f; mDemoCamEye.z -= 800.0f; mDoMtx_stack_c::YrotS(-0x8000); mDoMtx_stack_c::transM(258.0f, 672.0f, 1374.0f); mDoMtx_stack_c::multVecZero(&mDemoCamCenter); mDemoCamCenter.y += 200.0f; mDemoCamCenter.z -= 800.0f; Z2GetAudioMgr()->bgmStart(Z2BGM_BOSS_ZANT, 0, 0); field_0x77c = 0.0f; field_0x6fc = 1; mMode = MODE_SET_BOSS_TITLE; mModeTimer = 160; } break; case MODE_SET_BOSS_TITLE: if (mModeTimer == 100) { fopMsgM_messageSetDemo(0x486); } cLib_addCalc(¤t.pos.y, 250.0f + 300.0f, 0.1f, 3.0f, 0.9f); cLib_addCalc(&mDemoCamCenter.y, 250.0f + 672.0f, 0.1f, 1.0f, 0.3f); if (mModeTimer == 0) { mMode = MODE_WARP_IN_WAIT; mModeTimer = 20; } break; case MODE_WARP_IN_SE: shape_angle.y = fopAcM_searchPlayerAngleY(this); shape_angle.x = -fopAcM_searchPlayerAngleX(this) * 0.5f; if (mModeTimer == 0) { dComIfGp_particle_set(0x88FE, ¤t.pos, &shape_angle, NULL); mMode = MODE_WARP_IN_SCALE; mSound.startCreatureSound(Z2SE_EN_ZAN_WARP_IN, 0, -1); } break; case MODE_WARP_IN_SCALE: shape_angle.y = fopAcM_searchPlayerAngleY(this); shape_angle.x = -fopAcM_searchPlayerAngleX(this) * 0.5f; if (calcScale(1)) { mMode = MODE_WARP_IN_WAIT; mModeTimer = 20; } break; case MODE_WARP_IN_WAIT: if (mModeTimer == 0) { mMode = MODE_ZOOM_OUT_ROOM_CHANGE; mModeTimer = 50; } break; case MODE_ZOOM_OUT_ROOM_CHANGE: calcRoomChangeCamera(0); if (mModeTimer == 0) { mMode = MODE_START_ROOM_CHANGE; setBck(BCK_ZAN_FLOAT_APPEAR, J3DFrameCtrl::EMode_NONE, 5.0f, 1.0f); mSound.startCreatureSound(Z2SE_EN_ZAN_MAHOJIN_BB, 0, -1); field_0x714 = 1; mKankyoBlend = 0.0f; } break; case MODE_START_ROOM_CHANGE: cLib_chaseF(&mKankyoBlend, 1.0f, 0.006f); if (mpModelMorf->checkFrame(110)) { mMahojinAnmMode = 1; field_0x715 = 30; } if (mpModelMorf->getFrame() > 110.0f) { cLib_chaseF(&mKankyoBlend, 1.0f, 0.01f); } shape_angle.y = fopAcM_searchPlayerAngleY(this); shape_angle.x = -fopAcM_searchPlayerAngleX(this) * 0.5f; if (mpModelMorf->isStop()) { dComIfGp_getVibration().StopQuake(31); setBck(BCK_ZAN_FLOAT_APPEARWAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = MODE_ROOM_CHANGE; mModeTimer = l_HIO.mMahojinWaitTime; cXyz pos(0.0f, 0.0f, 0.0f); dComIfGs_setRestartRoom(pos, 0, warp_next_room[1]); return; } break; case MODE_ROOM_CHANGE: mFightPhase++; if (mFightPhase >= PHASE_MAX) { mFightPhase = PHASE_OP; } current.pos.set(-140.0f, 300.0f, 700.0f); sp34.set(0.0f, 0.0f, 0.0f); player->setPlayerPosAndAngle(&sp34, 0, 0); player->changeDemoMode(0x17, 1, 4, 0); mDemoCamEye.x += 140.0f; mDemoCamEye.y -= 250.0f; mDemoCamEye.z += 800.0f; mDoMtx_stack_c::YrotS(-0x8000); mDoMtx_stack_c::transM(mDemoCamEye); mDoMtx_stack_c::multVecZero(&mDemoCamEye); mDemoCamCenter.x += 140.0f; mDemoCamCenter.y -= 250.0f; mDemoCamCenter.z += 800.0f; mDoMtx_stack_c::YrotS(-0x8000); mDoMtx_stack_c::transM(mDemoCamCenter); mDoMtx_stack_c::multVecZero(&mDemoCamCenter); shape_angle.y = fopAcM_searchPlayerAngleY(this); shape_angle.x = -fopAcM_searchPlayerAngleX(this) * 0.5f; initNextRoom(); mMode = MODE_END_ROOM_CHANGE; case MODE_END_ROOM_CHANGE: if (mModeTimer == 0 && dComIfGp_roomControl_checkStatusFlag(warp_next_room[mFightPhase], 0x10)) { mMode = MODE_END_DEMO; field_0x714 = 0; mKankyoBlend = 0.0f; setBck(BCK_ZAN_FLOAT_WAITRETURN, J3DFrameCtrl::EMode_NONE, 5.0f, 1.0f); mMahojinAnmMode = 4; } break; case MODE_END_DEMO: cLib_chaseF(&mKankyoBlend, 1.0f, 0.02f); player->setPlayerPosAndAngle(&sp34, 0, 0); if (mpModelMorf->isStop()) { camera->mCamera.Reset(mDemoCamCenter, mDemoCamEye); camera->mCamera.Start(); camera->mCamera.SetTrimSize(0); dComIfGp_event_reset(); field_0x6fc = 0; setTgHitBit(TRUE); setBaseActionMode(1); Z2GetAudioMgr()->setDemoName("force_end"); return; } break; } if (field_0x715 != 0) { calcRoomChangeCamera(1); field_0x715--; } camera->mCamera.Set(mDemoCamCenter, mDemoCamEye, mDemoCamBank, 0); } /* 806427EC-80642EC8 0047CC 06DC+00 2/1 0/0 0/0 .text executeFly__10daB_ZANT_cFv */ void daB_ZANT_c::executeFly() { dBgS_ObjGndChk_All gndchk; cXyz sp9C; switch (mMode) { case 0: setTgHitBit(TRUE); setBck(BCK_ZAN_FLOAT_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mModeTimer = 0; mMode = 1; gravity = 0.0f; field_0x70c = 0; setTgType(0x10040); case 1: if (mModeTimer == 0) { if (mFightCycle == 0) { field_0x703 = l_HIO.mBulletNum; } else { field_0x703 = 8; } mFlyWarpPosID = (f32)mFlyWarpPosID + cM_rndF(1.9f) + 1.0f; mFlyWarpPos = fly_warp_pos[mFlyWarpPosID % 3]; field_0x711 = 1; setActionMode(ACT_SMALL_ATTACK, 0); return; } break; case 10: setBck(BCK_ZAN_SWAMP_FALL_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_ZAN_BB_V_FALL, -1); mMode = 11; speedF = 0.0f; speed.y = 45.0f; current.angle.y = shape_angle.y; gravity = -5.0f; field_0x6f8 = 0x1000; setTgHitBit(FALSE); case 11: case 12: if (mMode == 11) { if (mpModelMorf->isStop()) { setBck(BCK_ZAN_SWAMP_FALL_LOOP, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 12; } } else if (speed.y < -10.0f) { setBck(BCK_ZAN_SWAMP_FALL_B, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 13; } case 13: if (speed.y < 5.0f) { gravity = -2.0f; } else { gravity = -5.0f; } if (field_0x6f8 != 0) { shape_angle.y += field_0x6f8; cLib_chaseAngleS(&field_0x6f8, 0, 0x40); } else { cLib_addCalcAngleS2(&shape_angle.y, current.angle.y, 4, 0x1000); } sp9C = current.pos; sp9C.y += 100.0f; gndchk.SetPos(&sp9C); { f32 gnd_pos = dComIfG_Bgsp().GroundCross(&gndchk); if (gnd_pos != -1000000000.0f && current.pos.y <= gnd_pos) { if (dComIfG_Bgsp().GetPolyAtt0(gndchk) == 11) { speed.y = 50.0f; speedF = 15.0f; current.angle.y = (cM_rndFX(2.9f) * (f32)0x1000) - (f32)0x8000; mMode = 11; setBck(BCK_ZAN_SWAMP_FALL_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_ZAN_BB_V_JUMP, -1); cXyz pos(current.pos.x, gnd_pos, current.pos.z); cXyz size(1.5f, 1.5f, 1.5f); for (int i = 0; i < 4; i++) { static u16 w_eff_id[] = {0x01B8, 0x01B9, 0x01BA, 0x01BB}; field_0x389c[i] = dComIfGp_particle_setPolyColor(field_0x389c[i], w_eff_id[i], gndchk, &pos, &tevStr, &shape_angle, &size, 0, NULL, -1, NULL); } mSound.startCreatureSound(Z2SE_EN_ZAN_BB_WTR, 0, -1); } else { fopAcM_effSmokeSet1(&field_0x3894, &field_0x3898, ¤t.pos, NULL, 2.0f, &tevStr, 1); speedF = 0.0f; setBck(BCK_ZAN_SWAMP_LANDING, J3DFrameCtrl::EMode_NONE, 0.0f, 1.0f); mMode = 14; setTgHitBit(TRUE); setTgType(0xD8FBFDFF); field_0x702 = 0; field_0x6f0 = 150; field_0x70c = 1; } } } break; case 14: if (mpModelMorf->checkFrame(3)) { mSound.startCreatureSound(Z2SE_EN_ZAN_BB_LAND, 0, -1); } else if (mpModelMorf->checkFrame(18) || mpModelMorf->checkFrame(23)) { mSound.startCreatureSound(Z2SE_EN_ZAN_BB_FOOT, 0, -1); } if (mpModelMorf->checkFrame(5)) { speedF = 3.0f; } if (mpModelMorf->isStop()) { setActionMode(ACT_FLY_GROUND, 0); field_0x702 = 0; } break; } } /* 80642EC8-806430E0 004EA8 0218+00 1/1 0/0 0/0 .text executeFlyGround__10daB_ZANT_cFv */ void daB_ZANT_c::executeFlyGround() { switch (mMode) { case 0: if (mLastAction == ACT_DAMAGE || mLastAction == ACT_CONFUSE) { field_0x70c = 0; gravity = 0.0f; mFlyWarpPosID = (f32)mFlyWarpPosID + cM_rndF(1.9f) + 1.0f; mFlyWarpPos = fly_warp_pos[mFlyWarpPosID % 3]; field_0x711 = 2; setActionMode(ACT_WARP, 1); break; } speed.y = 0.0f; speedF = 0.0f; setBck(BCK_ZAN_LV1_FATIGUE, J3DFrameCtrl::EMode_LOOP, 5.0f, 1.0f); mMode = 1; field_0x702 = 0; mSound.startCreatureVoice(Z2SE_EN_ZAN_BB_V_ZEIZEI, -1); case 1: if (field_0x6f0 == 0) { field_0x70c = 0; gravity = 0.0f; mFlyWarpPosID = (f32)mFlyWarpPosID + cM_rndF(1.9f) + 1.0f; mFlyWarpPos = fly_warp_pos[mFlyWarpPosID % 3]; field_0x711 = 2; setActionMode(ACT_WARP, 1); } break; } } /* 806430E0-806432F8 0050C0 0218+00 1/1 0/0 0/0 .text checkSwimLinkNearMouth__10daB_ZANT_cFv */ bool daB_ZANT_c::checkSwimLinkNearMouth() { fopAc_ac_c* pmobile; fopAcM_SearchByID(mMobileIDs[mCorrectMobileNo], &pmobile); if (pmobile == NULL) { return false; } s16 mobile_angle = pmobile->shape_angle.y; cXyz check_area(cM_ssin(mobile_angle) * 900.0f, 0.0f, cM_scos(mobile_angle) * 900.0f); check_area += pmobile->current.pos; cXyz player_pos(daPy_getPlayerActorClass()->current.pos); if (check_area.absXZ(player_pos) < 400.0f && check_area.y - 300.0f < player_pos.y && check_area.y + 800.0f > player_pos.y) { return true; } return false; } /* 806432F8-8064350C 0052D8 0214+00 1/1 0/0 0/0 .text checkSwimLinkNear__10daB_ZANT_cFv */ bool daB_ZANT_c::checkSwimLinkNear() { fopAc_ac_c* pmobile; fopAcM_SearchByID(mMobileIDs[mCorrectMobileNo], &pmobile); if (pmobile == NULL) { return false; } if (checkSwimLinkNearMouth()) { if (field_0x706 != 0 && ((daB_ZANTZ_c*)pmobile)->getMouthMode() == 1) { s16 mobile_angle = pmobile->shape_angle.y; cXyz check_area(cM_ssin(mobile_angle) * 300.0f, 0.0f, cM_scos(mobile_angle) * 300.0f); check_area += pmobile->current.pos; if (check_area.abs(current.pos) < 300.0f) { setTgHitBit(FALSE); ((daB_ZANTZ_c*)pmobile)->setMouthMode(2); setActionMode(ACT_WATER, 27); } } ((daB_ZANTZ_c*)pmobile)->setSnortEffect(30); return true; } return false; } /* 8064350C-80643690 0054EC 0184+00 1/1 0/0 0/0 .text executeHook__10daB_ZANT_cFv */ void daB_ZANT_c::executeHook() { switch (mMode) { case 0: setTgHitBit(FALSE); setCoHitBit(FALSE); gravity = 0.0f; speed.y = 0.0f; speedF = 0.0f; field_0x705 = 0; field_0x706 = 0; setBck(BCK_ZAN_HOOK_HIT, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 2; field_0x6ff++; break; case 2: if (mpModelMorf->checkFrame(2)) { mSound.startCreatureVoice(Z2SE_EN_ZAN_OI_V_CAUGHT, -1); } if (mpModelMorf->isStop()) { mMode = 3; setBck(BCK_ZAN_HOOK_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); } case 3: if (!fopAcM_CheckStatus(this, 0x100000)) { setTgHitBit(TRUE); setCoHitBit(TRUE); setActionMode(ACT_SWIM, 10); } break; } } /* 80643690-80644074 005670 09E4+00 2/1 0/0 0/0 .text executeWater__10daB_ZANT_cFv */ void daB_ZANT_c::executeWater() { fopAc_ac_c* pmobile; fopAcM_SearchByID(mMobileIDs[mCorrectMobileNo], &pmobile); if (pmobile != NULL) { s16 mobile_angle = pmobile->shape_angle.y; cXyz sp58(cM_ssin(mobile_angle) * 300.0f, 0.0f, cM_scos(mobile_angle) * 300.0f); sp58 += pmobile->current.pos; switch (mMode) { case 0: if (mLastAction == ACT_SMALL_ATTACK) { mMode = 0x19; field_0x6f0 = 0x78; field_0x705 = 1; attention_info.flags = fopAc_AttnFlag_BATTLE_e; setBck(BCK_ZAN_FLOAT_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); } else if (field_0x705 != 0) { if (((daB_ZANTZ_c*)pmobile)->getAppearMode() == 3) { mMode = 15; } else { ((daB_ZANTZ_c*)pmobile)->setMouthMode(2); mMode = 27; } attention_info.flags = 0; } else { setActionMode(ACT_SWIM, 0); } break; case 15: { daPy_py_c* player = daPy_getPlayerActorClass(); if (player->current.pos.y < 1000.0f) { mMode = 20; if (mFightCycle == 0) { ((daB_ZANTZ_c*)pmobile)->setAppearMode(0); } else { for (int i = 0; i < 4; i++) { fopAcM_SearchByID(mMobileIDs[i], &pmobile); if (pmobile != NULL) { ((daB_ZANTZ_c*)pmobile)->setAppearMode(0); } } } field_0x704 = 0; } } break; case 20: old.pos = sp58; current.pos = old.pos; shape_angle.y = mobile_angle; if (((daB_ZANTZ_c*)pmobile)->getAppearMode() == 1) { mModeTimer = 30; mMode = 21; if (mFightCycle != 0) { // set zant to farthest mobile from player cXyz player_pos(daPy_getPlayerActorClass()->current.pos); f32 farthest_dist = 0.0f; int correct_no = 0; for (int i = 0; i < 4; i++) { fopAcM_SearchByID(mMobileIDs[i], &pmobile); if (pmobile != NULL && farthest_dist < pmobile->current.pos.abs(player_pos)) { farthest_dist = pmobile->current.pos.abs(player_pos); correct_no = i; } } mCorrectMobileNo = correct_no; } } break; case 21: if (mModeTimer == 0) { field_0x6fd = 1; if (mFightCycle == 0) { ((daB_ZANTZ_c*)pmobile)->setAppearMode(4); } else { int sp78 = 0; for (int i = 0; i < 4; i++) { fopAcM_SearchByID(mMobileIDs[i], &pmobile); if (pmobile != NULL && abs((s16)(fopAcM_searchPlayerAngleY(pmobile) - pmobile->shape_angle.y)) > 0x1000) { sp78++; } } if (sp78 != 0) { for (int i = 0; i < 4; i++) { fopAcM_SearchByID(mMobileIDs[i], &pmobile); if (pmobile != NULL) { ((daB_ZANTZ_c*)pmobile)->setAppearMode(5); } } field_0x6fd = 0; } } mMode = 22; } break; case 22: if (mFightCycle == 0) { if (((daB_ZANTZ_c*)pmobile)->getAppearMode() == 1) { ((daB_ZANTZ_c*)pmobile)->setSnortEffect(30); mModeTimer = 30; mMode = 23; } } else { int sp84 = 0; if (field_0x6fd == 0) { for (int i = 0; i < 4; i++) { fopAcM_SearchByID(mMobileIDs[i], &pmobile); if (pmobile != NULL && ((daB_ZANTZ_c*)pmobile)->isSearchContinue()) { if (abs((s16)(fopAcM_searchPlayerAngleY(pmobile) - pmobile->shape_angle.y)) < 0xC00) { sp84++; } } } if (sp84 == 4) { for (int i = 0; i < 4; i++) { fopAcM_SearchByID(mMobileIDs[i], &pmobile); if (pmobile != NULL) { ((daB_ZANTZ_c*)pmobile)->offSearchContinue(); } } field_0x6fd++; } } else { for (int i = 0; i < 4; i++) { fopAcM_SearchByID(mMobileIDs[i], &pmobile); if (pmobile != NULL && ((daB_ZANTZ_c*)pmobile)->getAppearMode() == 1) { sp84++; } } if (sp84 == 4) { for (int i = 0; i < 4; i++) { fopAcM_SearchByID(mMobileIDs[i], &pmobile); if (pmobile != NULL) { ((daB_ZANTZ_c*)pmobile)->setSnortEffect(30); } } mModeTimer = 30; mMode = 23; } } } break; case 23: if (mModeTimer == 0) { old.pos = sp58; current.pos = old.pos; ((daB_ZANTZ_c*)pmobile)->setMouthMode(0); mMode = 24; setTgHitBit(TRUE); field_0x706 = 1; } break; case 24: cLib_addCalcAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 8, 0x400, 0x80); if (((daB_ZANTZ_c*)pmobile)->getMouthMode() == 1) { attention_info.flags = fopAc_AttnFlag_BATTLE_e; field_0x703 = 8; field_0x6ff = 0; field_0x711 = 1; setActionMode(ACT_SMALL_ATTACK, 0); } break; case 25: if (field_0x6f0 == 0) { field_0x706 = 0; setTgHitBit(FALSE); ((daB_ZANTZ_c*)pmobile)->setMouthMode(2); mMode = 27; } break; case 27: if (((daB_ZANTZ_c*)pmobile)->getMouthMode() == 3) { current.pos = sp58; field_0x705 = 1; attention_info.flags = 0; if (mFightCycle == 0) { mMode = 30; mModeTimer = cM_rndF(30.0f) + 100.0f; } else if (field_0x712 == 0) { field_0x712++; mMode = 28; mModeTimer = 30; } else { mMode = 30; mModeTimer = cM_rndF(30.0f) + 100.0f; mCorrectMobileNo = (int)((f32)mCorrectMobileNo + cM_rndF(2.9f) + 1.0f) & 3; } } break; case 28: if (mModeTimer == 0) { ((daB_ZANTZ_c*)pmobile)->setAppearMode(2); mMode = 29; } break; case 29: current.pos = sp58; shape_angle.y = mobile_angle; if (((daB_ZANTZ_c*)pmobile)->getAppearMode() == 3) { mMode = 15; } break; case 30: if (mModeTimer == 0) { mModeTimer = 30; mMode = 21; } break; } } } /* 80644074-80644A3C 006054 09C8+00 2/1 0/0 0/0 .text executeSwim__10daB_ZANT_cFv */ void daB_ZANT_c::executeSwim() { fopAc_ac_c* pmobile; fopAcM_SearchByID(mMobileIDs[mCorrectMobileNo], &pmobile); if (pmobile != NULL) { s16 mobile_angle = pmobile->shape_angle.y; cXyz sp50(cM_ssin(mobile_angle) * 300.0f, 300.0f, cM_scos(mobile_angle) * 300.0f); sp50 += pmobile->current.pos; s16 sp10 = cLib_targetAngleY(&pmobile->current.pos, ¤t.pos); s16 spE = mobile_angle - sp10; switch (mMode) { case 10: if (field_0x6ff > 5) { field_0x6b8 = mobile_angle; mFlyWarpPos = sp50; field_0x705 = 1; field_0x711 = 1; setActionMode(ACT_WARP, 0); return; } setBck(BCK_ZAN_HOOK_RELEASE, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 11; case 11: if (current.pos.y < 50.0f) { cLib_addCalc2(¤t.pos.y, 50.0f, 0.1f, 10.0f); } else if (current.pos.y > 100.0f) { cLib_addCalc2(¤t.pos.y, 100.0f, 0.1f, 10.0f); } if (mpModelMorf->isStop()) { mMode = 0; } break; case 0: setBck(BCK_ZAN_SWIM, J3DFrameCtrl::EMode_LOOP, 5.0f, 1.0f); mpModelMorf->setFrame(10.0f); field_0x6cc = 0.0f; attention_info.flags = fopAc_AttnFlag_BATTLE_e; mMode = 1; field_0x702 = 0; case 1: case 2: if (abs(spE) < 0x1000) { if (mMode == 1) { field_0x6ac.set(cM_ssin(mobile_angle) * 600.0f, 300.0f, cM_scos(mobile_angle) * 600.0f); field_0x6ac += pmobile->current.pos; } else { field_0x6ac = sp50; } mMode = 4; } else { s16 spC; if (spE < 0) { spC = sp10 - 0x1000; } else { spC = sp10 + 0x1000; } field_0x6ac.set(cM_ssin(spC) * 1200.0f, 250.0f, cM_scos(spC) * 1200.0f); field_0x6ac += pmobile->current.pos; mMode = 3; } mModeTimer = 60; case 3: case 4: { if (current.pos.y < 50.0f) { cLib_addCalc2(¤t.pos.y, 50.0f, 0.1f, 10.0f); } f32 player_dist = fopAcM_searchPlayerDistance(this); s16 spA = -cLib_targetAngleX(¤t.pos, &field_0x6ac) + 0x4000; s16 sp8 = cLib_targetAngleY(¤t.pos, &field_0x6ac); f32 anm_frame = mpModelMorf->getFrame(); int sp64 = 0; if (anm_frame < 13.0f || anm_frame >= 45.0f) { sp64 = 1; } if ((13.0f <= anm_frame && anm_frame <= 19.0f) || (29.0f <= anm_frame && anm_frame <= 45.0f)) { sp64 = 2; } if (abs((s16)(sp8 - shape_angle.y)) < 0x2000) { switch (sp64) { case 0: cLib_chaseF(&field_0x6cc, 0.0f, 2.0f); break; case 1: cLib_chaseF(&field_0x6cc, 0.0f, 0.5f); break; case 2: cLib_chaseF(&field_0x6cc, 15.0f, 3.0f); break; } } else { switch (sp64) { case 0: cLib_chaseF(&field_0x6cc, 0.0f, 1.0f); break; case 1: cLib_chaseF(&field_0x6cc, 0.0f, 0.3f); break; case 2: cLib_chaseF(&field_0x6cc, 5.0f, 1.0f); break; } } if (sp64 == 2) { cLib_addCalcAngleS2(&shape_angle.y, sp8, 0x10, 0x180); cLib_addCalcAngleS2(&shape_angle.x, spA, 0x10, 0x400); } else { cLib_addCalcAngleS2(&shape_angle.y, sp8, 0x10, 0x80); cLib_addCalcAngleS2(&shape_angle.x, spA, 0x10, 0x200); } current.angle.y = shape_angle.y; current.angle.x = cLib_targetAngleX(¤t.pos, &field_0x6ac); if (mModeTimer != 0) { speed.y = (field_0x6cc / 2) * cM_ssin(current.angle.x); speedF = std::abs((field_0x6cc / 2) * cM_scos(current.angle.x)); } else { speed.y = field_0x6cc * cM_ssin(current.angle.x); speedF = std::abs(field_0x6cc * cM_scos(current.angle.x)); } if (current.pos.absXZ(sp50) < 200.0f) { mMode = 6; attention_info.flags = 0; setTgHitBit(FALSE); ((daB_ZANTZ_c*)pmobile)->setMouthMode(2); mModeTimer = 60; } else if (current.pos.abs(field_0x6ac) < 200.0f) { if (mMode == 3) { mMode = 1; } else { mMode = 2; } } } break; case 6: cLib_chaseF(&speedF, 0.0f, 0.5f); cLib_chaseF(&speed.y, 5.0f, 0.5f); cLib_addCalcAngleS2(&shape_angle.y, mobile_angle, 0x10, 0x200); cLib_addCalcAngleS2(&shape_angle.x, 0, 0x10, 0x200); if (!speedF && speed.y == 5.0f) { mMode = 7; gravity = -1.0f; maxFallSpeed = -5.0f; } break; case 7: { field_0x706 = 1; maxFallSpeed = -100.0f; cXyz target(sp50.x, current.pos.y, sp50.z); cLib_chasePosXZ(¤t.pos, target, 3.0f); if (((daB_ZANTZ_c*)pmobile)->getMouthMode() == 3) { field_0x705 = 1; mModeTimer = 30; setActionMode(ACT_WATER, 27); shape_angle.x = 0; shape_angle.y = 0; gravity = 0.0f; speed.y = 0.0f; speedF = 0.0f; } } break; } if (checkBck(BCK_ZAN_SWIM)) { if (mpModelMorf->checkFrame(12)) { mSound.startCreatureSound(Z2SE_EN_ZAN_OI_SWIM1, 0, -1); } else if (mpModelMorf->checkFrame(28)) { mSound.startCreatureSound(Z2SE_EN_ZAN_OI_SWIM2, 0, -1); } } } } /* 80644A3C-80645014 006A1C 05D8+00 1/1 0/0 0/0 .text executeSimaJump__10daB_ZANT_cFv */ void daB_ZANT_c::executeSimaJump() { switch (mMode) { case 0: setTgHitBit(TRUE); mBodySphCc[0].OnTgNoHitMark(); mBodySphCc[1].OnTgNoHitMark(); setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); if (mLastAction == ACT_SMALL_ATTACK) { field_0x702 = 0; mMode = 10; if (mFightCycle == 0) { field_0x6f0 = 120; } else { field_0x6f0 = 105; } attention_info.flags = fopAc_AttnFlag_BATTLE_e; setBck(BCK_ZAN_LV1_FATIGUE, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_ZAN_MG_V_ZEIZEI, -1); return; } if (mLastAction == ACT_CONFUSE || mLastAction == ACT_DAMAGE) { mMode = 11; return; } attention_info.flags = fopAc_AttnFlag_BATTLE_e; field_0x6ec = 0; mMode = 1; gravity = -5.0f; field_0x6fd = 0; if (field_0x70f < 2) { if (field_0x70f == 0) { mModeTimer = 150; } field_0x70f++; } else { mModeTimer = cM_rndF(50.0f) + 100.0f; if (field_0x70b >= 4) { mModeTimer = 0; } else if (field_0x70b < 2 && mModeTimer < 120) { mModeTimer = 120; } if (mModeTimer < 120) { field_0x70b = 0; mModeTimer = 0; if (mFightCycle == 0) { field_0x703 = l_HIO.mBulletNum; } else { field_0x703 = 8; } field_0x711 = 0; setActionMode(ACT_SMALL_ATTACK, 0); field_0x702 = 0; return; } } field_0x70b++; if (mFightCycle != 0) { mModeTimer -= 50; } setTgHitBit(FALSE); case 1: case 2: case 3: case 4: case 5: cLib_addCalcAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 8, 0x800, 0x80); if (fopAcM_searchPlayerDistance(this) < 550.0f) { if (mAcch.ChkGroundHit()) { mMode = 11; return; } } else { if (checkAvoidWeapon(FALSE)) { mMode = 11; return; } } if (mMode == 1) { if (mAcch.ChkGroundHit() && field_0x6ec == 0) { setBck(BCK_ZAN_JUMP_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 2; } } else if (mMode == 2) { if (mpModelMorf->checkFrame(6)) { mSound.startCreatureVoice(Z2SE_EN_ZAN_MG_V_JUMP, -1); } if (mpModelMorf->checkFrame(10)) { speed.y = 55.0f; mMode = 3; } } else if (mMode == 3) { if (speed.y <= 0.0f) { setBck(BCK_ZAN_JUMP_B, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 4; } } else if (mMode == 4) { if (mpModelMorf->checkFrame(7)) { mpModelMorf->setPlaySpeed(0.0f); } if (mAcch.ChkGroundHit()) { mSound.startCreatureSound(Z2SE_EN_ZAN_MG_LAND, 0, -1); mpModelMorf->setPlaySpeed(1.0f); mpModelMorf->setFrame(8.0f); mMode = 5; } } else if (mpModelMorf->isStop()) { fopAcM_effSmokeSet1(&field_0x3894, &field_0x3898, ¤t.pos, NULL, 2.0f, &tevStr, 1); mMode = 1; field_0x6ec = 5; } if (mAcch.ChkGroundHit() && mModeTimer == 0) { mMode = 11; } break; case 10: if (field_0x6f0 != 0) { return; } case 11: s16 var_r27 = cM_atan2s(daPy_getPlayerActorClass()->current.pos.x, daPy_getPlayerActorClass()->current.pos.z); s16 sp1C = (f32)(var_r27 + 0x8000) + cM_rndFX(4.0f) * (f32)0x800; mFlyWarpPos.set(cM_ssin(sp1C) * 1100.0f, 1000.0f, cM_scos(sp1C) * 1100.0f); field_0x6b8 = sp1C + 0x8000; field_0x711 = 0; setActionMode(ACT_WARP, 0); break; } } /* 80645014-8064524C 006FF4 0238+00 1/1 0/0 0/0 .text executeIceDemo__10daB_ZANT_cFv */ void daB_ZANT_c::executeIceDemo() { switch (mMode) { case 0: current.pos.set(-140.0f, 300.0f, 700.0f); old.pos = current.pos; case 100: for (int i = 0; i < 11; i++) { mFoot2Cc[i].OnTgSetBit(); } for (int i = 0; i < 6; i++) { mFootCc[iron_tg_cc[i]].OnTgSetBit(); mFootCc[iron_tg_cc[i]].OnTgShield(); mFootCc[iron_tg_cc[i]].OnTgIronBallRebound(); } setBck(BCK_ZAN_HUGE, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); speedF = 0.0f; gravity = 0.0f; shape_angle.z = 0; shape_angle.x = 0; attention_info.flags = 0; maxFallSpeed = -100.0f; mMode = 1; field_0x70e = 0; case 1: if (mpModelMorf->checkFrame(8)) { mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_HUGE, -1); } cLib_chaseF(&mModelScaleXZ, 10.0f, 0.1f); cLib_chaseF(&mModelScaleY, 10.0f, 0.1f); if (mpModelMorf->checkFrame(115)) { mMode = 2; } break; case 2: cLib_chaseF(&speed.y, 50.0f, 5.0f); if (mpModelMorf->isStop()) { setBck(BCK_ZAN_FLOAT_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); setActionMode(ACT_ICE_JUMP, 3); } break; } } /* 8064524C-80645DA4 00722C 0B58+00 2/1 0/0 0/0 .text executeIceJump__10daB_ZANT_cFv */ void daB_ZANT_c::executeIceJump() { cXyz sp44(daPy_getPlayerActorClass()->current.pos); f32 var_f31 = sp44.absXZ(current.pos); cXyz sp50; cXyz sp5C; cXyz sp68; switch (mMode) { case 0: setBck(BCK_ZAN_HUGE_LANDING, J3DFrameCtrl::EMode_NONE, 3.0f, -1.0f); mMode = 1; attention_info.flags = 0; field_0x70e = 0; mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_JUMP, -1); case 1: if (mpModelMorf->checkFrame(10)) { mMode = 2; speed.y = 130.0f; current.angle.y = shape_angle.y; } break; case 2: if (mpModelMorf->isStop()) { setBck(BCK_ZAN_FLOAT_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 3; } case 3: cLib_chaseF(&speed.y, 15.0f, 5.0f); if (current.pos.y > 1500.0f) { field_0x70e = 3; } if (current.pos.y > 2000.0f) { mMode = 4; mModeTimer = 90; current.angle.y = shape_angle.y; } break; case 4: cLib_chaseF(&speed.y, 0.0f, 1.0f); if (var_f31 < 300.0f) { var_f31 -= 50.0f; if (var_f31 < 0.0f) { var_f31 = 0.0f; } cLib_chaseF(&speedF, var_f31 / 10.0f, 1.0f); } else { cLib_chaseF(&speedF, 30.0f, 1.0f); cLib_addCalcAngleS(¤t.angle.y, fopAcM_searchPlayerAngleY(this), 8, 0x400, 0x80); } shape_angle.y = current.angle.y; if (mModeTimer == 0 && sp44.absXZ(current.pos) < 550.0f) { mMode = 5; gravity = -5.0f; speed.y = 0.0f; speedF = 0.0f; setBck(BCK_ZAN_HUGE_LANDING, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_LAND, -1); mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTL)); mDoMtx_stack_c::transM(10.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(&sp50); mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTR)); mDoMtx_stack_c::transM(10.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(&sp5C); if (sp44.absXZ(sp50) < sp44.absXZ(sp5C)) { field_0x70f = 0; } else { field_0x70f = 1; } } break; case 5: case 6: if (field_0x70f == 0) { mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTL)); } else { mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTR)); } mDoMtx_stack_c::transM(10.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(&sp5C); sp68 = sp5C - sp44; current.pos -= sp68 * (20.0f / sp68.abs()); if (mMode == 5) { if (mpModelMorf->checkFrame(10)) { mpModelMorf->setPlaySpeed(0.0f); mMode = 6; mFoot2Cc[0].OnAtSetBit(); mFoot2Cc[4].OnAtSetBit(); mFoot2Cc[0].SetAtAtp(4); mFoot2Cc[4].SetAtAtp(4); } } else { if (mAcch.ChkGroundHit()) { field_0x70e = 1; mSound.startCreatureSound(Z2SE_EN_ZAN_YO_LAND_HUGE, 0, -1); dComIfGp_getVibration().StartShock(8, 31, cXyz(0.0f, 1.0f, 0.0f)); setIceLandingEffect(0); setIceLandingEffect(1); mFoot2Cc[0].OffAtSetBit(); mFoot2Cc[4].OffAtSetBit(); mFoot2Cc[0].SetAtAtp(2); mFoot2Cc[4].SetAtAtp(2); gravity = 0.0f; mpModelMorf->setPlaySpeed(1.0f); mMode = 7; attention_info.flags = fopAc_AttnFlag_BATTLE_e; } } break; case 7: if (mpModelMorf->checkFrame(15)) { for (int i = 0; i < 6; i++) { mFootCc[iron_tg_cc[i]].OffTgShield(); } } if (mpModelMorf->isStop()) { setActionMode(ACT_ICE_STEP, 0); } break; } } /* 80645DA4-8064687C 007D84 0AD8+00 1/1 0/0 0/0 .text executeIceStep__10daB_ZANT_cFv */ void daB_ZANT_c::executeIceStep() { s16 var_r29 = shape_angle.y; int var_r28; cXyz sp60; switch (mMode) { case 0: mModeTimer = cM_rndFX(50.0f) + 600.0f; for (int i = 0; i < 6; i++) { mFootCc[iron_tg_cc[i]].OffTgShield(); } case 1: { f32 var_f30 = cM_rnd(); s16 sp8 = shape_angle.y - fopAcM_searchPlayerAngleY(this); f32 var_f29 = fopAcM_searchPlayerDistance(this); if (var_f29 < 300.0f) { if (sp8 < 0) { if (var_f30 < 0.5f) { var_r28 = 4; } else { var_r28 = 5; } field_0x6ba = fopAcM_searchPlayerAngleY(this) + 0x1000; } else { if (var_f30 < 0.5f) { var_r28 = 2; } else { var_r28 = 3; } field_0x6ba = fopAcM_searchPlayerAngleY(this) - 0x1000; } } else if (var_f29 < 400.0f) { if (sp8 > 0) { if (var_f30 < 0.5f) { var_r28 = 2; } else { var_r28 = 3; } field_0x6ba = fopAcM_searchPlayerAngleY(this) + 0x4000; } else { if (var_f30 < 0.5f) { var_r28 = 4; } else { var_r28 = 5; } field_0x6ba = fopAcM_searchPlayerAngleY(this) - 0x4000; } } else if (abs(sp8) > 0x4000) { if (sp8 < 0) { var_r28 = 4; field_0x6ba = fopAcM_searchPlayerAngleY(this) - 0x1000; } else { var_r28 = 2; field_0x6ba = fopAcM_searchPlayerAngleY(this) + 0x1000; } } else { if (sp8 < 0) { var_r28 = 2; field_0x6ba = fopAcM_searchPlayerAngleY(this) + 0x4000; } else { var_r28 = 4; field_0x6ba = fopAcM_searchPlayerAngleY(this) - 0x4000; } } switch (var_r28) { case 2: setBck(BCK_ZAN_TRAMPLEA, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 2; break; case 3: setBck(BCK_ZAN_TRAMPLEC, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 3; break; case 4: setBck(BCK_ZAN_TRAMPLEB, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 4; break; case 5: setBck(BCK_ZAN_TRAMPLED, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 5; break; } } case 2: case 3: case 4: case 5: f32 anm_frame = mpModelMorf->getFrame(); int sp98 = 0; if (mMode == 2) { if (8.0f <= anm_frame && anm_frame <= 24.0f) { sp98 = 1; } if (mpModelMorf->checkFrame(23)) { mFoot2Cc[4].OnAtSetBit(); mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_FUMI_1, -1); } if (mpModelMorf->checkFrame(28)) { mSound.startCreatureSound(Z2SE_EN_ZAN_YO_FUMI, 0, -1); dComIfGp_getVibration().StartShock(6, 31, cXyz(0.0f, 1.0f, 0.0f)); setIceLandingEffect(1); } if (mpModelMorf->checkFrame(30)) { mFoot2Cc[4].OffAtSetBit(); } } else if (mMode == 3) { if (7.0f <= anm_frame && anm_frame <= 14.0f) { sp98 = 1; } if (22.0f <= anm_frame && anm_frame <= 28.0f) { sp98 = 1; } if (mpModelMorf->checkFrame(13) || mpModelMorf->checkFrame(27)) { mFoot2Cc[4].OnAtSetBit(); if (mpModelMorf->checkFrame(13)) { mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_FUMI_2, -1); } else { mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_FUMI_3, -1); } } if (mpModelMorf->checkFrame(17) || mpModelMorf->checkFrame(30)) { mSound.startCreatureSound(Z2SE_EN_ZAN_YO_FUMI, 0, -1); dComIfGp_getVibration().StartShock(6, 31, cXyz(0.0f, 1.0f, 0.0f)); setIceLandingEffect(1); } if (mpModelMorf->checkFrame(18) || mpModelMorf->checkFrame(31)) { mFoot2Cc[4].OffAtSetBit(); } } else if (mMode == 4) { if (8.0f <= anm_frame && anm_frame <= 23.0f) { sp98 = 1; } if (mpModelMorf->checkFrame(22)) { mFoot2Cc[0].OnAtSetBit(); mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_FUMI_1, -1); } if (mpModelMorf->checkFrame(28)) { mSound.startCreatureSound(Z2SE_EN_ZAN_YO_FUMI, 0, -1); dComIfGp_getVibration().StartShock(6, 31, cXyz(0.0f, 1.0f, 0.0f)); setIceLandingEffect(0); } if (mpModelMorf->checkFrame(30)) { mFoot2Cc[0].OffAtSetBit(); } } else { if (7.0f <= anm_frame && anm_frame <= 13.0f) { sp98 = 1; } if (21.0f <= anm_frame && anm_frame <= 27.0f) { sp98 = 1; } if (mpModelMorf->checkFrame(11) || mpModelMorf->checkFrame(26)) { mFoot2Cc[0].OnAtSetBit(); if (mpModelMorf->checkFrame(11)) { mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_FUMI_2, -1); } else { mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_FUMI_3, -1); } } if (mpModelMorf->checkFrame(16) || mpModelMorf->checkFrame(31)) { mSound.startCreatureSound(Z2SE_EN_ZAN_YO_FUMI, 0, -1); dComIfGp_getVibration().StartShock(6, 31, cXyz(0.0f, 1.0f, 0.0f)); setIceLandingEffect(0); } if (mpModelMorf->checkFrame(18) || mpModelMorf->checkFrame(32)) { mFoot2Cc[0].OffAtSetBit(); } } if (sp98 != 0) { cLib_addCalcAngleS2(&shape_angle.y, field_0x6ba, 0x10, 0x400); } if (mMode <= 3) { mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(var_r29); mDoMtx_stack_c::transM(mModelScaleXZ * 35.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(&sp60); mDoMtx_stack_c::transS(sp60); mDoMtx_stack_c::YrotM(shape_angle.y); mDoMtx_stack_c::transM(mModelScaleXZ * -35.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(¤t.pos); } else { mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(var_r29); mDoMtx_stack_c::transM(mModelScaleXZ * -30.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(&sp60); mDoMtx_stack_c::transS(sp60); mDoMtx_stack_c::YrotM(shape_angle.y); mDoMtx_stack_c::transM(mModelScaleXZ * 30.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(¤t.pos); } if (mpModelMorf->isStop()) { if (mModeTimer != 0) { mMode = 1; } else { for (int i = 0; i < 6; i++) { mFootCc[iron_tg_cc[i]].OnTgShield(); } setActionMode(ACT_ICE_JUMP, 0); } } break; } } /* 8064687C-806471CC 00885C 0950+00 2/1 0/0 0/0 .text executeIceDamage__10daB_ZANT_cFv */ void daB_ZANT_c::executeIceDamage() { static f32 const damage_scale[] = { 10.0f, 8.0f, 7.5f, 6.0f, 4.5f, 3.0f, 2.0f, 1.4f, 1.0f, 0.69999999f, 0.5f, }; static f32 const damage_jump_speed[] = { 100.0f, 95.0f, 90.0f, 85.0f, 80.0f, 75.0f, 70.0f, 65.0f, 60.0f, 55.0f, 50.0f }; daPy_py_c* player = daPy_getPlayerActorClass(); if (mMode >= 10 && mModeTimer == 0) { for (int i = 0; i < 11; i++) { mFoot2Cc[i].OnTgShield(); mFoot2Cc[i].OffTgSetBit(); mFoot2Cc[i].OffTgNoHitMark(); } for (int i = 0; i < 6; i++) { mFootCc[iron_tg_cc[i]].OffTgSetBit(); mFootCc[iron_tg_cc[i]].OnTgShield(); mFootCc[iron_tg_cc[i]].OnTgIronBallRebound(); } } switch (mMode) { case 0: case 1: field_0x70e = 2; if (mMode == 0) { setBck(BCK_ZAN_SHIND_L, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f); } else { setBck(BCK_ZAN_SHIND_R, J3DFrameCtrl::EMode_LOOP, 10.0f, 1.0f); } mFoot2Cc[0].OffAtSetBit(); mFoot2Cc[4].OffAtSetBit(); for (int i = 0; i < 6; i++) { mFootCc[iron_tg_cc[i]].OnTgShield(); } current.angle.y = shape_angle.y; mMode = 2; mModeTimer = 300; field_0x70b = 0; field_0x70b++; field_0x6cc = (mModelScaleXZ - damage_scale[field_0x70b]) / 3.0f; case 2: if (mpModelMorf->checkFrame(6) || mpModelMorf->checkFrame(19)) { if (mpModelMorf->getFrame() < 14) { mpModelMorf->setFrame(6); } else { mpModelMorf->setFrame(19); } if (field_0x70b <= 8) { speedF = 25.0f; } else if (field_0x70b == 9) { if (mFightCycle == 0) { speedF = 20.0f; } else { speedF = 23.0f; } } else if (mFightCycle == 0) { speedF = 15.0f; } else { speedF = 22.0f; } speed.y = damage_jump_speed[field_0x70b]; gravity = -15.0f; mMode = 3; mSound.startCreatureVoice(Z2SE_EN_ZAN_YO_V_KENKEN, -1); } else { if (field_0x70b <= 10) { cLib_addCalc2(&mModelScaleXZ, damage_scale[field_0x70b], 0.5f, field_0x6cc); } else { cLib_chaseF(&mModelScaleXZ, 0.5f, 0.1f); } mModelScaleY = mModelScaleXZ; cLib_addCalcAngleS2(&shape_angle.y, field_0x6ba, 8, 0x1000); current.angle.y = shape_angle.y; speedF = 0.0f; if (mModeTimer == 0) { mMode = 30; } } break; case 3: if (mpModelMorf->checkFrame(12) || mpModelMorf->checkFrame(25)) { if (mpModelMorf->getFrame() < 14) { mpModelMorf->setFrame(12); } else { mpModelMorf->setFrame(25); } mpModelMorf->setPlaySpeed(0.0f); mMode = 4; } break; case 4: if (mAcch.ChkGroundHit()) { s16 sp8 = fopAcM_searchPlayerAngleY(this) + (4096.0f * cM_rndFX(4.9f)) + 32768.0f; if (current.pos.absXZ() > 1200.0f) { sp8 = cM_atan2s(-current.pos.x, -current.pos.z); } field_0x6ba = sp8; if (field_0x70b < 10) { field_0x70b++; } field_0x6cc = (mModelScaleXZ - damage_scale[field_0x70b]) / 3.0f; mpModelMorf->setPlaySpeed((10.0f - mModelScaleXZ) / 10.0f + 1.0f); if (field_0x70b == 8) { for (int i = 0; i < 11; i++) { mFoot2Cc[i].OffTgShield(); mFoot2Cc[i].OnTgNoHitMark(); } for (int i = 0; i < 6; i++) { mFootCc[iron_tg_cc[i]].OffTgShield(); mFootCc[iron_tg_cc[i]].OffTgIronBallRebound(); } } mSound.startCreatureSound(Z2SE_EN_ZAN_YO_LAND, 0, -1); mMode = 2; } break; case 10: if (setNextDamageMode(0)) { return; } if (cM_rnd() < 0.5f) { setBck(BCK_ZAN_DAMAGEL_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); } else { setBck(BCK_ZAN_DAMAGER_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); } mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG, -1); speed.y = 0.0f; speedF = 0.0f; mMode = 11; case 11: cLib_chaseF(&mModelScaleXZ, 0.5f, 0.1f); mModelScaleY = mModelScaleXZ; if (mpModelMorf->isStop()) { mMode = 12; if (mModeTimer >= 30) { mModeTimer = 30; } setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); } break; case 12: if (mModeTimer == 0) { mMode = 30; } break; case 20: setBck(BCK_ZAN_GROUND_REACTION, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_ZAN_V_NO_DMG, -1); mMode = 21; speed.y = 0.0f; speedF = 0.0f; case 21: if (mpModelMorf->isStop()) { mMode = 30; } break; case 40: setBck(BCK_ZAN_FAINT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 41; speed.y = 0.0f; speedF = 0.0f; mModeTimer = 30; case 41: if (mModeTimer == 0) { mMode = 30; } break; case 30: for (int i = 0; i < 11; i++) { mFoot2Cc[i].OnTgShield(); mFoot2Cc[i].OffTgSetBit(); mFoot2Cc[i].OffTgNoHitMark(); } for (int i = 0; i < 6; i++) { mFootCc[iron_tg_cc[i]].OffTgSetBit(); mFootCc[iron_tg_cc[i]].OnTgShield(); mFootCc[iron_tg_cc[i]].OnTgIronBallRebound(); } if (!setNextDamageMode(1)) { mFlyWarpPos.set(0.0f, 300.0f, 0.0f); field_0x711 = 1; setActionMode(ACT_WARP, 1); gravity = 0.0f; } break; } } /* 806471CC-806473E4 0091AC 0218+00 1/1 0/0 0/0 .text setFarPillarPos__10daB_ZANT_cFv */ void daB_ZANT_c::setFarPillarPos() { fopAc_ac_c* ppillar; cXyz player_pos(daPy_getPlayerActorClass()->current.pos); int pillar_no = -1; f32 farthest_dist = 0.0f; for (int i = 0; i < 8; i++) { if (i != field_0x70a) { fopAcM_SearchByID(mPillarIDs[i], &ppillar); if (ppillar != NULL) { f32 dist = player_pos.abs(ppillar->current.pos); if (dist > farthest_dist) { pillar_no = i; farthest_dist = dist; } } } } if (pillar_no != -1) { fopAcM_SearchByID(mPillarIDs[pillar_no], &ppillar); if (ppillar != NULL) { mFlyWarpPos = ppillar->current.pos; mFlyWarpPos.y += 500.0f; field_0x709 = pillar_no; field_0x708 = pillar_no; field_0x70a = pillar_no; field_0x71b = 1; } } } /* 806473E4-80647468 0093C4 0084+00 4/4 0/0 0/0 .text setNearPillarPos__10daB_ZANT_cFv */ void daB_ZANT_c::setNearPillarPos() { fopAc_ac_c* ppillar; fopAcM_SearchByID(mPillarIDs[8], &ppillar); if (ppillar != NULL) { mFlyWarpPos = ppillar->current.pos; mFlyWarpPos.y += 500.0f; field_0x709 = 8; field_0x708 = 8; field_0x70a = 8; field_0x71b = 0; } } /* 80647468-806474F4 009448 008C+00 1/1 0/0 0/0 .text setNextPillarInfo__10daB_ZANT_cFi */ void daB_ZANT_c::setNextPillarInfo(int i_pillarNo) { fopAc_ac_c* ppillar; fopAcM_SearchByID(mPillarIDs[i_pillarNo], &ppillar); if (ppillar != NULL) { field_0x6ac = ppillar->current.pos; field_0x6ac.y += 500.0f; field_0x708 = field_0x709; field_0x709 = i_pillarNo; } } /* 806474F4-80647A34 0094D4 0540+00 1/1 0/0 0/0 .text setNextPillarPos__10daB_ZANT_cFv */ void daB_ZANT_c::setNextPillarPos() { fopAc_ac_c* ppillar; cXyz player_pos(daPy_getPlayerActorClass()->current.pos); int pillar_no = -1; f32 nearest_dist = 10000.0f; if (field_0x708 != 8 && field_0x709 != 8 && cM_rnd() < 0.5) { fopAcM_SearchByID(mPillarIDs[8], &ppillar); if (ppillar != NULL && player_pos.absXZ(ppillar->current.pos) > 500.0f) { setNextPillarInfo(8); return; } } if (field_0x709 == 8) { fopAcM_SearchByID(mPillarIDs[8], &ppillar); if (ppillar != NULL) { cXyz pillar_pos(ppillar->current.pos); s16 sp8 = cLib_targetAngleY(&pillar_pos, &player_pos); for (int i = 0; i < 8; i++) { if (i != field_0x708 && i != field_0x709) { fopAcM_SearchByID(mPillarIDs[i], &ppillar); if (ppillar != NULL && abs((s16)(cLib_targetAngleY(&pillar_pos, &ppillar->current.pos) - sp8)) > 0x6000) { setNextPillarInfo(i); return; } } } } } for (int i = 0; i < 8; i++) { if (i != field_0x708 && i != field_0x709) { fopAcM_SearchByID(mPillarIDs[i], &ppillar); if (ppillar != NULL && player_pos.absXZ(ppillar->current.pos) > 500.0f) { f32 dist = current.pos.abs(ppillar->current.pos); if (dist < nearest_dist) { pillar_no = i; nearest_dist = dist; } } } } if (pillar_no != -1) { setNextPillarInfo(pillar_no); } } /* 80647A34-80647AC8 009A14 0094+00 1/1 0/0 0/0 .text checkPillarSwing__10daB_ZANT_cFv */ void daB_ZANT_c::checkPillarSwing() { if (field_0x707 != 0) { fopAc_ac_c* ppillar; fopAcM_SearchByID(mPillarIDs[field_0x70a], &ppillar); if (ppillar != NULL && ((daPillar_c*)ppillar)->checkRollAttack()) { if (mAction != ACT_MONKEY_FALL) { setActionMode(ACT_MONKEY_FALL, 0); } else { setActionMode(ACT_MONKEY_FALL, 10); } } } } /* 80647AC8-806481F4 009AA8 072C+00 1/1 0/0 0/0 .text executeMonkey__10daB_ZANT_cFv */ void daB_ZANT_c::executeMonkey() { fopAc_ac_c* ppillar; switch (mMode) { case 0: gravity = -5.0f; field_0x707 = 1; setTgHitBit(FALSE); mBodySphCc[0].OnTgNoHitMark(); mBodySphCc[1].OnTgNoHitMark(); field_0x708 = field_0x709 = field_0x70a; if (mLastAction == ACT_WARP) { if (field_0x71b != 0) { field_0x71b = 0; field_0x703 = l_HIO.mBulletNum; field_0x711 = 0; setActionMode(ACT_SMALL_ATTACK, 0); setNextPillarPos(); return; } setNextPillarPos(); setBck(BCK_ZAN_LV1_JUMP_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 8; } else if (mLastAction == ACT_SMALL_ATTACK) { mMode = 5; setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mModeTimer = 0; } else { mMode = 5; setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); } field_0x70b = cM_rndF(2.9f) + 3.0f; field_0x6fd = 0; field_0x71b = 0; break; case 1: if (mpModelMorf->checkFrame(10) || mpModelMorf->checkFrame(14)) { mSound.startCreatureVoice(Z2SE_EN_ZAN_MK_LAND, -1); } if (mpModelMorf->isStop()) { field_0x6fd++; if (field_0x6fd >= field_0x70b) { if (mFightCycle != 0) { setFarPillarPos(); field_0x711 = 0; setActionMode(ACT_WARP, 1); } else { setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 2; } } else { mMode = 5; setBck(BCK_ZAN_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); } } break; case 2: cLib_addCalcAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 8, 0x800, 0x80); if (abs((s16)(shape_angle.y - fopAcM_searchPlayerAngleY(this))) < 0x2000) { field_0x703 = l_HIO.mBulletNum; field_0x711 = 0; setActionMode(ACT_SMALL_ATTACK, 0); } break; case 5: setTgHitBit(FALSE); setNextPillarPos(); mMode = 6; case 6: cLib_addCalcAngleS2(&shape_angle.y, cLib_targetAngleY(¤t.pos, &field_0x6ac), 8, 0x800); if (mModeTimer == 0 && mAcch.ChkGroundHit()) { setBck(BCK_ZAN_LV1_JUMP_A, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 8; } break; case 8: cLib_addCalcAngleS2(&shape_angle.y, cLib_targetAngleY(¤t.pos, &field_0x6ac), 8, 0x800); if (mpModelMorf->checkFrame(13)) { mSound.startCreatureVoice(Z2SE_EN_ZAN_MK_V_JUMP, -1); mModeTimer = 18; speed.y = 45.0f; mMode = 9; field_0x707 = 0; fopAcM_SearchByID(mPillarIDs[field_0x70a], &ppillar); if (ppillar != NULL) { ((daPillar_c*)ppillar)->setShake(daPillar_c::SHAKE_WEAK); } } break; case 9: if (mModeTimer != 0) { cXyz sp2C(field_0x6ac.x, current.pos.y, field_0x6ac.z); cLib_chasePosXZ(¤t.pos, sp2C, field_0x6ac.absXZ(current.pos) / mModeTimer); } if (mModeTimer == 8) { setBck(BCK_ZAN_LV1_JUMP_B, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); } if (mAcch.ChkGroundHit()) { current.pos = field_0x6ac; field_0x707 = 1; field_0x70a = field_0x709; fopAcM_SearchByID(mPillarIDs[field_0x70a], &ppillar); if (ppillar != NULL) { ((daPillar_c*)ppillar)->setShake(daPillar_c::SHAKE_WEAK); } mMode = 1; field_0x6fd++; } break; case 100: target_info_count = 0; fpcM_Search(s_pillar_sub, this); if (target_info_count < 8 || mPillarIDs[8] == fpcM_ERROR_PROCESS_ID_e) { for (int i = 0; i < 9; i++) { mPillarIDs[i] = fpcM_ERROR_PROCESS_ID_e; } } else { setNearPillarPos(); field_0x711 = 0; setActionMode(ACT_WARP, 1); } break; } } /* 806481F4-80648544 00A1D4 0350+00 2/1 0/0 0/0 .text executeMonkeyFall__10daB_ZANT_cFv */ void daB_ZANT_c::executeMonkeyFall() { switch (mMode) { case 0: case 20: setTgHitBit(TRUE); mModeTimer = 90; if (mMode == 20) { mModeTimer = 30; } setBck(BCK_ZAN_FAINT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 1; mBodySphCc[0].OffTgNoHitMark(); mBodySphCc[1].OffTgNoHitMark(); mSound.startCreatureVoice(Z2SE_EN_ZAN_MK_V_OTT, -1); case 1: if (mModeTimer == 0) { setActionMode(ACT_MONKEY, 0); } break; case 10: setBck(BCK_ZAN_FALL, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mMode = 11; field_0x707 = 0; setTgHitBit(FALSE); speedF = 0.0f; case 11: if (mpModelMorf->checkFrame(5)) { mSound.startCreatureVoice(Z2SE_EN_ZAN_MK_V_FALL, -1); } if (mpModelMorf->isStop()) { cXyz offset(-30.0f, -170.0f, -175.0f); cLib_offsetPos(¤t.pos, ¤t.pos, shape_angle.y, &offset); old.pos = current.pos; speed.y = -15.0f; speedF = 8.0f; current.angle.y = shape_angle.y + 0x8000; setBck(BCK_ZAN_LANDING, J3DFrameCtrl::EMode_NONE, 0.0f, 0.0f); mMode = 12; mBodySphCc[0].OnAtSetBit(); mBodySphCc[1].OnAtSetBit(); } break; case 12: if (mAcch.ChkGroundHit()) { mSound.startCreatureSound(Z2SE_EN_ZAN_MK_UMARU, 0, -1); setMonkeyFallEffect(); dComIfGp_getVibration().StartShock(3, 31, cXyz(0.0f, 1.0f, 0.0f)); mBodySphCc[0].OffAtSetBit(); mBodySphCc[1].OffAtSetBit(); speedF = 0.0f; mpModelMorf->setPlaySpeed(1.0f); mMode = 13; field_0x702 = 0; setTgHitBit(TRUE); field_0x6f0 = 120; } break; case 13: if (mpModelMorf->isStop()) { setActionMode(ACT_MONKEY_DAMAGE, 5); } break; } } /* 80648544-80648778 00A524 0234+00 1/1 0/0 0/0 .text executeMonkeyDamage__10daB_ZANT_cFv */ void daB_ZANT_c::executeMonkeyDamage() { switch (mMode) { case 0: if (setNextDamageMode(0)) { setTgHitBit(FALSE); return; } setBck(BCK_ZAN_LANDING_DAMAGE, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG, -1); mMode = 1; field_0x702 = 0; case 1: if (field_0x6f0 == 0) { setTgHitBit(FALSE); } if (mpModelMorf->isStop()) { setBck(BCK_ZAN_LANDING_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 10; } break; case 5: case 6: if (mMode == 5) { field_0x6f0 = 100; field_0x6ff = 0; } else if (field_0x6f0 < 30) { field_0x6f0 = 30; } setBck(BCK_ZAN_LANDING_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mMode = 10; field_0x702 = 0; case 10: if (mpModelMorf->checkFrame(1)) { mSound.startCreatureVoice(Z2SE_EN_ZAN_MK_V_MGGG, -1); } if (field_0x6f0 == 0) { setTgHitBit(FALSE); if (!setNextDamageMode(1)) { setNearPillarPos(); field_0x711 = 0; setActionMode(ACT_WARP, 1); } } break; } } /* 80648778-80648F64 00A758 07EC+00 5/5 0/0 0/0 .text setLastWarp__10daB_ZANT_cFii */ void daB_ZANT_c::setLastWarp(int param_0, int i_warpID) { mFlyWarpPosID = i_warpID; if (mFightCycle == 0) { if (health <= 400) { mFightCycle = 1; } } else if (mFightCycle == 1 && health <= 200) { mFightCycle = 2; } if (field_0x713 != mFightCycle) { field_0x71d = 0; field_0x703 = 0; field_0x71c = 0; field_0x712 = 0; if (mFightCycle == 2) { field_0x6ec = 450; field_0x71d = 1; field_0x6ff = 0; } } field_0x713 = mFightCycle; cXyz player_pos(daPy_getPlayerActorClass()->current.pos); s16 var_r28; if (field_0x713 == 2 && param_0) { if (field_0x703 <= 1 || field_0x6ff >= 3) { if (field_0x71d == 1) { param_0 = 3; } else { param_0 = 1; } } else { if (cM_rnd() < 0.5f) { param_0 = 3; } else { param_0 = 1; } if (field_0x71d == param_0) { field_0x6ff++; } else { field_0x6ff = 0; } } field_0x71d = param_0; } switch (param_0) { case 0: mFlyWarpPos.set(0.0f, 0.0f, 1000.0f); field_0x70f = 0; mDrawSwords = true; mSwordSize = 1.0f; break; case 1: if (field_0x713 == 0) { field_0x70f = 0; field_0x703++; if (field_0x703 >= 3 && cM_rnd() < (field_0x703 / 10.0f) + 0.3f) { field_0x70f = 10; field_0x71d = 0; field_0x703 = 0; field_0x71c = 0; field_0x712 = 0; } field_0x704 = 0; var_r28 = cM_atan2s(-player_pos.x, -200.0f - player_pos.z); mFlyWarpPos.set(cM_ssin(var_r28) * 1000.0f, 0.0f, cM_scos(var_r28) * 1000.0f - 200.0f); } else { field_0x70f = 0; field_0x703++; if (field_0x713 != 2 && field_0x703 >= 3 && cM_rnd() < (field_0x703 / 10.0f) + 0.3f) { field_0x70f = 10; field_0x71d = 0; field_0x703 = 0; field_0x71c = 0; field_0x712 = 0; } field_0x704 = 0; f32 var_f31 = cM_rndF(200.0f) + 300.0f; var_r28 = daPy_getPlayerActorClass()->shape_angle.y + 0x8000; if (field_0x70f == 10) { var_f31 += 400.0f; var_r28 = daPy_getPlayerActorClass()->shape_angle.y + cM_rndFX(2.9f) * 8192.0f; } else if (dComIfGp_checkPlayerStatus0(0, 0x400)) { var_f31 += 400.0f; } mFlyWarpPos.set(cM_ssin(var_r28) * var_f31, 0.0f, cM_scos(var_r28) * var_f31); mFlyWarpPos += player_pos; if (mFlyWarpPos.z > 1000.0f || mFlyWarpPos.z < -1400.0f || std::abs(mFlyWarpPos.x) > 1200.0f) { var_r28 = cM_atan2s(-player_pos.x, -200.0f - player_pos.z); mFlyWarpPos.set(cM_ssin(var_r28) * var_f31, 0.0f, cM_scos(var_r28) * var_f31); mFlyWarpPos += player_pos; } } break; case 2: { f32 var_f29 = player_pos.absXZ(current.pos); s16 spE = cLib_targetAngleY(&player_pos, ¤t.pos); s16 spC = cM_atan2s(-player_pos.x, -player_pos.z); if ((s16)(spE - spC) < 0) { var_r28 = spE + 0x2000; } else { var_r28 = spE - 0x2000; } if (var_f29 < 400.0f) { var_f29 = 400.0f; } mFlyWarpPos.set(var_f29 * cM_ssin(var_r28), 0.0f, var_f29 * cM_scos(var_r28)); mFlyWarpPos += player_pos; field_0x70f = 20; break; } case 3: f32 var_f30 = cM_rndF(200.0f) + 700.0f; if (field_0x713 == 0) { var_f30 += 400.0f; var_r28 = cM_atan2s(-player_pos.x, -200.0f - player_pos.z); } else { var_f30 += 400.0f; var_r28 = daPy_getPlayerActorClass()->shape_angle.y + cM_rndFX(3.9f) * 8192.0f; } mFlyWarpPos.set(cM_ssin(var_r28) * var_f30, 0.0f, cM_scos(var_r28) * var_f30); mFlyWarpPos += player_pos; if (mFlyWarpPos.z > 1000.0f || mFlyWarpPos.z < -1400.0f || std::abs(mFlyWarpPos.x) > 1200.0f) { var_r28 = cM_atan2s(-player_pos.x, -200.0f - player_pos.z); mFlyWarpPos.set(cM_ssin(var_r28) * var_f30, 0.0f, cM_scos(var_r28) * var_f30); mFlyWarpPos += player_pos; } field_0x70f = 10; field_0x704 = 1; break; } field_0x711 = 0; setActionMode(ACT_WARP, 1); } /* 80648F64-806494A8 00AF44 0544+00 2/1 0/0 0/0 .text executeLastStartDemo__10daB_ZANT_cFv */ void daB_ZANT_c::executeLastStartDemo() { dCamera_c* camera = dCam_getBody(); daPy_py_c* player = daPy_getPlayerActorClass(); cXyz sp1C; cXyz sp28(0.0f, 0.0f, 0.0f); switch (mMode) { case 0: if (!eventInfo.checkCommandDemoAccrpt()) { fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 0); eventInfo.onCondition(2); } else { camera->Stop(); camera->SetTrimSize(3); setBck(BCK_ZAN_LAST_DEMO, J3DFrameCtrl::EMode_NONE, 10.0f, 1.0f); mSound.startCreatureSound(Z2SE_EN_ZAN_CTL_OP, 0, -1); mpModelMorf->setPlaySpeed(0.0f); gravity = -5.0f; mModeTimer = 10; mMode = 1; field_0x71d = 0; field_0x703 = 0; field_0x71c = 0; field_0x712 = 0; } break; case 1: if (mModeTimer == 0) { current.pos.set(0.0f, 480.0f, -1000.0f); shape_angle.y = 0; shape_angle.z = 0; shape_angle.x = 0; current.angle.y = -0x8000; speedF = 0.0f; mDemoCamEye.set(0.0f, 50.0f, -600.0f); mDemoCamCenter.set(0.0f, 200.0f, -1000.0f); mDemoCamBank = 60.0f; mMode = 2; return; } break; case 2: player->setPlayerPosAndAngle(&sp28, 0x8000, 0); sp1C.set(0.0f, 90.0f, -900.0f); cLib_addCalcPos(&mDemoCamCenter, sp1C, 0.2f, 5.0f, 1.0f); if (mAcch.ChkGroundHit()) { speed.y = 0.0f; speedF = 0.0f; dComIfGp_getVibration().StartShock(4, 31, cXyz(0.0f, 1.0f, 0.0f)); mpModelMorf->setPlaySpeed(1.0f); mMode = 3; } break; case 3: sp1C = eyePos; sp1C.y -= 30.0f; cLib_addCalcPos(&mDemoCamCenter, sp1C, 0.5f, 50.0f, 1.0f); if (mpModelMorf->checkFrame(97)) { mMode = 4; } break; case 4: cLib_addCalc2(&mDemoCamBank, 72.0f, 0.3f, 1.0f); sp1C = eyePos; sp1C.y -= 30.0f; cLib_addCalc2(&mDemoCamCenter.y, sp1C.y, 0.5f, 50.0f); sp1C.y = mDemoCamCenter.y; cLib_addCalcPosXZ(&mDemoCamCenter, sp1C, 0.5f, 3.0f, 1.0f); if (mpModelMorf->checkFrame(103)) { dComIfGp_getVibration().StartShock(2, 31, cXyz(0.0f, 1.0f, 0.0f)); mMode = 5; } break; case 5: cLib_addCalc2(&mDemoCamBank, 72.0f, 0.3f, 1.0f); sp1C = eyePos; sp1C.y = mDemoCamCenter.y; cLib_addCalcPosXZ(&mDemoCamCenter, sp1C, 0.5f, 3.0f, 1.0f); if (mpModelMorf->checkFrame(134)) { mDrawSwords = true; mMode = 6; } break; case 6: cLib_addCalc2(&mDemoCamCenter.y, 128.0f, 0.3f, 3.0f); cLib_addCalc2(&mDemoCamBank, 55.0f, 0.3f, 3.0f); if (mpModelMorf->isStop()) { mFightCycle = 0; field_0x713 = 0; setActionMode(ACT_LAST_ATTACK, 0); field_0x70b = 0; attention_info.flags = fopAc_AttnFlag_BATTLE_e; mDemoCamEye.set(0.0f, 300.0f, 200.0f); camera->Reset(mDemoCamCenter, mDemoCamEye); camera->Start(); camera->SetTrimSize(0); dComIfGp_event_reset(); return; } break; } camera->Set(mDemoCamCenter, mDemoCamEye, mDemoCamBank, 0); } /* 806494A8-8064A58C 00B488 10E4+00 2/1 0/0 0/0 .text executeLastAttack__10daB_ZANT_cFv */ void daB_ZANT_c::executeLastAttack() { s16 angle_to_player = fopAcM_searchPlayerAngleY(this); switch (mMode) { case 0: gravity = -5.0f; if (field_0x713 == 0) { mMode = 1; setBck(BCK_ZAN_SW_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mModeTimer = 60; } else { mMode = 5; } break; case 1: if (mpModelMorf->checkFrame(2) || mpModelMorf->checkFrame(17)) { mSound.startCreatureSound(Z2SE_EN_ZAN_CTL_SWD_RUB, 0, -1); } if (checkAvoidWeapon(0)) { mSwordCc[0].OffAtSetBit(); mSwordCc[1].OffAtSetBit(); setTgHitBit(FALSE); field_0x71c++; if (field_0x71c < 5) { setLastWarp(2, 0); } else { field_0x703 = 7; setLastWarp(1, 0); } } else { cLib_addCalcAngleS2(&shape_angle.y, angle_to_player, 0x10, 0x400); current.angle.y = shape_angle.y; if (fopAcM_searchPlayerDistance(this) < 800.0f || mModeTimer == 0) { mMode = 2; setBck(BCK_ZAN_SW_WALK, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); } } break; case 2: if (mpModelMorf->checkFrame(10) || mpModelMorf->checkFrame(26)) { mSound.startCreatureSound(Z2SE_EN_ZAN_CTL_FOOT, 0, -1); } if (checkAvoidWeapon(0)) { mSwordCc[0].OffAtSetBit(); mSwordCc[1].OffAtSetBit(); setTgHitBit(FALSE); field_0x71c++; if (field_0x71c < 5) { setLastWarp(2, 0); } else { field_0x703 = 7; setLastWarp(1, 0); } } else { cLib_addCalcAngleS2(&shape_angle.y, angle_to_player, 0x10, 0x400); current.angle.y = shape_angle.y; cLib_chaseF(&speedF, 5.0f, 1.0f); if (fopAcM_searchPlayerDistance(this) < 500.0f) { mMode = 5; } } break; case 5: if (field_0x713 == 0) { setBck(BCK_ZAN_SW_ATTACK, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mModeTimer = 200; speedF = 5.0f; } else { setBck(BCK_ZAN_SW_ATTACKB, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); if (field_0x713 != 2) { mModeTimer = cM_rndF(60.0f) + 60.0f; } else { mModeTimer = cM_rndF(15.0f) + 30.0f; } speedF = 10.0f; } mMode = 6; field_0x6f8 = 0; current.angle.y = shape_angle.y; setTgType(2); setTgHitBit(TRUE); setTgShield(FALSE); field_0x702 = 0; case 6: if (checkAvoidWeapon(FALSE)) { mSwordCc[0].OffAtSetBit(); mSwordCc[1].OffAtSetBit(); setTgHitBit(FALSE); field_0x71c++; if (field_0x71c < 10) { setLastWarp(2, 0); } else { field_0x703 = 7; setLastWarp(1, 0); } } else { cLib_chaseF(&mSwordSize, l_HIO.mSwordAttackSize, 0.1f); cLib_addCalcAngleS2(¤t.angle.y, angle_to_player, 8, 0x400); cLib_addCalcAngleS2(&shape_angle.y, angle_to_player, 8, 0x400); if (field_0x713 == 0) { if (mpModelMorf->checkFrame(4) || mpModelMorf->checkFrame(24)) { mSound.startCreatureSound(Z2SE_EN_ZAN_CTL_SW_SWING_L, 0, -1); } else if (mpModelMorf->checkFrame(7) || mpModelMorf->checkFrame(28)) { mSound.startCreatureSound(Z2SE_EN_ZAN_CTL_FOOT_L, 0, -1); } else if (mpModelMorf->checkFrame(5)) { mSound.startCreatureVoice(Z2SE_EN_ZAN_CTL_V_SW_ATK_A1, -1); } else if (mpModelMorf->checkFrame(22)) { mSound.startCreatureVoice(Z2SE_EN_ZAN_CTL_V_SW_ATK_A2, -1); } if (mpModelMorf->checkFrame(1)) { mSwordCc[1].OnAtSetBit(); } if (mpModelMorf->checkFrame(12)) { mSwordCc[1].OffAtSetBit(); } if (mpModelMorf->checkFrame(22)) { mSwordCc[0].OnAtSetBit(); } if (mpModelMorf->checkFrame(33)) { mSwordCc[0].OffAtSetBit(); } } else { if (mpModelMorf->checkFrame(2) || mpModelMorf->checkFrame(20)) { mSound.startCreatureSound(Z2SE_EN_ZAN_CTL_SW_SWING_S1, 0, -1); mSound.startCreatureVoice(Z2SE_EN_ZAN_CTL_V_SW_ATK_B1, -1); } else if (mpModelMorf->checkFrame(11) || mpModelMorf->checkFrame(28)) { mSound.startCreatureSound(Z2SE_EN_ZAN_CTL_SW_SWING_S2, 0, -1); mSound.startCreatureVoice(Z2SE_EN_ZAN_CTL_V_SW_ATK_B2, -1); } else if (mpModelMorf->checkFrame(0) || mpModelMorf->checkFrame(9) || mpModelMorf->checkFrame(17) || mpModelMorf->checkFrame(26)) { mSound.startCreatureSound(Z2SE_EN_ZAN_CTL_FOOT, 0, -1); } if (mpModelMorf->checkFrame(1) || mpModelMorf->checkFrame(19)) { mSwordCc[1].OnAtSetBit(); mSwordCc[0].OffAtSetBit(); } if (mpModelMorf->checkFrame(9) || mpModelMorf->checkFrame(28)) { mSwordCc[0].OnAtSetBit(); mSwordCc[1].OffAtSetBit(); } } if (mModeTimer == 0 && mpModelMorf->checkFrame(1)) { mSwordCc[0].OffAtSetBit(); mSwordCc[1].OffAtSetBit(); setTgHitBit(FALSE); setLastWarp(1, 0); } } break; case 20: if (fopAcM_searchPlayerDistance(this) < 500.0f) { mMode = 5; } else { mMode = 2; setBck(BCK_ZAN_SW_WALK, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); } break; case 10: case 30: dComIfGs_onOneZoneSwitch(1, fopAcM_GetRoomNo(this)); setBck(BCK_ZAN_SPIN, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); if (field_0x704 == 0) { if (field_0x713 != 2) { field_0x6ec = 300; field_0x71d = 1; field_0x6ff = 0; } } else if (field_0x6ec < 30) { field_0x6ec = 30; } if (field_0x713 == 0) { mMode = 11; } else { mMode = 31; } current.angle.y = angle_to_player; mRollCc.OnAtSetBit(); mRollCc.OnTgSetBit(); mRollCc.OnCoSetBit(); setTgType(0xD8FBFDFF); setTgShield(TRUE); setTgHitBit(TRUE); field_0x6f8 = 0x3000; speedF = 30.0f; field_0x6fd = 0; field_0x70b = 0; case 11: case 31: { mSound.startCreatureVoiceLevel(Z2SE_EN_ZAN_CTL_V_SPIN_ATK, -1); setLastRollEffect(); cLib_chaseF(&mSwordSize, l_HIO.mSwordAttackSize, 0.1f); f32 var_f31 = 1.2f; if (field_0x713 != 0) { var_f31 = 1.5f; } if (field_0x70b != 0) { if (mAcch.ChkGroundHit()) { field_0x70b--; if (field_0x70b != 0) { speedF = 0.0f; speed.y = 30.0f; field_0x6ec = 0; } } } else if (mMode == 11) { int sp48 = abs((s16)(angle_to_player - current.angle.y)); if (sp48 > 0x4000) { if (sp48 > 0x6800) { cLib_chaseF(&speedF, -30.0f, var_f31 * 0.2f); } else { cLib_chaseF(&speedF, 5.0f, var_f31 * 0.2f); } cLib_addCalcAngleS2(¤t.angle.y, angle_to_player + 0x8000, 0x10, var_f31 * 512.0f); if (speedF < 0.0f && sp48 > 0x6000) { current.angle.y += 0x8000; speedF = -speedF; } } else { if (sp48 > 0x1800) { cLib_chaseF(&speedF, 10.0f, var_f31); } else { cLib_chaseF(&speedF, var_f31 * 30.0f, var_f31); } cLib_addCalcAngleS2(¤t.angle.y, angle_to_player, 0x10, var_f31 * 768.0f); } } else { cLib_chaseF(&speedF, var_f31 * 30.0f, var_f31 * 2.0f); } int sp3C = 0; int sp40 = 0; int sp44 = 0; cCcD_Obj* sp48 = NULL; if (mRollCc.ChkTgHit()) { sp48 = mRollCc.GetTgHitObj(); if (sp48->ChkAtType(AT_TYPE_IRON_BALL)) { sp40 = 1; } else if (sp48->ChkAtType(AT_TYPE_NORMAL_SWORD)) { daPy_py_c* player = daPy_getPlayerActorClass(); if (player->getCutType() == daPy_py_c::CUT_TYPE_TURN_RIGHT || player->getCutType() == daPy_py_c::CUT_TYPE_TURN_LEFT || player->getCutType() == daPy_py_c::CUT_TYPE_LARGE_TURN_LEFT || player->getCutType() == daPy_py_c::CUT_TYPE_LARGE_TURN_RIGHT) { sp40 = 1; } } def_se_set(&mSound, mRollCc.GetTgHitObj(), 0x2A, this); mRollCc.ClrTgHit(); } else if (mRollCc.ChkAtHit()) { sp48 = mRollCc.GetAtHitObj(); if (!mRollCc.ChkAtShieldHit()) { sp44 = 1; } mRollCc.ClrAtHit(); } if (sp48 != NULL && fopAcM_GetName(dCc_GetAc(sp48->GetAc())) == PROC_ALINK) { sp3C = 1; field_0x6fd++; if (sp40 != 0) { speedF = -speedF; field_0x70b = 2; speed.y = 40.0f; } else if (sp44 != 0) { field_0x6fd += 5; speedF = -45.0f; } else { speedF = -2.0f; } } else { if (mAcch.ChkWallHit()) { s16 sp8 = mAcchCir.GetWallAngleY(); if (speedF > 0.0f) { if ((s16)cLib_distanceAngleS(sp8, current.angle.y) > 0x5800) { current.angle.y = sp8 - 0x8000; speedF *= 0.8f; sp3C = 1; field_0x6fd += 5; } } else { if ((s16)cLib_distanceAngleS(sp8, current.angle.y) < 0x2800) { current.angle.y = sp8 - (s16)(current.angle.y - sp8); speedF *= 0.8f; sp3C = 1; field_0x6fd += 5; } } } } if (sp3C != 0) { if (mMode == 31 && field_0x6fd >= 5) { mRollCc.OffAtSetBit(); mRollCc.OffTgSetBit(); mRollCc.OffCoSetBit(); setTgHitBit(FALSE); setLastWarp(3, sp44); return; } if (field_0x6ec < 10) { field_0x6ec = 10; mMode = 12; } } cLib_chaseAngleS(&field_0x6f8, 0x3000, 0x80); shape_angle.y += field_0x6f8; if (field_0x6ec == 0) { mMode = 12; } break; } case 12: mSound.startCreatureVoiceLevel(Z2SE_EN_ZAN_CTL_V_SPIN_ATK, -1); setLastRollEffect(); cLib_chaseF(&speedF, 0.0f, 1.0f); cLib_chaseAngleS(&field_0x6f8, 0, 0x80); shape_angle.y += field_0x6f8; if (field_0x6f8 < 0x1000) { mRollCc.OffAtSetBit(); mRollCc.OffTgSetBit(); mRollCc.OffCoSetBit(); setBck(BCK_ZAN_SW_FATIGUE, J3DFrameCtrl::EMode_LOOP, 30.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_ZAN_CTL_V_ZEIZEI, -1); mMode = 13; dComIfGs_offOneZoneSwitch(1, fopAcM_GetRoomNo(this)); if (field_0x713 == 2) { field_0x6ec = 450; } } break; case 13: if (field_0x6f8 < 0x800) { field_0x702 = 0; setTgShield(FALSE); setTgHitBit(TRUE); field_0x6f0 = 60; field_0x71d = 0; field_0x703 = 0; field_0x71c = 0; field_0x712 = 0; } cLib_chaseF(&mSwordSize, 1.0f, 0.1f); cLib_chaseF(&speedF, 0.0f, 1.0f); cLib_chaseAngleS(&field_0x6f8, 0, 0x80); shape_angle.y += field_0x6f8; if (field_0x6f8 == 0) { setActionMode(ACT_LAST_TIRED, 0); } break; } } /* 8064A58C-8064A688 00C56C 00FC+00 1/1 0/0 0/0 .text executeLastTired__10daB_ZANT_cFv */ void daB_ZANT_c::executeLastTired() { switch (mMode) { case 0: if (field_0x713 == 0) { mModeTimer = 120; } else if (field_0x713 == 1) { mModeTimer = 90; } else { mModeTimer = 60; } field_0x6f0 = mModeTimer; mMode = 5; field_0x702 = 0; setTgShield(FALSE); setTgHitBit(TRUE); field_0x71d = 0; field_0x703 = 0; field_0x71c = 0; field_0x712 = 0; case 5: cLib_chaseF(&speedF, 0.0f, 1.0f); if (mModeTimer == 0) { setTgHitBit(FALSE); setLastWarp(1, 0); } } } /* 8064A688-8064AC20 00C668 0598+00 2/1 0/0 0/0 .text executeLastDamage__10daB_ZANT_cFv */ void daB_ZANT_c::executeLastDamage() { switch (mMode) { case 0: case 1: case 2: if (mLastAction == ACT_LAST_ATTACK) { field_0x6f0 = 0; } if (field_0x6f0 == 0) { setTgHitBit(FALSE); } else { setTgHitBit(TRUE); } mSwordCc[0].OffAtSetBit(); mSwordCc[1].OffAtSetBit(); speedF = 0.0f; attention_info.flags = fopAc_AttnFlag_BATTLE_e; if (mTakenBigDmg) { if (mFightCycle == 0) { if (health < 400) { health = 400; } } else if (mFightCycle == 1 && health < 200) { health = 200; } mFightCycle++; setTgHitBit(FALSE); } if (health <= 0 || mFightCycle >= 3) { mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG, -1); setActionMode(ACT_LAST_END_DEMO, 0); return; } field_0x702 = 0; if (mMode == 1) { setBck(BCK_ZAN_SW_DAMAGER, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); } else if (mMode == 2) { setBck(BCK_ZAN_SW_DAMAGEL, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); } else if (cM_rnd() < 0.5f) { setBck(BCK_ZAN_SW_DAMAGEL, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); } else { setBck(BCK_ZAN_SW_DAMAGER, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); } mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG, -1); mMode = 5; case 5: { BOOL var_r28 = false; if (checkBck(BCK_ZAN_SW_DAMAGEL)) { if (mpModelMorf->checkFrame(17)) { mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG_JITANDA, -1); } if (mLastAction == ACT_LAST_ATTACK) { if (mpModelMorf->checkFrame(18)) { var_r28 = true; } } else { if (mpModelMorf->checkFrame(38)) { var_r28 = true; } } if (var_r28) { setTgHitBit(FALSE); field_0x71c++; field_0x712++; if (field_0x71c >= 5 || field_0x712 >= 3) { field_0x703 = 7; setLastWarp(1, 0); } else if (mLastAction == ACT_LAST_ATTACK) { setLastWarp(2, 0); } else { setLastWarp(1, 0); } } } else { if (mpModelMorf->checkFrame(19)) { mSound.startCreatureVoice(Z2SE_EN_ZAN_V_DMG_SHINARU, -1); } if (mLastAction == ACT_LAST_ATTACK) { if (mpModelMorf->checkFrame(20)) { var_r28 = true; } } else { if (mpModelMorf->checkFrame(30)) { var_r28 = true; } } if (var_r28) { setTgHitBit(FALSE); field_0x71c++; field_0x712++; if (field_0x71c >= 5 || field_0x712 >= 3) { field_0x703 = 7; setLastWarp(1, 0); } else if (mLastAction == ACT_LAST_ATTACK) { setLastWarp(2, 0); } else { setLastWarp(1, 0); } } } break; } case 10: attention_info.flags = fopAc_AttnFlag_BATTLE_e; setBck(BCK_ZAN_GROUND_REACTION, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_ZAN_V_NO_DMG, -1); mMode = 11; speedF = 0.0f; break; case 11: if (mpModelMorf->isStop()) { setTgHitBit(FALSE); setLastWarp(1, 0); } break; case 20: setBck(BCK_ZAN_FAINT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); speedF = 0.0f; speed.y = 0.0f; field_0x702 = 0; mModeTimer = 20; mMode = 21; case 21: if (mModeTimer == 0) { setTgHitBit(FALSE); setLastWarp(1, 0); } break; } } /* 8064AC20-8064AC8C 00CC00 006C+00 1/1 0/0 0/0 .text s_del_tp__FPvPv */ static void* s_del_tp(void* i_actor, void* i_data) { if (fopAcM_IsActor(i_actor)) { if (!fpcM_IsCreating(fopAcM_GetID(i_actor)) && fopAcM_GetName(i_actor) == PROC_OBJ_TP) { fopAcM_delete((fopAc_ac_c*)i_actor); } } return NULL; } /* 8064AC8C-8064B270 00CC6C 05E4+00 1/1 0/0 0/0 .text executeLastEndDemo__10daB_ZANT_cFv */ void daB_ZANT_c::executeLastEndDemo() { dCamera_c* camera = dCam_getBody(); daPy_py_c* player = daPy_getPlayerActorClass(); cXyz sp34; cXyz sp40; switch (mMode) { case 0: if (!eventInfo.checkCommandDemoAccrpt()) { fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 0); eventInfo.onCondition(2); return; } mDrawSwords = false; camera->Stop(); camera->SetTrimSize(3); setBck(BCK_ZAN_DIE_DEMO, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f); mSound.startCreatureSound(Z2SE_EN_ZAN_END, 0, -1); Z2GetAudioMgr()->bgmStop(30, 0); fpcM_Search(s_del_tp, this); speedF = 0.0f; mDemoCamCenter.set(0.0f, 120.0f, -1000.0f); mDemoCamEye.set(0.0f, 50.0f, -750.0f); mDemoCamBank = 80.0f; mMode = 1; field_0x6ba = 0x2F00; field_0x6bc = 0.0f; dComIfGs_onStageBossEnemy(); return; case 1: case 2: if (mMode == 1) { cXyz sp4C(0.0f, 0.0f, 0.0f); player->setPlayerPosAndAngle(&sp4C, 0x8000, 0); current.pos.set(0.0f, 0.0f, -1000.0f); shape_angle.z = 0; shape_angle.x = 0; shape_angle.y = 0; sp34 = mDemoCamCenter; mMode = 2; } else { sp34 = eyePos; sp34.y -= 44.0f; } { f32 var_f31 = mpModelMorf->getFrame(); if ((80 <= var_f31 && var_f31 <= 120) || (175 <= var_f31 && var_f31 <= 205)) { cLib_addCalcPos(&mDemoCamCenter, sp34, 0.1f, 3.0f, 1.0f); } else { cLib_addCalcPos(&mDemoCamCenter, sp34, 0.5f, 30.0f, 1.0f); } } cLib_addCalcAngleS(&field_0x6ba, 0, 0x10, 0x40, 0x10); sp34.set(0.0f, 50.0f, -1000.0f); sp40.set(0.0f, field_0x6bc, 250.0f); cLib_offsetPos(&mDemoCamEye, &sp34, field_0x6ba, &sp40); if (mpModelMorf->checkFrame(230)) { dComIfGp_getVibration().StartShock(4, 31, cXyz(0.0f, 1.0f, 0.0f)); } if (mpModelMorf->checkFrame(250)) { mMode = 3; } break; case 3: cLib_addCalcAngleS(&field_0x6ba, 0, 0x10, 0x40, 0x10); cLib_addCalc2(&field_0x6bc, 250.0f, 0.1f, 3.0f); sp34.set(0.0f, 300.0f, -1000.0f); sp40.set(0.0f, 0.0f, 150.0f); { cXyz sp58; cLib_offsetPos(&sp58, &sp34, field_0x6ba, &sp40); cLib_addCalcPos(&mDemoCamEye, sp58, 0.1f, 4.0f, 1.0f); } sp34 = eyePos; cLib_addCalcPos(&mDemoCamCenter, sp34, 0.1f, 0.8f, 1.0f); if (mpModelMorf->checkFrame(340)) { mpModelMorf->setFrame(300); mMode = 14; mDemoCamEye.set(0.0f, 5.0f, -800.0f); field_0x6bc = 30.0f; mDemoCamCenter = eyePos; mDemoCamCenter.y -= field_0x6bc; mDemoCamBank = 80.0f; } break; case 14: mDemoCamCenter = eyePos; mDemoCamCenter.y -= field_0x6bc; if (mpModelMorf->checkFrame(360)) { mpModelMorf->setPlaySpeed(0.5f); mMode = 15; } break; case 15: if (mpModelMorf->checkFrame(375)) { dComIfGp_setNextStage("D_MN08A", 25, 10, 9); } mDemoCamCenter = eyePos; mDemoCamCenter.y -= field_0x6bc; cLib_chaseF(&field_0x6bc, 0.0f, 1.0f); cLib_chaseF(&mDemoCamBank, 80.0f, 0.5f); break; } camera->Set(mDemoCamCenter, mDemoCamEye, mDemoCamBank, 0); } /* 8064B270-8064B49C 00D250 022C+00 1/1 0/0 0/0 .text calcMahojinAnime__10daB_ZANT_cFv */ void daB_ZANT_c::calcMahojinAnime() { switch (mMahojinAnmMode) { case 1: mpMahojinStartBtk->setPlaySpeed(1.0f); mpMahojinStartBtk->setFrame(0); mpMahojinEndBrk->setPlaySpeed(0.0f); mpMahojinEndBrk->setFrame(0); mMahojinAnmMode = 2; case 2: if (mpMahojinStartBtk->checkFrame(9)) { mMahojin2AnmMode = 1; } if (mpMahojinStartBtk->isStop()) { mMahojinAnmMode = 3; } break; case 3: break; case 4: mpMahojinEndBrk->setPlaySpeed(1.0f); mMahojinAnmMode = 5; case 5: if (mpMahojinEndBrk->isStop()) { mMahojinAnmMode = 0; } break; } switch (mMahojin2AnmMode) { case 0: mpMahojinBrk2->setPlaySpeed(0.0f); mpMahojinBrk2->setFrame(30); mpMahojinStartBtk2->setFrame(19); mMahojin2Size = 1.0f; break; case 1: mpMahojinBrk2->setPlaySpeed(0.5f); cLib_chaseF(&mMahojin2Size, 10.0f, 0.1f); if (mpMahojinBrk2->isStop()) { mMahojin2AnmMode = 0; mpMahojinBrk2->init(mpMahojinModel2->getModelData(), (J3DAnmTevRegKey*)dComIfG_getObjectRes("B_zan", 0x4F), TRUE, J3DFrameCtrl::EMode_NONE, 0.0f, 0, -1); } } } /* 8064B49C-8064B69C 00D47C 0200+00 2/2 0/0 0/0 .text calcRoomChangeCamera__10daB_ZANT_cFi */ void daB_ZANT_c::calcRoomChangeCamera(int param_0) { cXyz eye_target(-100.0f, 87.0f, -160.0f); cXyz center_target(106.0f, 483.0f, 843.0f); if (param_0 == 1) { cXyz sp38(-20.0f, -40.0f, -100.0f); eye_target += sp38; center_target += sp38; } if (mFightPhase == PHASE_OP) { eye_target.x += 140.0f; center_target.x += 140.0f; mDoMtx_stack_c::YrotS(-0x8000); mDoMtx_stack_c::transM(eye_target); mDoMtx_stack_c::multVecZero(&eye_target); eye_target.y += 250.0f; eye_target.z -= 800.0f; mDoMtx_stack_c::YrotS(-0x8000); mDoMtx_stack_c::transM(center_target); mDoMtx_stack_c::multVecZero(¢er_target); center_target.y += 250.0f; center_target.z -= 800.0f; } switch (param_0) { case 0: mDemoCamBank = 58.0f; cLib_chaseF(&field_0x77c, 30.0f, 1.0f); cLib_addCalcPos(&mDemoCamEye, eye_target, 0.3f, field_0x77c * 1.1f, 3.0f); cLib_addCalcPos(&mDemoCamCenter, center_target, 0.3f, field_0x77c, 3.0f); break; case 1: cLib_addCalcPos(&mDemoCamEye, eye_target, 0.2f, 15.0f, 3.0f); cLib_addCalcPos(&mDemoCamCenter, center_target, 0.2f, 15.0f, 3.0f); break; } } /* 8064B69C-8064B868 00D67C 01CC+00 3/3 0/0 0/0 .text initNextRoom__10daB_ZANT_cFv */ void daB_ZANT_c::initNextRoom() { field_0x70f = 0; field_0x6f0 = 0; field_0x70e = 0; mDrawSwords = false; setTgType(0xD8FBFDFF); mBodySphCc[0].OffTgNoHitMark(); mBodySphCc[1].OffTgNoHitMark(); dComIfGs_offSaveDunSwitch(20); dComIfGs_offSaveDunSwitch(21); dComIfGs_offSaveDunSwitch(22); if (mFightPhase != PHASE_LAST) { health = 280; } else { health = field_0x560; } mAcchCir.SetWall(100.0f, 100.f); if (mFightPhase == PHASE_MG) { attention_info.distances[fopAc_attn_BATTLE_e] = 4; } else { attention_info.distances[fopAc_attn_BATTLE_e] = 24; } fopAc_ac_c* pmobile; fopAcM_SearchByID(mMobileIDs[0], &pmobile); if (mFightPhase == PHASE_OI) { fopAcM_OnStatus(this, 0x80000); if (pmobile == NULL) { cXyz pos(0.0f, -3300.0f, 0.0f); for (int i = 0; i < 4; i++) { mMobileIDs[i] = fopAcM_create(PROC_B_ZANTZ, i | 0xFFFFFF00, &pos, warp_next_room[mFightPhase], &shape_angle, NULL, -1); } mCorrectMobileNo = 0; } } else { fopAcM_OffStatus(this, 0x80000); if (pmobile != NULL) { fopAcM_delete(pmobile); mMobileIDs[0] = fpcM_ERROR_PROCESS_ID_e; } } tevStr.room_no = warp_next_room[mFightPhase]; } /* 8064B868-8064C1C0 00D848 0958+00 2/1 0/0 0/0 .text executeRoomChange__10daB_ZANT_cFv */ void daB_ZANT_c::executeRoomChange() { dCamera_c* camera = dCam_getBody(); cXyz sp34(0.0f, 0.0f, 0.0f); daPy_py_c* player = daPy_getPlayerActorClass(); switch (mMode) { case 0: setTgHitBit(FALSE); if (!eventInfo.checkCommandDemoAccrpt()) { fopAcM_orderPotentialEvent(this, 2, 0xFFFF, 0); eventInfo.onCondition(2); return; } camera->Stop(); camera->SetTrimSize(3); mDemoCamCenter = dCam_getBody()->Center(); mDemoCamEye = dCam_getBody()->Eye(); mDemoCamBank = dCam_getBody()->Fovy(); field_0x705 = 0; mMode = 1; if (mFightPhase != PHASE_MK) { setBck(BCK_ZAN_FLOAT_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); } dComIfGp_particle_set(0x88FE, ¤t.pos, &shape_angle, NULL); mSound.startCreatureSound(Z2SE_EN_ZAN_WARP_OUT, 0, -1); break; case 1: if (calcScale(0)) { mMode = 4; mModeTimer = l_HIO.mDemoWarpTime; } break; case 4: if (mModeTimer == 0) { mMode = 10; mModeTimer = 15; current.pos.set(-140.0f, 300.0f, 700.0f); old.pos = current.pos; speedF = 0.0f; speed.y = 0.0f; gravity = 0.0f; shape_angle.x = 0; current.angle.y = 0x8000; shape_angle.y = 0x8000; setBck(BCK_ZAN_FLOAT_WAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); player->setPlayerPosAndAngle(&sp34, 0, 0); player->changeOriginalDemo(); player->changeDemoPos0(&sp34); player->changeDemoMode(0x17, 1, 4, 0); mDemoCamBank = 65.0f; mDemoCamEye.set(-225.0f, 344.0f, 382.0f); mDemoCamCenter.set(118.0f, 672.0f, 1374.0f); Z2GetAudioMgr()->changeBgmStatus(13); field_0x77c = 0.0f; calcRoomChangeCamera(0); if (mFightPhase == PHASE_OI) { for (int i = 0; i < 4; i++) { fopAc_ac_c* pmobile; fopAcM_SearchByID(mMobileIDs[i], &pmobile); if (pmobile != NULL) { fopAcM_delete(pmobile); mMobileIDs[i] = fpcM_ERROR_PROCESS_ID_e; } } } field_0x6fc = 1; } break; case 10: shape_angle.y = fopAcM_searchPlayerAngleY(this); shape_angle.x = -fopAcM_searchPlayerAngleX(this) * 0.5f; if (mModeTimer == 0) { dComIfGp_particle_set(0x88FE, ¤t.pos, &shape_angle, NULL); mSound.startCreatureSound(Z2SE_EN_ZAN_WARP_IN, 0, -1); mMode = 11; } break; case 11: shape_angle.y = fopAcM_searchPlayerAngleY(this); shape_angle.x = -fopAcM_searchPlayerAngleX(this) * 0.5f; if (calcScale(1)) { mMode = 12; mModeTimer = 20; } break; case 12: if (mModeTimer == 0) { mMode = 13; mModeTimer = 50; } break; case 13: calcRoomChangeCamera(0); if (mModeTimer == 0) { mMode = 14; setBck(BCK_ZAN_FLOAT_APPEARSHORT, J3DFrameCtrl::EMode_NONE, 5.0f, 1.0f); field_0x714 = 1; mKankyoBlend = 0.0f; static u32 mahojin_se[] = { Z2SE_EN_ZAN_MAHOJIN_BB, Z2SE_EN_ZAN_MAHOJIN_MG, Z2SE_EN_ZAN_MAHOJIN_OI, Z2SE_EN_ZAN_MAHOJIN_MK, Z2SE_EN_ZAN_MAHOJIN_YO, Z2SE_EN_ZAN_MAHOJIN_CTL, }; mSound.startCreatureSound(mahojin_se[mFightPhase], 0, -1); } break; case 14: cLib_chaseF(&mKankyoBlend, 1.0f, 0.02f); if (mpModelMorf->checkFrame(42)) { mMahojinAnmMode = 1; Z2GetAudioMgr()->changeBgmStatus(mFightPhase + PHASE_MAX); } if (mpModelMorf->checkFrame(42)) { field_0x715 = 30; } shape_angle.y = fopAcM_searchPlayerAngleY(this); shape_angle.x = -fopAcM_searchPlayerAngleX(this) * 0.5f; if (mpModelMorf->isStop()) { dComIfGp_getVibration().StopQuake(0x1F); setBck(BCK_ZAN_FLOAT_APPEARWAIT, J3DFrameCtrl::EMode_LOOP, 3.0f, 1.0f); mFightPhase++; if (mFightPhase >= PHASE_MAX) { mFightPhase = PHASE_OP; } mMode = 15; mModeTimer = l_HIO.mMahojinWaitTime; initNextRoom(); cXyz pos(0.0f, 0.0f, 0.0f); dComIfGs_setRestartRoom(pos, 0, warp_next_room[mFightPhase]); } break; case 15: if (mModeTimer == 0 && dComIfGp_roomControl_checkStatusFlag(warp_next_room[mFightPhase], 0x10)) { mMode = 16; field_0x714 = 0; mKankyoBlend = 0.0f; setBck(BCK_ZAN_FLOAT_WAITRETURN, J3DFrameCtrl::EMode_NONE, 5.0f, 1.0f); mMahojinAnmMode = 4; } break; case 16: cLib_chaseF(&mKankyoBlend, 1.0f, 0.02f); player->setPlayerPosAndAngle(&sp34, 0, 0); if (mpModelMorf->isStop()) { if (mFightPhase != PHASE_LAST) { camera->Reset(mDemoCamCenter, mDemoCamEye); camera->Start(); camera->SetTrimSize(0); dComIfGp_event_reset(); } field_0x6fc = 0; setTgHitBit(TRUE); setBaseActionMode(1); return; } break; } if (field_0x715 != 0) { calcRoomChangeCamera(1); field_0x715--; } camera->Set(mDemoCamCenter, mDemoCamEye, mDemoCamBank, 0); } /* 8064C1C0-8064C5A8 00E1A0 03E8+00 8/7 0/0 0/0 .text setBaseActionMode__10daB_ZANT_cFi */ void daB_ZANT_c::setBaseActionMode(int param_0) { switch (mFightPhase) { case PHASE_BB: if (param_0 == 0) { if (field_0x70c == 0) { setActionMode(ACT_FLY, 0); } else { setActionMode(ACT_FLY_GROUND, 0); } } else if (param_0 == 1) { field_0x70b = 1; mFlyWarpPosID = 0; mFlyWarpPos = fly_warp_pos[mFlyWarpPosID]; field_0x711 = 1; setActionMode(ACT_WARP, 1); } else { field_0x70c = 0; gravity = 0.0f; mFlyWarpPosID = (f32)mFlyWarpPosID + cM_rndF(1.9f) + 1.0f; mFlyWarpPos = fly_warp_pos[mFlyWarpPosID % 3]; field_0x711 = 2; setActionMode(ACT_WARP, 1); } break; case PHASE_MG: if (param_0 == 0) { setActionMode(ACT_SIMA_JUMP, 0); } else if (param_0 == 1) { gravity = -5.0f; mFlyWarpPosID = 0; mFlyWarpPos.set(0.0f, 1000.0f, 1100.0f); field_0x6b8 = 0x8000; field_0x711 = 3; setActionMode(ACT_WARP, 0); } else { setActionMode(ACT_SIMA_JUMP, 11); } break; case PHASE_YO: if (param_0 == 0) { setActionMode(ACT_ICE_DEMO, 100); } else if (param_0 == 1) { setActionMode(ACT_ICE_DEMO, 0); } else { setActionMode(ACT_ICE_DAMAGE, 30); } mModeTimer = 0; break; case PHASE_OI: if (param_0 == 0) { setActionMode(ACT_WATER, 0); } else { fopAc_ac_c* pmobile; fopAcM_SearchByID(mMobileIDs[mCorrectMobileNo], &pmobile); s16 var_r27 = shape_angle.y; cXyz sp44(current.pos); sp44.y = -4000.0f; if (pmobile != NULL) { var_r27 = pmobile->shape_angle.y; sp44.set(cM_ssin(var_r27) * 300.0f, 300.0f, cM_scos(var_r27) * 300.0f); sp44 += pmobile->current.pos; } attention_info.flags = 0; field_0x6b8 = var_r27; mFlyWarpPos = sp44; field_0x705 = 1; field_0x711 = 1; setActionMode(ACT_WARP, 0); } break; case PHASE_MK: if (param_0 == 0) { setActionMode(ACT_MONKEY, 0); } else if (param_0 == 1) { setActionMode(ACT_MONKEY, 100); } else { setNearPillarPos(); field_0x711 = 0; setActionMode(ACT_WARP, 1); } break; case PHASE_LAST: if (param_0 == 0) { setActionMode(ACT_LAST_ATTACK, field_0x70f); } else if (param_0 == 1) { if (field_0x718 == 0) { setActionMode(ACT_LAST_START_DEMO, 0); } else { setLastWarp(0, 0); } } break; case PHASE_OP: setActionMode(ACT_OPENING, 0); executeOpening(); break; } } /* 8064C5A8-8064CB1C 00E588 0574+00 2/1 0/0 0/0 .text action__10daB_ZANT_cFv */ void daB_ZANT_c::action() { if (mFightPhase == PHASE_YO) { ice_damage_check(); } else { damage_check(); } switch (mAction) { case ACT_SMALL_ATTACK: executeSmallAttack(); break; case ACT_WARP: executeWarp(); break; case ACT_DAMAGE: executeDamage(); break; case ACT_CONFUSE: executeConfuse(); break; case ACT_OPENING: executeOpening(); break; case ACT_FLY: executeFly(); break; case ACT_FLY_GROUND: executeFlyGround(); break; case ACT_WATER: executeWater(); break; case ACT_HOOK: executeHook(); break; case ACT_SWIM: executeSwim(); break; case ACT_SIMA_JUMP: executeSimaJump(); break; case ACT_ICE_DEMO: executeIceDemo(); break; case ACT_ICE_JUMP: executeIceJump(); break; case ACT_ICE_STEP: executeIceStep(); break; case ACT_ICE_DAMAGE: executeIceDamage(); break; case ACT_MONKEY: executeMonkey(); break; case ACT_MONKEY_FALL: executeMonkeyFall(); break; case ACT_MONKEY_DAMAGE: executeMonkeyDamage(); break; case ACT_LAST_START_DEMO: executeLastStartDemo(); break; case ACT_LAST_ATTACK: executeLastAttack(); break; case ACT_LAST_TIRED: executeLastTired(); break; case ACT_LAST_DAMAGE: executeLastDamage(); break; case ACT_LAST_END_DEMO: executeLastEndDemo(); break; case ACT_ROOM_CHANGE: executeRoomChange(); break; } if (mAction != ACT_OPENING) { daPy_getPlayerActorClass()->onBossRoomWait(); } cXyz sp40(0.0f, 0.0f, 0.0f); switch (mFightPhase) { case PHASE_BB: if (field_0x70c == 0) { dComIfGs_onOneZoneSwitch(0, fopAcM_GetRoomNo(this)); } else { dComIfGs_offOneZoneSwitch(0, fopAcM_GetRoomNo(this)); } break; case PHASE_MG: break; case PHASE_YO: if (checkBck(BCK_ZAN_FLOAT_WAIT) && mpModelMorf->checkFrame(1)) { mSound.startCreatureSound(Z2SE_EN_ZAN_YO_FLOAT_WAIT, 0, -1); } { f32 wall_r = mModelScaleXZ * 50.0f; if (wall_r < 100.0f) { wall_r = 100.0f; } mAcchCir.SetWall(100.0f, wall_r); } dComIfGs_offSaveDunSwitch(20); dComIfGs_offSaveDunSwitch(21); dComIfGs_offSaveDunSwitch(22); switch (field_0x70e) { case 1: dComIfGs_onSaveDunSwitch(20); break; case 2: dComIfGs_onSaveDunSwitch(21); break; case 3: dComIfGs_onSaveDunSwitch(22); break; } field_0x38b4 = dComIfGp_particle_set(field_0x38b4, 0x87B0, &sp40, &tevStr); break; case PHASE_OI: setWaterBubble(); checkSwimLinkNear(); dComIfGs_onOneZoneSwitch(0, fopAcM_GetRoomNo(this)); break; case PHASE_MK: checkPillarSwing(); break; case PHASE_LAST: break; } s16 var_r29 = fopAcM_searchPlayerAngleX(this); s16 neck_rot_z = 0; s16 body_rot_x = 0; if (field_0x717 != 0) { if (var_r29 > 0x2800) { var_r29 = 0x2800; } if (var_r29 < -0x2800) { var_r29 = -0x2800; } if (abs(var_r29) < 0x1800) { neck_rot_z = 0; body_rot_x = var_r29; } else if (var_r29 > 0) { body_rot_x = 0x1800; neck_rot_z = (s16)(var_r29 - 0x1800); } else { body_rot_x = -0x1800; neck_rot_z = (s16)(var_r29 + 0x1800); } } var_r29 = fopAcM_searchPlayerAngleY(this); s16 neck_rot_x = 0; if (field_0x716 != 0) { if (var_r29 > 0x2000) { var_r29 = 0x2000; } if (var_r29 < -0x2000) { var_r29 = -0x2000; } neck_rot_x = var_r29; } cLib_addCalcAngleS(&mNeckRotZ, neck_rot_z, 8, 0x400, 0x80); cLib_addCalcAngleS(&mNeckRotX, neck_rot_x, 8, 0x400, 0x80); cLib_addCalcAngleS(&mBackboneRotZ, body_rot_x, 8, 0x400, 0x80); calcMahojinAnime(); dStage_roomControl_c::onNoChangeRoom(); dStage_roomControl_c::setRoomReadId(warp_next_room[mFightPhase]); if (field_0x6fc != 0) { dStage_RoomCheck(NULL); } fopAcM_posMoveF(this, field_0x9a4.GetCCMoveP()); if (field_0x705 == 0) { mAcch.CrrPos(dComIfG_Bgsp()); } u32 sp44 = mModelScaleY * 100.0f; mpModelMorf->play(sp44, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); } /* 8064CB1C-8064CD0C 00EAFC 01F0+00 2/2 0/0 0/0 .text mtx_set__10daB_ZANT_cFv */ void daB_ZANT_c::mtx_set() { mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::ZXYrotM(shape_angle); mDoMtx_stack_c::scaleM(l_HIO.mModelSize * mModelScaleXZ, l_HIO.mModelSize * mModelScaleY, l_HIO.mModelSize * mModelScaleXZ); J3DModel* model = mpModelMorf->getModel(); model->setBaseTRMtx(mDoMtx_stack_c::get()); mpModelMorf->modelCalc(); if (mDrawSwords) { mDoMtx_stack_c::copy(model->getAnmMtx(JNT_ARML3)); mDoMtx_stack_c::scaleM(mSwordSize, mSwordSize, mSwordSize); mpSwordLModel->setBaseTRMtx(mDoMtx_stack_c::get()); mDoMtx_stack_c::copy(model->getAnmMtx(JNT_ARMR3)); mDoMtx_stack_c::scaleM(mSwordSize, mSwordSize, mSwordSize); mpSwordRModel->setBaseTRMtx(mDoMtx_stack_c::get()); } if (mMahojinAnmMode != 0) { cXyz offset(l_HIO.mMahojinOffsetX, l_HIO.mMahojinOffsetY, l_HIO.mMahojinOffsetZ); cXyz pos; cLib_offsetPos(&pos, ¤t.pos, shape_angle.y, &offset); mDoMtx_stack_c::transS(pos); mDoMtx_stack_c::ZXYrotM(shape_angle); mDoMtx_stack_c::scaleM(l_HIO.mMahojinSize, l_HIO.mMahojinSize, l_HIO.mMahojinSize); mpMahojinModel->setBaseTRMtx(mDoMtx_stack_c::get()); mpMahojinEndBrk->play(); mpMahojinBtk->play(); mpMahojinStartBtk->play(); if (mMahojin2AnmMode != 0) { mDoMtx_stack_c::copy(mpMahojinModel->getBaseTRMtx()); mDoMtx_stack_c::scaleM(mMahojin2Size, mMahojin2Size, mMahojin2Size); mpMahojinModel2->setBaseTRMtx(mDoMtx_stack_c::get()); mpMahojinBrk2->play(); mpMahojinStartBtk2->play(); } } } /* 8064CD0C-8064CFA8 00ECEC 029C+00 1/1 0/0 0/0 .text cc_set__10daB_ZANT_cFv */ void daB_ZANT_c::cc_set() { mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_NECK)); mDoMtx_stack_c::multVecZero(&eyePos); attention_info.position = eyePos; attention_info.position.y += mModelScaleY * 100.0f; cXyz center; mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_BACKBONE)); mDoMtx_stack_c::transM(30.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(¢er); mBodySphCc[0].SetC(center); mBodySphCc[0].SetR(70.0f); dComIfG_Ccsp()->Set(&mBodySphCc[0]); mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_WAIST)); mDoMtx_stack_c::transM(50.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(¢er); mBodySphCc[1].SetC(center); mBodySphCc[1].SetR(70.0f); dComIfG_Ccsp()->Set(&mBodySphCc[1]); if (mFightPhase == PHASE_LAST) { mRollCc.SetC(current.pos); mRollCc.SetR(200.0f); mRollCc.SetH(250.0f); dComIfG_Ccsp()->Set(&mRollCc); mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_ARML3)); mDoMtx_stack_c::transM(100.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(¢er); mSwordCc[0].SetC(center); mSwordCc[0].SetR(50.0f); dComIfG_Ccsp()->Set(&mSwordCc[0]); mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_ARMR3)); mDoMtx_stack_c::transM(-100.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(¢er); mSwordCc[1].SetC(center); mSwordCc[1].SetR(50.0f); dComIfG_Ccsp()->Set(&mSwordCc[1]); } } /* 8064CFA8-8064DA48 00EF88 0AA0+00 1/1 0/0 0/0 .text cc_ice_set__10daB_ZANT_cFv */ void daB_ZANT_c::cc_ice_set() { class dZantSph_c { public: int joint_no; f32 offset_x; f32 radius; }; static dZantSph_c ice_sph_jnt[] = { {JNT_FOOTL, 10.0f, 15.0f}, {JNT_LEGL2, 20.0f, 20.0f}, {JNT_LEGL2, 0.0f, 25.0f}, {JNT_LEGL1, 20.0f, 30.0f}, {JNT_FOOTR, 10.0f, 15.0f}, {JNT_LEGR2, 20.0f, 20.0f}, {JNT_LEGR2, 0.0f, 25.0f}, {JNT_LEGR1, 20.0f, 30.0f}, {JNT_WAIST, 0.0f, 45.0f}, {JNT_BACKBONE, 20.0f, 45.0f}, {JNT_HEAD, 20.0f, 25.0f}, }; cXyz sp34; cXyz sp40; if (mAction == ACT_ICE_STEP || mAction == ACT_ICE_JUMP) { if (!dComIfGp_getAttention()->LockonTruth() || dComIfGp_getAttention()->LockonTarget(0) != this) { mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTL)); mDoMtx_stack_c::transM(20.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(&sp34); mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTR)); mDoMtx_stack_c::transM(20.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(&sp40); cXyz player_pos(daPy_getPlayerActorClass()->current.pos); s16 player_angle = daPy_getPlayerActorClass()->shape_angle.y; if (sp34.absXZ(player_pos) < 700.0f) { field_0x70d = 0; if (sp40.absXZ(player_pos) < 700.0f && abs((s16)(player_angle - cLib_targetAngleY(&player_pos, &sp40))) < abs((s16)(player_angle - cLib_targetAngleY(&player_pos, &sp34)))) { field_0x70d = 1; } } else if (sp40.absXZ(player_pos) < 700.0f) { field_0x70d = 1; } else if (sp34.absXZ(player_pos) < sp40.absXZ(player_pos)) { field_0x70d = 0; } else { field_0x70d = 1; } if (field_0x70d == 0) { eyePos = sp34; } else { eyePos = sp40; } } else { if (field_0x70d == 0) { mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTL)); } else { mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_FOOTR)); } mDoMtx_stack_c::transM(20.0f, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(&eyePos); } attention_info.position = eyePos; attention_info.position.y += 120.0f; } else { mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(JNT_NECK)); mDoMtx_stack_c::multVecZero(&eyePos); attention_info.position = eyePos; attention_info.position.y += mModelScaleY * 120.0f; } cXyz sp64; dZantSph_c sph; for (int i = 0; i < 6; i++) { sph = ice_sph_jnt[i]; mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(sph.joint_no)); mDoMtx_stack_c::transM(sph.offset_x, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(&sp64); mFootCc[i].SetC(sp64); mFootCc[i].SetR(sph.radius * mModelScaleY); dComIfG_Ccsp()->Set(&mFootCc[i]); } for (int i = 0; i < 11; i++) { sph = ice_sph_jnt[i]; mDoMtx_stack_c::copy(mpModelMorf->getModel()->getAnmMtx(sph.joint_no)); mDoMtx_stack_c::transM(sph.offset_x, 0.0f, 0.0f); mDoMtx_stack_c::multVecZero(&sp64); mFoot2Cc[i].SetC(sp64); mFoot2Cc[i].SetR(sph.radius * mModelScaleY); dComIfG_Ccsp()->Set(&mFoot2Cc[i]); mCameraCc[i].SetC(sp64); mCameraCc[i].SetR((sph.radius + 10.0f) * mModelScaleY); dComIfG_Ccsp()->Set(&mCameraCc[i]); } } /* 8064DA48-8064DB48 00FA28 0100+00 1/1 0/0 0/0 .text execute__10daB_ZANT_cFv */ int daB_ZANT_c::execute() { if (mModeTimer != 0) { mModeTimer--; } if (field_0x6ec != 0) { field_0x6ec--; } if (field_0x6e4 != 0) { field_0x6e4--; } if (field_0x6f0 != 0) { field_0x6f0--; } if (field_0x6f4 != 0) { field_0x6f4--; } switch (field_0x714) { case 0: dKy_custom_colset(10, 0, mKankyoBlend); break; case 1: dKy_custom_colset(0, 10, mKankyoBlend); break; } action(); mtx_set(); if (mFightPhase == PHASE_YO) { cc_ice_set(); } else { cc_set(); } return 1; } /* 8064DB48-8064DB68 00FB28 0020+00 1/0 0/0 0/0 .text daB_ZANT_Execute__FP10daB_ZANT_c */ static int daB_ZANT_Execute(daB_ZANT_c* i_this) { return i_this->execute(); } /* 8064DB68-8064DB70 00FB48 0008+00 1/0 0/0 0/0 .text daB_ZANT_IsDelete__FP10daB_ZANT_c */ static int daB_ZANT_IsDelete(daB_ZANT_c* i_this) { return 1; } /* 8064DB70-8064DBE4 00FB50 0074+00 1/1 0/0 0/0 .text _delete__10daB_ZANT_cFv */ int daB_ZANT_c::_delete() { dComIfG_resDelete(&mPhase, "B_zan"); if (mInitHIO) { l_initHIO = false; } if (heap != NULL) { mSound.deleteObject(); } return 1; } /* 8064DBE4-8064DC04 00FBC4 0020+00 1/0 0/0 0/0 .text daB_ZANT_Delete__FP10daB_ZANT_c */ static int daB_ZANT_Delete(daB_ZANT_c* i_this) { return i_this->_delete(); } /* 8064DC04-8064E128 00FBE4 0524+00 1/1 0/0 0/0 .text CreateHeap__10daB_ZANT_cFv */ int daB_ZANT_c::CreateHeap() { J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("B_zan", BMDR_ZAN); JUT_ASSERT(0, modelData != 0); mpModelMorf = new mDoExt_McaMorfSO(modelData, NULL, NULL, (J3DAnmTransform*)dComIfG_getObjectRes("B_zan", BCK_ZAN_FLOAT_WAIT), 2, 1.0f, 0, -1, &mSound, 0, 0x11000084); if (mpModelMorf == NULL || mpModelMorf->getModel() == NULL) { return 0; } J3DModel* model = mpModelMorf->getModel(); model->setUserArea((uintptr_t)this); model->getModelData()->getJointNodePointer(1)->setCallBack(JointCallBack); model->getModelData()->getJointNodePointer(2)->setCallBack(JointCallBack); mpMahojinModel = mDoExt_J3DModel__create((J3DModelData*)dComIfG_getObjectRes("B_zan", BMDR_ZAN_MAHOJIN), 0x80000, 0x11000284); if (mpMahojinModel == NULL) { return 0; } mpMahojinEndBrk = new mDoExt_brkAnm(); if (mpMahojinEndBrk == NULL) { return 0; } if (!mpMahojinEndBrk->init(mpMahojinModel->getModelData(), (J3DAnmTevRegKey*)dComIfG_getObjectRes("B_zan", BRK_ZAN_MAHOJIN_END), 1, 0, 1.0f, 0, -1)) { return 0; } mpMahojinBtk = new mDoExt_btkAnm(); if (mpMahojinBtk == NULL) { return 0; } if (!mpMahojinBtk->init(mpMahojinModel->getModelData(), (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("B_zan", BTK_ZAN_MAHOJIN), 1, 2, 1.0f, 0, -1)) { return 0; } mpMahojinStartBtk = new mDoExt_btkAnm(); if (mpMahojinStartBtk == NULL) { return 0; } if (!mpMahojinStartBtk->init(mpMahojinModel->getModelData(), (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("B_zan", BTK_ZAN_MAHOJIN_START), 1, 0, 1.0f, 0, -1)) { return 0; } mpMahojinModel2 = mDoExt_J3DModel__create((J3DModelData*)dComIfG_getObjectRes("B_zan", BMDR_ZAN_MAHOJIN), 0x80000, 0x11000284); if (mpMahojinModel2 == NULL) { return 0; } mpMahojinBrk2 = new mDoExt_brkAnm(); if (mpMahojinBrk2 == NULL) { return 0; } if (!mpMahojinBrk2->init(mpMahojinModel2->getModelData(), (J3DAnmTevRegKey*)dComIfG_getObjectRes("B_zan", BRK_ZAN_MAHOJIN_END), 1, 0, 0.0f, 0, -1)) { return 0; } mpMahojinStartBtk2 = new mDoExt_btkAnm(); if (mpMahojinStartBtk2 == NULL) { return 0; } if (!mpMahojinStartBtk2->init(mpMahojinModel2->getModelData(), (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("B_zan", BTK_ZAN_MAHOJIN_START), 1, 0, 1.0f, 0, -1)) { return 0; } modelData = (J3DModelData*)dComIfG_getObjectRes("B_zan", BMDR_ZAN_SWORD_L); JUT_ASSERT(0, modelData != 0); mpSwordLModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); if (mpSwordLModel == NULL) { return 0; } modelData = (J3DModelData*)dComIfG_getObjectRes("B_zan", BMDR_ZAN_SWORD_R); JUT_ASSERT(0, modelData != 0); mpSwordRModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); if (mpSwordRModel == NULL) { return 0; } return 1; } /* 8064E170-8064E190 010150 0020+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */ static int useHeapInit(fopAc_ac_c* i_this) { return ((daB_ZANT_c*)i_this)->CreateHeap(); } /* 8064E190-8064E724 010170 0594+00 1/1 0/0 0/0 .text create__10daB_ZANT_cFv */ int daB_ZANT_c::create() { fopAcM_SetupActor(this, daB_ZANT_c); OS_REPORT("B_ZANT PARAM %x\n", fopAcM_GetParam(this)); mSwbit = fopAcM_GetParam(this); if (mSwbit != 0xFF) { if (dComIfGs_isSwitch(mSwbit, fopAcM_GetRoomNo(this))) { OS_REPORT("B_ZANT やられ後なので再セットしません\n"); return cPhs_ERROR_e; } } fopAcM_setStageLayer(this); int phase_state = dComIfG_resLoad(&mPhase, "B_zan"); if (phase_state == cPhs_COMPLEATE_e) { if (!fopAcM_entrySolidHeap(this, useHeapInit, 0x8F80)) { return cPhs_ERROR_e; } if (!l_initHIO) { l_initHIO = true; mInitHIO = true; l_HIO.field_0x4 = -1; } attention_info.flags = fopAc_AttnFlag_BATTLE_e; attention_info.distances[fopAc_attn_BATTLE_e] = 24; fopAcM_SetMtx(this, mpModelMorf->getModel()->getBaseTRMtx()); fopAcM_SetMin(this, -200.0f, -200.0f, -200.0f); fopAcM_SetMax(this, 200.0f, 200.0f, 200.0f); mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), NULL, NULL); mAcchCir.SetWall(100.0f, 100.0f); health = 600; field_0x560 = 600; field_0x9a4.Init(0xFE, 0, this); mBodySphCc[0].Set(cc_zant_src); mBodySphCc[0].SetStts(&field_0x9a4); mBodySphCc[1].Set(cc_zant_src); mBodySphCc[1].SetStts(&field_0x9a4); mRollCc.Set(cc_zant_roll_src); mRollCc.SetStts(&field_0x9a4); mSwordCc[0].Set(cc_zant_sword_src); mSwordCc[0].SetStts(&field_0x9a4); mSwordCc[1].Set(cc_zant_sword_src); mSwordCc[1].SetStts(&field_0x9a4); field_0xc74.Init(0xFE, 0, this); for (int i = 0; i < 11; i++) { mFoot2Cc[i].Set(cc_zant_foot_src2); mFoot2Cc[i].SetStts(&field_0xc74); mFootCc[i].Set(cc_zant_foot_src); mFootCc[i].SetStts(&field_0xc74); mCameraCc[i].Set(cc_zant_camera_src); mCameraCc[i].SetStts(&field_0xc74); } mSound.init(¤t.pos, &eyePos, 3, 1); mSound.setEnemyName("B_zant"); mAtInfo.mpSound = &mSound; mAtInfo.mPowerType = 0; gravity = 0.0f; for (int i = 0; i < 9; i++) { mPillarIDs[i] = fpcM_ERROR_PROCESS_ID_e; } for (int i = 0; i < 4; i++) { mMobileIDs[i] = fpcM_ERROR_PROCESS_ID_e; } field_0x724 = -1; if (dComIfGp_roomControl_getStayNo() == 60) { mFightPhase = PHASE_LAST; field_0x718 = 1; } else if (dComIfGp_roomControl_getStayNo() == 50) { mFightPhase = PHASE_OP; } else { mFightPhase = dComIfGp_roomControl_getStayNo() - 52; if (mFightPhase >= PHASE_MAX) { mFightPhase = PHASE_BB; } } if (mFightPhase != PHASE_OP) { Z2GetAudioMgr()->bgmStart(Z2BGM_BOSS_ZANT, 0, 0); Z2GetAudioMgr()->changeBgmStatus(mFightPhase); } initNextRoom(); mKankyoBlend = 1.0f; setBaseActionMode(1); if (mFightPhase == PHASE_BB) { field_0x70b = 0; } mModelScaleXZ = 1.0f; mModelScaleY = 1.0f; onWolfNoLock(); mtx_set(); } return phase_state; } /* 8064E92C-8064E94C 01090C 0020+00 1/0 0/0 0/0 .text daB_ZANT_Create__FP10daB_ZANT_c */ static int daB_ZANT_Create(daB_ZANT_c* i_this) { return i_this->create(); } /* 8064F4AC-8064F4CC -00001 0020+00 1/0 0/0 0/0 .data l_daB_ZANT_Method */ static actor_method_class l_daB_ZANT_Method = { (process_method_func)daB_ZANT_Create, (process_method_func)daB_ZANT_Delete, (process_method_func)daB_ZANT_Execute, (process_method_func)daB_ZANT_IsDelete, (process_method_func)daB_ZANT_Draw, }; /* 8064F4CC-8064F4FC -00001 0030+00 0/0 0/0 1/0 .data g_profile_B_ZANT */ extern actor_process_profile_definition g_profile_B_ZANT = { fpcLy_CURRENT_e, // mLayerID 4, // mListID fpcPi_CURRENT_e, // mListPrio PROC_B_ZANT, // mProcName &g_fpcLf_Method.base, // sub_method sizeof(daB_ZANT_c), // mSize 0, // mSizeOther 0, // mParameters &g_fopAc_Method.base, // sub_method 226, // mPriority &l_daB_ZANT_Method, // sub_method 0x00040000, // mStatus fopAc_ENEMY_e, // mActorType fopAc_CULLBOX_CUSTOM_e, // cullType }; AUDIO_INSTANCES; JAUSectionHeap* JASGlobalInstance::sInstance;