From 72cb2950a0d8218eb791e3c5eeeaf2acd28e66e6 Mon Sep 17 00:00:00 2001 From: YunataSavior <58997725+YunataSavior@users.noreply.github.com> Date: Sun, 9 Nov 2025 01:19:04 -0800 Subject: [PATCH] e_oc dbg work and cleanup (#2783) * e_oc dbg work and cleanup * daE_OC_c::getVisionAngle arg rename --- include/d/actor/d_a_e_oc.h | 53 +- include/d/actor/d_a_obj_rotBridge.h | 4 +- src/d/actor/d_a_e_oc.cpp | 1372 ++++++++++++++++----------- 3 files changed, 838 insertions(+), 591 deletions(-) diff --git a/include/d/actor/d_a_e_oc.h b/include/d/actor/d_a_e_oc.h index 584cb98956c..6466f0b16d7 100644 --- a/include/d/actor/d_a_e_oc.h +++ b/include/d/actor/d_a_e_oc.h @@ -4,6 +4,7 @@ #include "f_op/f_op_actor_mng.h" #include "d/d_bg_s_acch.h" #include "d/d_cc_d.h" +#include "d/d_cc_uty.h" /** @@ -21,16 +22,16 @@ public: /* 8072C630 */ int ctrlJoint(J3DJoint*, J3DModel*); /* 8072C6E8 */ static int JointCallBack(J3DJoint*, int); /* 8072C734 */ int draw(); - /* 8072CBD4 */ int getVisionAngle(fopAc_ac_c*); + /* 8072CBD4 */ s16 getVisionAngle(fopAc_ac_c*); /* 8072CC10 */ void searchOtherOc(); - /* 8072CDA8 */ int setWatchMode(); - /* 8072CE00 */ int searchPlayer(); - /* 8072CF90 */ int searchPlayer2(); - /* 8072D100 */ int searchPlayerShakeHead(); - /* 8072D1DC */ int searchSound(); + /* 8072CDA8 */ bool setWatchMode(); + /* 8072CE00 */ bool searchPlayer(); + /* 8072CF90 */ bool searchPlayer2(); + /* 8072D100 */ bool searchPlayerShakeHead(); + /* 8072D1DC */ bool searchSound(); /* 8072D364 */ int checkBeforeBg(); - /* 8072D640 */ int checkBeforeBgFind(); - /* 8072D87C */ int checkBeforeFloorBg(f32); + /* 8072D640 */ bool checkBeforeBgFind(); + /* 8072D87C */ bool checkBeforeFloorBg(f32); /* 8072D994 */ void checkDamageBg(); /* 8072DB10 */ void setGroundAngle(); /* 8072DCBC */ void setActionMode(int, int); @@ -58,7 +59,7 @@ public: /* 80731124 */ void executeBigDamage(); /* 807316F8 */ void executeWatch(); /* 807319E4 */ void executeSoundWatch(); - /* 80731D18 */ int checkBeforeDeath(); + /* 80731D18 */ bool checkBeforeDeath(); /* 80731D4C */ void executeDeath(); /* 80731F5C */ void setWaterEffect(); /* 80732074 */ void executeWaterDeath(); @@ -78,12 +79,12 @@ public: /* 80734C10 */ int CreateHeap(); /* 80734DA8 */ cPhs__Step create(); - u8 isHomeWait() const { return mIsHomeWait; } - u8 isBattleOn() const { return mBattleOn; } - f32 getMoveRange() const { return mMoveRange; } - f32 getPlayerRange() const { return mPlayerRange; } - int getActionMode() const { return mActionMode; } - daE_OC_c* getTalkOc() const { return mpTalk; } + bool isHomeWait() { return mIsHomeWait; } + bool isBattleOn() { return mBattleOn; } + f32 getMoveRange() { return mMoveRange; } + f32 getPlayerRange() { return mPlayerRange; } + int getActionMode() { return mActionMode; } + daE_OC_c* getTalkOc() { return mpTalk; } J3DModel* getOcModel() { return mpMorf->getModel(); } private: @@ -96,7 +97,7 @@ private: /* 0x670 */ daE_OC_c* mpTalk; /* 0x674 */ daE_OC_c* mpParent; /* 0x678 */ daRotBridge_c* mpBridge; - /* 0x67c */ cXyz field_0x67c; + /* 0x67c */ cXyz mWatchPos; /* 0x688 */ csXyz field_0x688; /* 0x690 */ f32 mMoveRange; /* 0x690 */ f32 mPlayerRange; @@ -129,7 +130,7 @@ private: /* 0x6dd */ u8 field_0x6dd; /* 0x6de */ u8 field_0x6de; /* 0x6df */ u8 field_0x6df; - /* 0x6e0 */ u8 field_0x6e0; + /* 0x6e0 */ u8 mDefeatedSwitch; /* 0x6e1 */ u8 field_0x6e1; /* 0x6e2 */ u8 field_0x6e2; /* 0x6e3 */ u8 field_0x6e3; @@ -137,7 +138,7 @@ private: /* 0x6e8 */ u8 field_0x6e8; /* 0x6e9 */ u8 mIsHomeWait; /* 0x6ea */ u8 mBattleOn; - /* 0x6eb */ u8 field_0x6eb; + /* 0x6eb */ bool mHide; /* 0x6ec */ cXyz mPlayerPos; /* 0x6f8 */ cXyz field_0x6f8; /* 0x704 */ f32 field_0x704; @@ -146,21 +147,11 @@ private: /* 0x920 */ dCcD_Stts mStts; /* 0x95c */ dCcD_Sph mSphs_cc[2]; /* 0xbcc */ dCcD_Sph mSphs_at[2]; - /* 0xe3c */ cCcD_Obj* mpTgHitObj; - /* 0xe40 */ u8 field_0xe40[0xe44 - 0xe40]; - /* 0xe44 */ Z2CreatureEnemy* mpSound; - /* 0xe48 */ u8 field_0xe48[0xe4a - 0xe48]; - /* 0xe4a */ s16 field_0xe4a; - /* 0xe4c */ u8 field_0xe4c[0xe58 - 0xe4c]; - /* 0xe58 */ u16 field_0xe58; - /* 0xe5a */ u8 field_0xe5a; - /* 0xe5b */ u8 field_0xe5b; // might be unused. - /* 0xe5c */ u8 field_0xe5c[0xe60 - 0xe5c]; + /* 0xe3c */ dCcU_AtInfo mAtInfo; /* 0xe60 */ u32 field_0xe60; /* 0xe64 */ u32 field_0xe64; - /* 0xe68 */ u32 mParticleKey; - /* 0xe6c */ u32 field_0xe6c; - /* 0xe70 */ u32 field_0xe70[4]; + /* 0xe68 */ u32 mParticleKeys[2]; + /* 0xe70 */ u32 mWaterEffects[4]; /* 0xe80 */ u32 mRippleKey; /* 0xe84 */ u8 field_0xe84; }; diff --git a/include/d/actor/d_a_obj_rotBridge.h b/include/d/actor/d_a_obj_rotBridge.h index 4f518b0ce2b..a0b674d3e61 100644 --- a/include/d/actor/d_a_obj_rotBridge.h +++ b/include/d/actor/d_a_obj_rotBridge.h @@ -26,8 +26,8 @@ public: /* 80CBF404 */ virtual int Draw(); /* 80CBF4BC */ virtual int Delete(); - u8 getPlayerRide() const { return mIsPlayerRide; } - u8 getBridgeAngle() const { return mBridgeAngle; } + u8 getPlayerRide() { return mIsPlayerRide; } + u8 getBridgeAngle() { return mBridgeAngle; } /* 0x5A0 */ request_of_phase_process_class mPhase; /* 0x5A8 */ J3DModel* mpModel; diff --git a/src/d/actor/d_a_e_oc.cpp b/src/d/actor/d_a_e_oc.cpp index a92b3ad77e9..76504b6759f 100644 --- a/src/d/actor/d_a_e_oc.cpp +++ b/src/d/actor/d_a_e_oc.cpp @@ -15,26 +15,47 @@ #include "f_op/f_op_actor_enemy.h" #include "f_op/f_op_camera_mng.h" -class daE_OC_HIO_c { + +enum OC_ACTIONS { + E_OC_ACTION_WAIT, + E_OC_ACTION_WALK, + E_OC_ACTION_TALK, + E_OC_ACTION_FIND, + E_OC_ACTION_ATTACK, + E_OC_ACTION_DAMAGE, + E_OC_ACTION_BIG_DAMAGE, + E_OC_ACTION_WATCH, + E_OC_ACTION_SOUND_WATCH, + E_OC_ACTION_DEATH, + E_OC_ACTION_WATER_DEATH, + E_OC_ACTION_DEMO_MASTER, + E_OC_ACTION_DEMO_CHILD, + E_OC_ACTION_FALL_DEAD, + E_OC_ACTION_FALL, + E_OC_ACTION_FIND_STAY, + E_OC_ACTION_MOVE_OUT, +}; + +class daE_OC_HIO_c : public JORReflexible { public: /* 8072C5CC */ daE_OC_HIO_c(); /* 80735630 */ virtual ~daE_OC_HIO_c() {} /* 0x04 */ s8 field_0x04; - /* 0x05 */ u8 field_0x05; - /* 0x08 */ f32 field_0x08; - /* 0x0c */ f32 field_0x0c; - /* 0x10 */ f32 field_0x10; - /* 0x14 */ f32 field_0x14; - /* 0x18 */ f32 field_0x18; - /* 0x1c */ f32 field_0x1c; - /* 0x20 */ f32 field_0x20; - /* 0x24 */ f32 field_0x24; -}; + /* 0x05 */ u8 radius_representation; + /* 0x08 */ f32 plyr_srch_max_radius_S; + /* 0x0c */ f32 plyr_srch_max_radius_M; + /* 0x10 */ f32 plyr_srch_min_radius; + /* 0x14 */ f32 battle_participation_radius; + /* 0x18 */ f32 teammate_attention_radius; + /* 0x1c */ f32 basic_size; + /* 0x20 */ f32 standby_distance; + /* 0x24 */ f32 demo_waiting_time; -// -// Declarations: -// +#if DEBUG + void genMessage(JORMContext*); +#endif +}; /* 80735B54-80735B7C 00002C 0028+00 0/1 0/0 0/0 .rodata oc_attackb_trans__6E_OC_n */ f32 const E_OC_n::oc_attackb_trans[10] = { @@ -77,22 +98,47 @@ dCcD_SrcSph E_OC_n::at_sph_src = { /* 8072C5CC-8072C630 0000EC 0064+00 1/1 0/0 0/0 .text __ct__12daE_OC_HIO_cFv */ daE_OC_HIO_c::daE_OC_HIO_c() { field_0x04 = -1; - field_0x05 = 0; - field_0x1c = 1.5f; - field_0x08 = 1200.0f; - field_0x0c = 5000.0f; - field_0x10 = 400.0f; - field_0x14 = 1200.0f; - field_0x18 = 2000.0f; - field_0x20 = 1400.0f; - field_0x24 = 70.0f; + radius_representation = 0; + basic_size = 1.5f; + plyr_srch_max_radius_S = 1200.0f; + plyr_srch_max_radius_M = 5000.0f; + plyr_srch_min_radius = 400.0f; + battle_participation_radius = 1200.0f; + teammate_attention_radius = 2000.0f; + standby_distance = 1400.0f; + demo_waiting_time = 70.0f; } +#if DEBUG +void daE_OC_HIO_c::genMessage(JORMContext* ctext) { + // enemy sample + ctext->genLabel("敵サンプル", 0x80000001, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // basic size + ctext->genSlider("基本サイズ", &basic_size, 0.0f, 5.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // player search max radius S + ctext->genSlider("プレイヤーサーチ最大半径S", &plyr_srch_max_radius_S, 0.0f, 10000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // player search max radius M + ctext->genSlider("プレイヤーサーチ最大半径M", &plyr_srch_max_radius_M, 0.0f, 10000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // player search min radius + ctext->genSlider("プレイヤーサーチ最小半径", &plyr_srch_min_radius, 0.0f, 10000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // battle participation radius + ctext->genSlider("戦闘参加半径", &battle_participation_radius, 0.0f, 3000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // attention radius of slain teammate + ctext->genSlider("やられ仲間注目半径", &teammate_attention_radius, 0.0f, 3000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // demo waiting time + ctext->genSlider("デモ待機時間", &demo_waiting_time, 0.0f, 3000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // out of range standby distance + ctext->genSlider("範囲外待機距離", &standby_distance, 0.0f, 10000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // radius representation + ctext->genCheckBox("半径表示", &radius_representation, 1, 0, NULL, -1, -1, 0x200, 0x18); +} +#endif + /* 8072C630-8072C6E8 000150 00B8+00 1/1 0/0 0/0 .text ctrlJoint__8daE_OC_cFP8J3DJointP8J3DModel */ int daE_OC_c::ctrlJoint(J3DJoint* i_joint, J3DModel* param_1) { - int jnt_no = i_joint->getJntNo(); - MtxP anmMtx = param_1->getAnmMtx(jnt_no); - mDoMtx_stack_c::copy(anmMtx); + J3DJoint* my_joint = i_joint; + int jnt_no = my_joint->getJntNo(); + mDoMtx_stack_c::copy(param_1->getAnmMtx(jnt_no)); if (jnt_no == 0x11) { mDoMtx_stack_c::YrotM(field_0x6d2); } else if (jnt_no == 0xc) { @@ -106,9 +152,10 @@ int daE_OC_c::ctrlJoint(J3DJoint* i_joint, J3DModel* param_1) { /* 8072C6E8-8072C734 000208 004C+00 1/1 0/0 0/0 .text JointCallBack__8daE_OC_cFP8J3DJointi */ int daE_OC_c::JointCallBack(J3DJoint* i_joint, int param_1) { if (param_1 == 0) { - daE_OC_c* bokoblin_ptr = (daE_OC_c*) j3dSys.getModel()->getUserArea(); + J3DModel* model_p = j3dSys.getModel(); + daE_OC_c* bokoblin_ptr = (daE_OC_c*) model_p->getUserArea(); if (bokoblin_ptr) { - bokoblin_ptr->ctrlJoint(i_joint, j3dSys.getModel()); + bokoblin_ptr->ctrlJoint(i_joint, model_p); } } return 1; @@ -119,8 +166,10 @@ int daE_OC_c::draw() { J3DModel* model = mpMorf->getModel(); g_env_light.settingTevStruct(0, ¤t.pos, &tevStr); g_env_light.setLightTevColorType_MAJI(model, &tevStr); - if (field_0x6eb != 0) + if (mHide) { return 1; + } + if (field_0x6e8 != 0) { J3DModelData* model_data = model->getModelData(); for (u16 idx = 0; idx < model_data->getMaterialNum(); ++idx) { @@ -130,18 +179,20 @@ int daE_OC_c::draw() { material->getTevColor(0)->b = field_0x6e4; } } + mpMorf->entryDL(); - cXyz my_vec; - my_vec.set(current.pos.x, 100.0f + current.pos.y, current.pos.z); - _GXTexObj* tex_obj = dDlst_shadowControl_c::getSimpleTex(); - mShadowKey = dComIfGd_setShadow(mShadowKey, 1, model, &my_vec, 1000.0f, 0.0f, + cXyz shadow_pos; + shadow_pos.set(current.pos.x, 100.0f + current.pos.y, current.pos.z); + mShadowKey = dComIfGd_setShadow(mShadowKey, 1, model, &shadow_pos, 1000.0f, 0.0f, current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, - &tevStr, 0, 1.0f, tex_obj); + &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); + if (mpModel) { g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr); mDoExt_modelUpdateDL(mpModel); dComIfGd_addRealShadow(mShadowKey, mpModel); } + return 1; } @@ -170,50 +221,51 @@ static daE_OC_HIO_c l_HIO; /* 8072C938-8072CBD4 000458 029C+00 1/1 0/0 0/0 .text s_other_oc__FPvPv */ static void* s_other_oc(void* arg_lhs, void* arg_rhs) { + f32 dist; if (arg_lhs != arg_rhs && fopAcM_IsActor(arg_lhs)) { - fopAc_ac_c* actor_rhs = static_cast(arg_rhs); - daE_OC_c* actor_lhs = static_cast(arg_lhs); - if (fpcM_IsCreating(fopAcM_GetID(actor_lhs)) == 0 && fopAcM_GetName(actor_lhs) == 0x1fe) { - if (actor_lhs->isBattleOn() && fopAcM_searchActorDistance(actor_lhs, actor_rhs) < l_HIO.field_0x14) { - f32 abs_val = actor_lhs->current.pos.absXZ(actor_rhs->home.pos); - if (abs_val < ((daE_OC_c*) arg_rhs)->getMoveRange()) { - if (fopAcM_searchPlayerDistance(actor_lhs) < actor_lhs->getPlayerRange()) { - E_OC_n::m_battle_oc = actor_lhs; + if (fpcM_IsCreating(fopAcM_GetID(arg_lhs)) == 0 && fopAcM_GetName(arg_lhs) == PROC_E_OC) { + if (((daE_OC_c*) arg_lhs)->isBattleOn()) { + dist = fopAcM_searchActorDistance((fopAc_ac_c*) arg_lhs, (fopAc_ac_c*) arg_rhs); + if (dist < l_HIO.battle_participation_radius) { + dist = ((fopAc_ac_c*) arg_lhs)->current.pos.absXZ(((fopAc_ac_c*) arg_rhs)->home.pos); + if (dist < ((daE_OC_c*) arg_rhs)->getMoveRange()) { + if (fopAcM_searchPlayerDistance((fopAc_ac_c*) arg_lhs) < ((daE_OC_c*) arg_lhs)->getPlayerRange()) { + E_OC_n::m_battle_oc = (daE_OC_c*) arg_lhs; + } } } } - int action_mode = actor_lhs->getActionMode(); - switch (action_mode) { - case 6: - if (fopAcM_searchActorDistance(actor_lhs, actor_rhs) < l_HIO.field_0x18) { - E_OC_n::m_damage_oc = actor_lhs; + + switch (((daE_OC_c*) arg_lhs)->getActionMode()) { + case E_OC_ACTION_BIG_DAMAGE: + dist = fopAcM_searchActorDistance((fopAc_ac_c*) arg_lhs, (fopAc_ac_c*) arg_rhs); + if (dist < l_HIO.teammate_attention_radius) { + E_OC_n::m_damage_oc = (daE_OC_c*) arg_lhs; } break; - case 9: - if (fopAcM_searchActorDistance(actor_lhs, actor_rhs) < l_HIO.field_0x18) { - E_OC_n::m_death_oc = actor_lhs; + case E_OC_ACTION_DEATH: + dist = fopAcM_searchActorDistance((fopAc_ac_c*) arg_lhs, (fopAc_ac_c*) arg_rhs); + if (dist < l_HIO.teammate_attention_radius) { + E_OC_n::m_death_oc = (daE_OC_c*) arg_lhs; } break; - case 0: - case 1: { - f32 dist = fopAcM_searchActorDistance(actor_lhs, actor_rhs); + case E_OC_ACTION_WAIT: + case E_OC_ACTION_WALK: + dist = fopAcM_searchActorDistance((fopAc_ac_c*) arg_lhs, (fopAc_ac_c*) arg_rhs); if (dist < 400.0f && dist > 200.0f) { - E_OC_n::m_talk_oc = actor_lhs; + E_OC_n::m_talk_oc = (daE_OC_c*) arg_lhs; } break; - } - default: - break; } } } + return NULL; } /* 8072CBD4-8072CC10 0006F4 003C+00 1/1 0/0 0/0 .text getVisionAngle__8daE_OC_cFP10fopAc_ac_c */ -int daE_OC_c::getVisionAngle(fopAc_ac_c* i_this) { - s16 act_angle = fopAcM_searchActorAngleY(this, i_this); - return (s16)cLib_distanceAngleS(shape_angle.y, act_angle); +s16 daE_OC_c::getVisionAngle(fopAc_ac_c* other_oc) { + return cLib_distanceAngleS(shape_angle.y, fopAcM_searchActorAngleY(this, other_oc)); } /* 8072CC10-8072CDA8 000730 0198+00 1/1 0/0 0/0 .text searchOtherOc__8daE_OC_cFv */ @@ -226,156 +278,188 @@ void daE_OC_c::searchOtherOc() { E_OC_n::m_talk_oc = NULL; fpcM_Search(s_other_oc, this); mpBattle = E_OC_n::m_battle_oc; - if (field_0x6c6 == 0 && (mActionMode == 0 || mActionMode == 1)) { + if (field_0x6c6 == 0 && (mActionMode == E_OC_ACTION_WAIT || mActionMode == E_OC_ACTION_WALK)) { mpTalk = E_OC_n::m_talk_oc; if (mpTalk && mpTalk->getTalkOc() == this) { s16 sh_val = 0x2000; if (isHomeWait() && mpTalk->isHomeWait()) { sh_val = 0x4800; } - if ((s16)getVisionAngle(mpTalk) <= sh_val && (s16)mpTalk->getVisionAngle(this) <= sh_val) { - setActionMode(2, 0); - mpTalk->setActionMode(2, 0); + + if (getVisionAngle(mpTalk) <= sh_val && mpTalk->getVisionAngle(this) <= sh_val) { + setActionMode(E_OC_ACTION_TALK, 0); + mpTalk->setActionMode(E_OC_ACTION_TALK, 0); } } } + if (mpDamage == NULL || mpDamage != E_OC_n::m_damage_oc) { mpDamage = E_OC_n::m_damage_oc; if (mpDamage) { field_0x6dd = 1; } } - if (E_OC_n::m_death_oc && E_OC_n::m_death_oc->checkBeforeDeath() & 0xff) { + + if (E_OC_n::m_death_oc && E_OC_n::m_death_oc->checkBeforeDeath()) { field_0x6dd = 2; - field_0x67c = E_OC_n::m_death_oc->current.pos; + mWatchPos = E_OC_n::m_death_oc->current.pos; } } } /* 8072CDA8-8072CE00 0008C8 0058+00 5/5 0/0 0/0 .text setWatchMode__8daE_OC_cFv */ -int daE_OC_c::setWatchMode() { +bool daE_OC_c::setWatchMode() { if (field_0x6dd != 0) { - if (field_0x6dd == 1) - setActionMode(7, 0); - else - setActionMode(7, 2); - return 1; + if (field_0x6dd == 1) { + setActionMode(E_OC_ACTION_WATCH, 0); + } else { + setActionMode(E_OC_ACTION_WATCH, 2); + } + + return true; } - return 0; + + return false; } /* 8072CE00-8072CF00 000920 0100+00 1/1 0/0 0/0 .text searchPlayer__8daE_OC_cFv */ -int daE_OC_c::searchPlayer() { +bool daE_OC_c::searchPlayer() { if (fopAcM_searchPlayerDistance(this) < mPlayerRange) { s16 diff = shape_angle.y - fopAcM_searchPlayerAngleY(this); - if (fopAcM_searchPlayerDistance(this) < l_HIO.field_0x10) { - if (daPy_getPlayerActorClass()->speedF > 12.0f) - return 1; + if (fopAcM_searchPlayerDistance(this) < l_HIO.plyr_srch_min_radius) { + if (daPy_getPlayerActorClass()->speedF > 12.0f) { + return true; + } + if (abs(diff) < 0x5000) { - if (fopAcM_otherBgCheck(this,dComIfGp_getPlayer(0)) == 0) - return 1; + if (fopAcM_otherBgCheck(this, dComIfGp_getPlayer(0)) == 0) { + return true; + } } } else { if (abs(diff) < 0x4000) { - if (fopAcM_otherBgCheck(this,dComIfGp_getPlayer(0)) == 0) - return 1; + if (fopAcM_otherBgCheck(this, dComIfGp_getPlayer(0)) == 0) { + return true; + } } } } - return 0; + + return false; } /* 8072CF00-8072CF90 000A20 0090+00 1/1 0/0 0/0 .text s_obj_sub__FPvPv */ static void* s_obj_sub(void* arg_lhs, void* arg_rhs) { if (fopAcM_IsActor(arg_lhs)) { - if (fpcM_IsCreating(fopAcM_GetID(arg_lhs)) == 0 && fopAcM_GetName(arg_lhs) == 0x36) { - fopAc_ac_c* actor_lhs = static_cast(arg_lhs); - fopAc_ac_c* actor_rhs = static_cast(arg_rhs); - if (fopAcM_GetRoomNo(actor_lhs) == fopAcM_GetRoomNo(actor_rhs)) + if (fpcM_IsCreating(fopAcM_GetID(arg_lhs)) == 0 && fopAcM_GetName(arg_lhs) == PROC_Obj_RotBridge) { + if (fopAcM_GetRoomNo((fopAc_ac_c*) arg_lhs) == fopAcM_GetRoomNo((fopAc_ac_c*) arg_rhs)) { return arg_lhs; + } } } + return NULL; } /* 8072CF90-8072D100 000AB0 0170+00 6/6 0/0 0/0 .text searchPlayer2__8daE_OC_cFv */ -int daE_OC_c::searchPlayer2() { +bool daE_OC_c::searchPlayer2() { field_0x6e2 = 0; if (field_0x6b4 == 2) { mpBridge = (daRotBridge_c *) fpcM_Search(s_obj_sub, this); if (mpBridge && mpBridge->getPlayerRide()) { if (mpBridge->getBridgeAngle()) { - if (field_0x6e1 != 0xff) { - if (dComIfGs_isSwitch(field_0x6e1, fopAcM_GetRoomNo(this)) == 0) { + if (field_0x6e1 != 0xFF) { + if (!dComIfGs_isSwitch(field_0x6e1, fopAcM_GetRoomNo(this))) { dComIfGs_onSwitch(field_0x6e1, fopAcM_GetRoomNo(this)); } } + field_0x6e2 = 1; - return 1; + return true; } - return 0; + + return false; } } - if (searchPlayer() & 0xff) { - if (field_0x6b4 == 2 && field_0x6e1 != 0xff) { - if (dComIfGs_isSwitch(field_0x6e1, fopAcM_GetRoomNo(this)) == 0) { + + if (searchPlayer()) { + if (field_0x6b4 == 2 && field_0x6e1 != 0xFF) { + if (!dComIfGs_isSwitch(field_0x6e1, fopAcM_GetRoomNo(this))) { dComIfGs_onSwitch(field_0x6e1, fopAcM_GetRoomNo(this)); field_0x6e2 = 1; } } - return 1; + + return true; } + if (mpBattle) { - if (mpBattle->getActionMode() != 3) - return 1; - if (mpBattle->searchPlayer() & 0xff) - return 1; + if (mpBattle->getActionMode() != E_OC_ACTION_FIND) { + return true; + } + + if (mpBattle->searchPlayer()) { + return true; + } } - return 0; + + return false; } /* 8072D100-8072D1DC 000C20 00DC+00 2/2 0/0 0/0 .text searchPlayerShakeHead__8daE_OC_cFv */ -int daE_OC_c::searchPlayerShakeHead() { - if (field_0x6e3 != 0) - return 0; - if (field_0x6b4 == 2 && mpBridge && mpBridge->getPlayerRide()) - return 0; +bool daE_OC_c::searchPlayerShakeHead() { + if (field_0x6e3) { + return false; + } + + if (field_0x6b4 == 2 && mpBridge && mpBridge->getPlayerRide()) { + return false; + } + if (fopAcM_searchPlayerDistance(this) < mPlayerRange) { s16 diff = getHeadAngle() - fopAcM_searchPlayerAngleY(this); if (abs(diff) < 0x2000) { - if (fopAcM_otherBgCheck(this, dComIfGp_getPlayer(0)) == 0) - return 1; + if (fopAcM_otherBgCheck(this, dComIfGp_getPlayer(0)) == FALSE) { + return true; + } } } - return 0; + + return false; } /* 8072D1DC-8072D2E8 000CFC 010C+00 3/3 0/0 0/0 .text searchSound__8daE_OC_cFv */ -int daE_OC_c::searchSound() { - if (field_0x6b4 == 2 && mpBridge && mpBridge->getPlayerRide()) - return 0; +bool daE_OC_c::searchSound() { + if (field_0x6b4 == 2 && mpBridge && mpBridge->getPlayerRide()) { + return false; + } + if (daPy_getPlayerActorClass()->getCutType() != daPy_py_c::CUT_TYPE_NONE && fopAcM_searchPlayerDistance(this) < mPlayerRange) { - field_0x67c = dComIfGp_getPlayer(0)->current.pos; - setActionMode(8, 0); - return 1; + mWatchPos = dComIfGp_getPlayer(0)->current.pos; + setActionMode(E_OC_ACTION_SOUND_WATCH, 0); + return true; } + if (fopAcM_otoCheck(this, 1000.0f)) { - field_0x67c = dKy_Sound_get()->position; - setActionMode(8, 0); - return 1; + mWatchPos = dKy_Sound_get()->position; + setActionMode(E_OC_ACTION_SOUND_WATCH, 0); + return true; } - return 0; + + return false; } /* 8072D2E8-8072D364 000E08 007C+00 1/1 0/0 0/0 .text s_demo_oc__FPvPv */ static void* s_demo_oc(void* arg_lhs, void* arg_rhs) { + (void) arg_rhs; if (fopAcM_IsActor(arg_lhs)) { - if (fpcM_IsCreating(fopAcM_GetID(arg_lhs)) == 0 && fopAcM_GetName(arg_lhs) == 0x1fe - && (fopAcM_GetParam(arg_lhs) & 0xff) == 4) { + if (fpcM_IsCreating(fopAcM_GetID(arg_lhs)) == 0 && fopAcM_GetName(arg_lhs) == PROC_E_OC + && (fopAcM_GetParam(arg_lhs) & 0xFF) == 4) { return arg_lhs; } } + return NULL; } @@ -383,6 +467,7 @@ static void* s_demo_oc(void* arg_lhs, void* arg_rhs) { int daE_OC_c::checkBeforeBg() { dBgS_LinChk link_chk; cM3dGPla plane; + bool tri_pla = false; cXyz my_vec_0; cXyz my_vec_1; cXyz my_vec_2; @@ -392,69 +477,79 @@ int daE_OC_c::checkBeforeBg() { my_vec_1.x += cM_ssin(shape_angle.y) * 300.0f; my_vec_1.z += cM_scos(shape_angle.y) * 300.0f; link_chk.Set(&my_vec_0, &my_vec_1, this); + s16 tan_val; if (dComIfG_Bgsp().LineCross(&link_chk)) { - dComIfG_Bgsp().GetTriPla(link_chk, &plane); + tri_pla = dComIfG_Bgsp().GetTriPla(link_chk, &plane); if (my_vec_0.abs(link_chk.GetCross()) < 100.0f) { return 1; } - if ( (s16) (cM_atan2s(plane.mNormal.x, plane.mNormal.z) - shape_angle.y) > 0) + + tan_val = cM_atan2s(plane.mNormal.x, plane.mNormal.z); + if (s16(tan_val - shape_angle.y) > 0) { return 2; - else + } else { return 3; + } } + return 0; } /* 8072D640-8072D87C 001160 023C+00 1/2 0/0 0/0 .text checkBeforeBgFind__8daE_OC_cFv */ -int daE_OC_c::checkBeforeBgFind() { - dBgS_LinChk link_chk; - cXyz my_vec_0; - cXyz my_vec_1; +bool daE_OC_c::checkBeforeBgFind() { + dBgS_LinChk line_chk; + cXyz oc_pos; + cXyz plyr_pos; cXyz my_vec_2; s16 pl_ang = fopAcM_searchPlayerAngleY(this); - my_vec_0 = current.pos; - my_vec_0.y += 100.0f; - my_vec_1 = daPy_getPlayerActorClass()->current.pos; - my_vec_1.y += 100.0f; - link_chk.Set(&my_vec_0, &my_vec_1, NULL); - if (dComIfG_Bgsp().LineCross(&link_chk) == 0) { - return 0; + oc_pos = current.pos; + oc_pos.y += 100.0f; + plyr_pos = daPy_getPlayerActorClass()->current.pos; + plyr_pos.y += 100.0f; + line_chk.Set(&oc_pos, &plyr_pos, NULL); + if (!dComIfG_Bgsp().LineCross(&line_chk)) { + return false; } - my_vec_2 = my_vec_1; - my_vec_1.x += cM_ssin(pl_ang + 0x4000) * 300.0f; - my_vec_1.z += cM_scos(pl_ang + 0x4000) * 300.0f; - link_chk.Set(&my_vec_0, &my_vec_1, NULL); - if (dComIfG_Bgsp().LineCross(&link_chk) == 0) { - field_0x6da = cLib_targetAngleY(&my_vec_0, &my_vec_1); - return 1; + + my_vec_2 = plyr_pos; + plyr_pos.x += cM_ssin(pl_ang + 0x4000) * 300.0f; + plyr_pos.z += cM_scos(pl_ang + 0x4000) * 300.0f; + line_chk.Set(&oc_pos, &plyr_pos, NULL); + if (!dComIfG_Bgsp().LineCross(&line_chk)) { + field_0x6da = (s16) cLib_targetAngleY(&oc_pos, &plyr_pos); + return true; } + my_vec_2.x += cM_ssin(pl_ang - 0x4000) * 300.0f; my_vec_2.z += cM_scos(pl_ang - 0x4000) * 300.0f; - link_chk.Set(&my_vec_0, &my_vec_2, NULL); - if (dComIfG_Bgsp().LineCross(&link_chk) == 0) { - field_0x6da = cLib_targetAngleY(&my_vec_0, &my_vec_2); - return 1; + line_chk.Set(&oc_pos, &my_vec_2, NULL); + if (!dComIfG_Bgsp().LineCross(&line_chk)) { + field_0x6da = (s16) cLib_targetAngleY(&oc_pos, &my_vec_2); + return true; } else { - field_0x6da = cLib_targetAngleY(&my_vec_0, &my_vec_1); - return 1; + field_0x6da = (s16) cLib_targetAngleY(&oc_pos, &plyr_pos); + return true; } } /* 8072D87C-8072D994 00139C 0118+00 2/2 0/0 0/0 .text checkBeforeFloorBg__8daE_OC_cFf */ -int daE_OC_c::checkBeforeFloorBg(f32 arg) { +bool daE_OC_c::checkBeforeFloorBg(f32 arg) { cXyz my_vec_0; dBgS_ObjGndChk_Spl gnd_chk_spl; dBgS_GndChk gnd_chk; cXyz my_vec_1(0.0f, 100.0f, arg); cLib_offsetPos(&my_vec_0, ¤t.pos, shape_angle.y, &my_vec_1); gnd_chk_spl.SetPos(&my_vec_0); - f32 val_0 = dComIfG_Bgsp().GroundCross(&gnd_chk_spl); - if (val_0 != -G_CM3D_F_INF) { + f32 gnd_cross_0 = dComIfG_Bgsp().GroundCross(&gnd_chk_spl); + if (gnd_cross_0 != -G_CM3D_F_INF) { gnd_chk.SetPos(&my_vec_0); - if (val_0 >= dComIfG_Bgsp().GroundCross(&gnd_chk)) - return 1; + f32 gnd_cross_1 = dComIfG_Bgsp().GroundCross(&gnd_chk); + if (gnd_cross_0 >= gnd_cross_1) { + return true; + } } - return 0; + + return false; } /* 8072D994-8072DB10 0014B4 017C+00 1/1 0/0 0/0 .text checkDamageBg__8daE_OC_cFv */ @@ -475,12 +570,14 @@ void daE_OC_c::checkDamageBg() { cM3dGPla plane; dComIfG_Bgsp().GetTriPla(link_chk, &plane); s16 val = cM_atan2s(plane.mNormal.x, plane.mNormal.z); - if ((s16)(val - (s16)(shape_angle.y + 0x8000)) > 0) { + s16 adj_angle = shape_angle.y + 0x8000; + if (s16(val - adj_angle) > 0) { field_0x6be = 0x400; } else { field_0x6be = -0x400; } } + shape_angle.y += field_0x6be; } } @@ -499,7 +596,7 @@ void daE_OC_c::setGroundAngle() { my_vec_0.z = my_vec_2.z + 80.0f; gnd_chk.SetPos(&my_vec_0); my_vec_0.y = dComIfG_Bgsp().GroundCross(&gnd_chk); - if (my_vec_0.y != -G_CM3D_F_INF && (f32)fabs(my_vec_0.y - my_vec_2.y) < 50.0f) { + if (my_vec_0.y != -G_CM3D_F_INF && std::abs(my_vec_0.y - my_vec_2.y) < 50.0f) { my_vec_3 = my_vec_0 - my_vec_2; field_0x688.x = -cM_atan2s(my_vec_3.y, my_vec_3.z); } @@ -508,19 +605,18 @@ void daE_OC_c::setGroundAngle() { my_vec_1.z = my_vec_2.z; gnd_chk.SetPos(&my_vec_1); my_vec_1.y = dComIfG_Bgsp().GroundCross(&gnd_chk); - if (my_vec_1.y != -G_CM3D_F_INF && (f32)fabs(my_vec_1.y - my_vec_2.y) < 50.0f) { + if (my_vec_1.y != -G_CM3D_F_INF && std::abs(my_vec_1.y - my_vec_2.y) < 50.0f) { my_vec_3 = my_vec_1 - my_vec_2; - field_0x688.z = cM_atan2s(my_vec_3.y, my_vec_3.x); + field_0x688.z = (s16) cM_atan2s(my_vec_3.y, my_vec_3.x); } } /* 8072DCBC-8072DD18 0017DC 005C+00 21/21 0/0 0/0 .text setActionMode__8daE_OC_cFii */ -void daE_OC_c::setActionMode(int arg_1, int new_state) { +void daE_OC_c::setActionMode(int i_action, int i_state) { mOldActionMode = mActionMode; - mActionMode = arg_1; - mOcState = new_state; - field_0x6c2 = 0; - field_0x6c0 = 0; + mActionMode = i_action; + mOcState = i_state; + field_0x6c0 = field_0x6c2 = 0; mSphs_cc[0].OnCoSetBit(); mSphs_cc[0].OnTgSetBit(); mSphs_cc[1].OnCoSetBit(); @@ -530,37 +626,37 @@ void daE_OC_c::setActionMode(int arg_1, int new_state) { /* 8072DD18-8072DD8C 001838 0074+00 2/1 0/0 0/0 .text getCutType__8daE_OC_cFv */ int daE_OC_c::getCutType() { - if (daPy_getPlayerActorClass()->getCutCount() >= 4) + if (daPy_getPlayerActorClass()->getCutCount() >= 4) { return 5; - { - switch (daPy_getPlayerActorClass()->getCutType()) { - case daPy_py_c::CUT_TYPE_TURN_RIGHT: - case daPy_py_c::CUT_TYPE_LARGE_TURN_RIGHT: - case daPy_py_c::CUT_TYPE_HEAD_JUMP: - return 6; - case daPy_py_c::CUT_TYPE_LARGE_TURN_LEFT: - case daPy_py_c::CUT_TYPE_TURN_LEFT: - return 7; - case daPy_py_c::CUT_TYPE_MORTAL_DRAW_A: - case daPy_py_c::CUT_TYPE_TWIRL: - case daPy_py_c::CUT_TYPE_MORTAL_DRAW_B: - case daPy_py_c::CUT_TYPE_JUMP: - return 5; - case daPy_py_c::CUT_TYPE_NM_STAB: - case daPy_py_c::CUT_TYPE_NM_RIGHT: - case daPy_py_c::CUT_TYPE_FINISH_STAB: - case daPy_py_c::CUT_TYPE_DASH_UNK_26: - case daPy_py_c::CUT_TYPE_NM_VERTICAL: - return 0; - case daPy_py_c::CUT_TYPE_COMBO_STAB: - case daPy_py_c::CUT_TYPE_HORSE_UNK_22: - case daPy_py_c::CUT_TYPE_HORSE_UNK_23: - case daPy_py_c::CUT_TYPE_DASH_UNK_25: - case daPy_py_c::CUT_TYPE_NM_LEFT: - return 1; - default: - return 2; - } + } + + switch (daPy_getPlayerActorClass()->getCutType()) { + case daPy_py_c::CUT_TYPE_TURN_RIGHT: + case daPy_py_c::CUT_TYPE_LARGE_TURN_RIGHT: + case daPy_py_c::CUT_TYPE_HEAD_JUMP: + return 6; + case daPy_py_c::CUT_TYPE_LARGE_TURN_LEFT: + case daPy_py_c::CUT_TYPE_TURN_LEFT: + return 7; + case daPy_py_c::CUT_TYPE_MORTAL_DRAW_A: + case daPy_py_c::CUT_TYPE_TWIRL: + case daPy_py_c::CUT_TYPE_MORTAL_DRAW_B: + case daPy_py_c::CUT_TYPE_JUMP: + return 5; + case daPy_py_c::CUT_TYPE_NM_STAB: + case daPy_py_c::CUT_TYPE_NM_RIGHT: + case daPy_py_c::CUT_TYPE_FINISH_STAB: + case daPy_py_c::CUT_TYPE_DASH_UNK_26: + case daPy_py_c::CUT_TYPE_NM_VERTICAL: + return 0; + case daPy_py_c::CUT_TYPE_COMBO_STAB: + case daPy_py_c::CUT_TYPE_HORSE_UNK_22: + case daPy_py_c::CUT_TYPE_HORSE_UNK_23: + case daPy_py_c::CUT_TYPE_DASH_UNK_25: + case daPy_py_c::CUT_TYPE_NM_LEFT: + return 1; + default: + return 2; } } @@ -575,137 +671,169 @@ void daE_OC_c::offTgSph() { /* 8072DDF4-8072E274 001914 0480+00 1/1 0/0 0/0 .text damage_check__8daE_OC_cFv */ void daE_OC_c::damage_check() { if (checkCutDownHitFlg()) { + // Following needed to use r31 for debug asm: + int unused; offCutDownHitFlg(); health = 0; - setActionMode(9,1); + setActionMode(E_OC_ACTION_DEATH, 1); offTgSph(); return; } - if (field_0x6cc) + + if (field_0x6cc) { return; + } + mStts.Move(); - cXyz my_vec_0; int had_hit = 0; + cXyz my_vec_0; if (mSphs_cc[0].ChkTgHit()) { - mpTgHitObj = mSphs_cc[0].GetTgHitObj(); + mAtInfo.mpCollider = mSphs_cc[0].GetTgHitObj(); had_hit = 1; my_vec_0 = *mSphs_cc[0].GetTgHitPosP(); } + if (mSphs_cc[1].ChkTgHit()) { - mpTgHitObj = mSphs_cc[1].GetTgHitObj(); + mAtInfo.mpCollider = mSphs_cc[1].GetTgHitObj(); had_hit = 1; my_vec_0 = *mSphs_cc[1].GetTgHitPosP(); } - if (had_hit == 0) + + if (had_hit == 0) { return; - if (mpTgHitObj->ChkAtType(0xd8000000)) + } + + s16 old_health = health; // unused. + if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_UNK)) { field_0x6cc = 0x14; - else - field_0x6cc = 10; - if (field_0xe58 <= 1) + } else { field_0x6cc = 10; + } + + if (mAtInfo.mAttackPower <= 1) { + field_0x6cc = 10 + KREG_S(8); + } + u8 my_val = 2; - if (mpTgHitObj->ChkAtType(AT_TYPE_MASTER_SWORD | AT_TYPE_NORMAL_SWORD)) { + if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_MASTER_SWORD | AT_TYPE_NORMAL_SWORD)) { my_val = getCutType(); - if (daPy_py_c::checkWoodSwordEquip()) + if (daPy_py_c::checkWoodSwordEquip()) { my_val = 2; + } + if (my_val <= 2) { if (field_0x6d6) { - field_0x6dc ^= 1; + field_0x6dc ^= (u8) 1; my_val = field_0x6dc; } else { field_0x6dc = my_val; } + field_0x6d6 = 0x1e; } - if (daPy_getPlayerActorClass()->getCutType() == 5) + + if (daPy_getPlayerActorClass()->getCutType() == daPy_py_c::CUT_TYPE_HEAD_JUMP) { health = 0; - } else if (mpTgHitObj->ChkAtType(AT_TYPE_SHIELD_ATTACK)) { + } + } else if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_SHIELD_ATTACK)) { my_val = 3; - } else if (mpTgHitObj->ChkAtType(AT_TYPE_ARROW)) { + } else if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_ARROW)) { if (cM_rnd() < 0.5f) { my_val = 0; } else { my_val = 1; } - } else if (mpTgHitObj->ChkAtType(AT_TYPE_BOMB)) { + } else if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_BOMB)) { my_val = 5; health = 0; - } else if (mpTgHitObj->ChkAtType(AT_TYPE_IRON_BALL)) { + } else if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_IRON_BALL)) { my_val = 5; if (dComIfGp_checkPlayerStatus0(0,0x400)) { - health += 0x8c; + health += (s16) 140; } else { - health += 0x50; + health += (s16) 80; } - } else if (mpTgHitObj->ChkAtType(AT_TYPE_BOOMERANG)) { + } else if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_BOOMERANG)) { my_val = 4; - } else if (mpTgHitObj->ChkAtType(AT_TYPE_40)) { - health += 10; - } - else if (mpTgHitObj->ChkAtType(AT_TYPE_SLINGSHOT)) { + } else if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_40)) { + health += (s16) 10; + } else if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_SLINGSHOT)) { if (mName == "E_OC") { - health -= 5; + health -= (s16) 5; if (health < 0) { health = 0; mSound.startCollisionSE(0x40007,0x20); dComIfGp_setHitMark(3, this, &my_vec_0, NULL, NULL, 0); - setActionMode(6,0); + setActionMode(E_OC_ACTION_BIG_DAMAGE, 0); offTgSph(); - field_0xe4a = fopAcM_searchPlayerAngleY(this); + mAtInfo.mHitDirection.y = fopAcM_searchPlayerAngleY(this); return; } } else { mSound.startCollisionSE(0x40018,0x2d); - if (mActionMode != 0 && mActionMode != 1 && mActionMode != 2) { - return; + if (mActionMode == E_OC_ACTION_WAIT + || mActionMode == E_OC_ACTION_WALK + || mActionMode == E_OC_ACTION_TALK) { + setActionMode(E_OC_ACTION_FIND, 1); } - setActionMode(3, 1); + return; } } - cc_at_check(this, (dCcU_AtInfo*) &mpTgHitObj); - if ( ((dCcD_GObjInf*)mpTgHitObj)->GetAtSpl() == 1 && (((dCcD_GObjInf*)mpTgHitObj)->ChkAtType(2) == 0 - || daPy_py_c::checkWoodSwordEquip() == 0) && my_val < 5) { + + cc_at_check(this, &mAtInfo); + if ( ((dCcD_GObjInf*)mAtInfo.mpCollider)->GetAtSpl() == 1 + && (!((dCcD_GObjInf*)mAtInfo.mpCollider)->ChkAtType(AT_TYPE_NORMAL_SWORD) || !daPy_py_c::checkWoodSwordEquip()) + && my_val < 5 + ) { my_val = 5; } + if (health <= 1) { attention_info.flags = 0; - if (my_val < 5) + if (my_val < 5) { my_val = 5; + } } - if (daPy_getPlayerActorClass()->getCutType() == 0xa) { + + if (daPy_getPlayerActorClass()->getCutType() == daPy_py_c::CUT_TYPE_JUMP) { if (daPy_getPlayerActorClass()->checkCutJumpCancelTurn()) { - setActionMode(5, my_val); - field_0x6cc = 3; + setActionMode(E_OC_ACTION_DAMAGE, my_val); + field_0x6cc = 3 + NREG_S(7); return; } } + if (my_val >= 5) { - setActionMode(6, my_val - 5); + setActionMode(E_OC_ACTION_BIG_DAMAGE, my_val - 5); offTgSph(); } else { - setActionMode(5, my_val); + setActionMode(E_OC_ACTION_DAMAGE, my_val); } } /* 8072E274-8072E31C 001D94 00A8+00 17/17 0/0 0/0 .text setBck__8daE_OC_cFiUcff */ void daE_OC_c::setBck(int i_index, u8 i_attr, f32 i_morf, f32 i_rate) { - J3DAnmTransform* anm = (J3DAnmTransform *) dComIfG_getObjectRes("E_ocb", i_index); - mpMorf->setAnm(anm, i_attr, i_morf, i_rate, 0.0f, -1.0f); + mpMorf->setAnm((J3DAnmTransform *) dComIfG_getObjectRes("E_ocb", i_index), + i_attr, i_morf, i_rate, 0.0f, -1.0f); } /* 8072E31C-8072E37C 001E3C 0060+00 11/11 0/0 0/0 .text checkBck__8daE_OC_cFi */ bool daE_OC_c::checkBck(int i_index) { - return mpMorf->getAnm() == dComIfG_getObjectRes("E_ocb", i_index); + if (mpMorf->getAnm() != dComIfG_getObjectRes("E_ocb", i_index)) { + return false; + } else { + return true; + } } /* 8072E37C-8072E42C 001E9C 00B0+00 3/3 0/0 0/0 .text setSpitEffect__8daE_OC_cFv */ void daE_OC_c::setSpitEffect() { MtxP my_mtx_p = mpMorf->getModel()->getAnmMtx(0x11); cXyz my_vec(my_mtx_p[0][3], my_mtx_p[1][3], my_mtx_p[2][3]); - mParticleKey = dComIfGp_particle_set(mParticleKey, 0x837b, &my_vec, &tevStr, &shape_angle, NULL, - 0xff, NULL, -1, NULL, NULL, NULL); + mParticleKeys[0] = dComIfGp_particle_set(mParticleKeys[0], dPa_RM(ID_ZM_S_ORCSPIT00), + &my_vec, &tevStr, &shape_angle, NULL, + -1, NULL, -1, NULL, NULL, NULL); } /* 8072E42C-8072E498 001F4C 006C+00 1/1 0/0 0/0 .text getHeadAngle__8daE_OC_cFv */ @@ -805,19 +933,25 @@ void daE_OC_c::executeWait() { mPrevShapeAngle = shape_angle.y; field_0x6de = 0; if (field_0x6e3 == 0) { - if (setWatchMode() & 0xff) + if (setWatchMode()) { return; - if (searchSound() & 0xff) + } + + if (searchSound()) { return; - if (searchPlayer2() & 0xff) { - setActionMode(3, 1); + } + + if (searchPlayer2()) { + setActionMode(E_OC_ACTION_FIND, 1); return; } } + if (field_0x6b4 == 1 && home.pos.abs(current.pos) < 100.0f && (s16)cLib_distanceAngleS(shape_angle.y, home.angle.y) < 0x100) { mIsHomeWait = 1; } + switch (mOcState) { case 0: if (field_0x6b4 == 0) { @@ -827,6 +961,7 @@ void daE_OC_c::executeWait() { setBck(0x18, 2, 5.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_OC_V_STAND_WAIT, -1); } + speedF = 0.0f; field_0x6bc = shape_angle.y; if (field_0x6b4 == 0) { @@ -854,8 +989,8 @@ void daE_OC_c::executeWait() { } break; case 2: - if (searchPlayerShakeHead() & 0xff) { - setActionMode(3, 1); + if (searchPlayerShakeHead()) { + setActionMode(E_OC_ACTION_FIND, 1); } else { if (mpMorf->isStop()) { setBck(0x1b, 2, 5.0f, 1.0f); @@ -876,7 +1011,7 @@ void daE_OC_c::executeWait() { break; case 3: if (field_0x6c0 == 0) { - setActionMode(1, 0); + setActionMode(E_OC_ACTION_WALK, 0); } break; default: @@ -889,15 +1024,20 @@ void daE_OC_c::executeWalk() { mPrevShapeAngle = shape_angle.y; field_0x6de = 0; if (field_0x6e3 == 0) { - if (setWatchMode() & 0xff) + if (setWatchMode()) { return; - if (searchSound() & 0xff) + } + + if (searchSound()) { return; - if (searchPlayer2() & 0xff) { - setActionMode(3, 1); + } + + if (searchPlayer2()) { + setActionMode(E_OC_ACTION_FIND, 1); return; } } + switch (mOcState) { case 0: setBck(0x1d, 2, 5.0f, 1.0f); @@ -912,11 +1052,13 @@ void daE_OC_c::executeWalk() { } else { field_0x6bc = cLib_targetAngleY(¤t.pos, &home.pos); } + field_0x6be = 0; break; case 1: if ((field_0x6c0 & 0x7) == 0) { - switch (checkBeforeBg()) { + int before_bg_val = checkBeforeBg(); + switch (before_bg_val) { case 1: field_0x6c0 = 0; field_0x6be = 0; @@ -936,15 +1078,17 @@ void daE_OC_c::executeWalk() { } field_0x6bc += field_0x6be; } + if (field_0x6c0 == 0) { - setActionMode(0, 0); + setActionMode(E_OC_ACTION_WAIT, 0); } else if (field_0x6b4 == 1 && home.pos.abs(current.pos) < 100.0f) { - setActionMode(0, 0); + setActionMode(E_OC_ACTION_WAIT, 0); } else { cLib_chaseF(&speedF, 4.0f, 1.0f); cLib_addCalcAngleS(&shape_angle.y, field_0x6bc, 4, 0x800, 0x100); current.angle.y = shape_angle.y; } + break; default: break; @@ -954,14 +1098,19 @@ void daE_OC_c::executeWalk() { /* 8072F5E0-8072F914 003100 0334+00 1/1 0/0 0/0 .text executeTalk__8daE_OC_cFv */ void daE_OC_c::executeTalk() { field_0x6de = 0; - if (setWatchMode() & 0xff) - return; - if (searchSound() & 0xff) - return; - if (searchPlayer2() & 0xff) { - setActionMode(3, 1); + if (setWatchMode()) { return; } + + if (searchSound()) { + return; + } + + if (searchPlayer2()) { + setActionMode(E_OC_ACTION_FIND, 1); + return; + } + switch (mOcState) { case 0: speedF = 0.0f; @@ -1004,11 +1153,11 @@ void daE_OC_c::executeTalk() { break; case 4: mPrevShapeAngle = field_0x6bc; - if (field_0x6c0) { - return; + if (field_0x6c0 == 0) { + setActionMode(E_OC_ACTION_WAIT, 0); + field_0x6c6 = 300; } - setActionMode(0, 0); - field_0x6c6 = 300; + return; default: break; @@ -1018,9 +1167,7 @@ void daE_OC_c::executeTalk() { mOcState = 4; field_0x6c0 = cM_rndF(30.0f); } else { - s16 act_angle = fopAcM_searchActorAngleY(this, mpTalk); - mPrevShapeAngle = act_angle; - field_0x6bc = act_angle; + field_0x6bc = mPrevShapeAngle = fopAcM_searchActorAngleY(this, mpTalk); field_0x6df = 1; } } @@ -1029,11 +1176,12 @@ void daE_OC_c::executeTalk() { void daE_OC_c::executeFind() { s16 pl_ang = fopAcM_searchPlayerAngleY(this); f32 pl_dist = fopAcM_searchPlayerDistance(this); - if (mOcState < 3 || (setWatchMode() & 0xff) == 0) { - if (field_0x6b4 == 2 && dComIfGp_event_runCheck() == 0) { - fopAcM_OffStatus(this,0x4000); + if (mOcState < 3 || !setWatchMode()) { + if (field_0x6b4 == 2 && dComIfGp_event_runCheck() == FALSE) { + fopAcM_OffStatus(this, 0x4000); field_0x6b4 = 0; } + mPrevShapeAngle = pl_ang; switch (mOcState) { case 0: @@ -1047,13 +1195,15 @@ void daE_OC_c::executeFind() { setBck(0x1c, 2, 5.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_OC_V_WAIT_ST, -1); } + field_0x6de = 1; } else if (mOcState == 1) { if (field_0x6e2) { - field_0x6c0 = l_HIO.field_0x24; + field_0x6c0 = l_HIO.demo_waiting_time; } else { field_0x6c0 = cM_rndF(10.0f) + 20.0f; } + field_0x6e2 = 0; field_0x6ca = 0x96; setBck(0xd, 0, 5.0f, 1.0f); @@ -1063,8 +1213,10 @@ void daE_OC_c::executeFind() { setBck(0xd, 0, 5.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_OC_V_FIND, -1); } + mOcState = 3; speedF = 0.0f; + /* fallthrough intentional */ case 3: if (field_0x6c0 == 0) { if (field_0x6de || pl_dist < 400.0f) { @@ -1075,84 +1227,67 @@ void daE_OC_c::executeFind() { setBck(0xb, 2, 5.0f, 1.2f); mSound.startCreatureVoice(Z2SE_EN_OC_V_DASH, -1); } + mOcState = 4; field_0x6c0 = 0x1e; } + break; case 4: - if (checkBeforeFloorBg(200.0f) & 0xff) { - if (field_0x6e3) - setActionMode(0x10, 0); - else - setActionMode(0xf, 0); - } else { - mBattleOn = 1; - if ((s16)cLib_distanceAngleS(shape_angle.y, pl_ang) >= 0x400) - cLib_addCalcAngleS(&shape_angle.y, pl_ang, 4, 0x800, 0x100); - current.angle.y = shape_angle.y; - if (field_0x6ce) { - current.angle.y = field_0x6da; + if (checkBeforeFloorBg(200.0f)) { + if (field_0x6e3) { + setActionMode(E_OC_ACTION_MOVE_OUT, 0); } else { - if (checkBeforeBgFind() & 0xff) { - field_0x6ce = 0x14; - } + setActionMode(E_OC_ACTION_FIND_STAY, 0); } - dEvt_control_c& evt_ctrl = dComIfGp_getEvent(); - u8& my_status = evt_ctrl.mEventStatus; - if (my_status == 0) { - if (field_0x6c2 == 0) { - if (pl_dist < 300.0f) - cLib_chaseF(&speedF, -3.0f, 1.0f); - else - cLib_chaseF(&speedF, 20.0f, 1.0f); - if (pl_dist < 400.0f && pl_dist > 200.0f) { - if (abs(shape_angle.y - fopAcM_searchPlayerAngleY(this)) >= 0x1000) - return; - if (my_status == 0) { - setActionMode(4, 0); - } - return; - } + + return; + } + + mBattleOn = true; + if ((s16)cLib_distanceAngleS(shape_angle.y, pl_ang) >= 0x400) { + cLib_addCalcAngleS(&shape_angle.y, pl_ang, 4, 0x800, 0x100); + } + + current.angle.y = shape_angle.y; + if (field_0x6ce) { + current.angle.y = field_0x6da; + } else { + if (checkBeforeBgFind()) { + field_0x6ce = 20; + } + } + + if (!dComIfGp_event_runCheck()) { + if (field_0x6c2 == 0) { + if (pl_dist < 300.0f) { + cLib_chaseF(&speedF, -3.0f, 1.0f); } else { - if (pl_dist < 400.0f && pl_dist > 200.0f) { - cLib_chaseF(&speedF, 0.0f, 1.0f); - } else { - if (pl_dist < 300.0f) - cLib_chaseF(&speedF, -3.0f, 1.0f); - else - cLib_chaseF(&speedF, 20.0f, 1.0f); - } - if (speedF < 0.0f) { - if (checkBck(0x1c) == 0 || mpMorf->getPlaySpeed() != 1.0f) { - setBck(0x1c, 2, 5.0f, 1.0f); - mSound.startCreatureVoice(Z2SE_EN_OC_V_WAIT_ST, -1); - } - } else if (!speedF && (s16)cLib_distanceAngleS(shape_angle.y, pl_ang) < 0x1000) { - if (checkBck(0x1c) == 0) { - setBck(0x1c, 2, 5.0f, 1.0f); - mSound.startCreatureVoice(Z2SE_EN_OC_V_WAIT_ST, -1); - } - } else { - if (checkBck(0x1e) == 0 || mpMorf->getPlaySpeed() != 1.3f) { - setBck(0x1e, 2, 5.0f, 1.3f); - mSound.startCreatureVoice(Z2SE_EN_OC_V_WALK_ST, -1); + cLib_chaseF(&speedF, 20.0f + nREG_F(0), 1.0f); + } + + if (pl_dist < 400.0f && pl_dist > 200.0f) { + if (abs(shape_angle.y - fopAcM_searchPlayerAngleY(this)) < 0x1000) { + if (!dComIfGp_event_runCheck()) { + setActionMode(E_OC_ACTION_ATTACK, 0); } } + + return; } } else { - field_0x6c2 = 0x14; - if (mAcch.ChkWallHit()) { - field_0x6c4 = 5; - } - if (pl_dist < 400.0f && field_0x6c4 == 0) { - cLib_chaseF(&speedF, -15.0f, 1.0f); - } else { + if (pl_dist < 400.0f && pl_dist > 200.0f) { cLib_chaseF(&speedF, 0.0f, 1.0f); + } else if (pl_dist < 300.0f) { + cLib_chaseF(&speedF, -3.0f, 1.0f); + } else { + cLib_chaseF(&speedF, 20.0f + nREG_F(0), 1.0f); } + if (speedF < 0.0f) { - if (checkBck(0x1e) == 0 || mpMorf->getPlaySpeed() != -1.0f) { - setBck(0x1e, 2, 5.0f, -1.0f); - mSound.startCreatureVoice(Z2SE_EN_OC_V_WALK_ST, -1); + if (checkBck(0x1c) == 0 || mpMorf->getPlaySpeed() != 1.0f) { + setBck(0x1c, 2, 5.0f, 1.0f); + mSound.startCreatureVoice(Z2SE_EN_OC_V_WAIT_ST, -1); } } else if (!speedF && (s16)cLib_distanceAngleS(shape_angle.y, pl_ang) < 0x1000) { if (checkBck(0x1c) == 0) { @@ -1165,26 +1300,58 @@ void daE_OC_c::executeFind() { mSound.startCreatureVoice(Z2SE_EN_OC_V_WALK_ST, -1); } } - if (0 == strcmp("D_MN05", dComIfGp_getStartStageName()) - && dComIfGp_getStartStageRoomNo() == 0x16) { - fopAc_ac_c* actors[2]; - fopAcM_SearchByName(0x60, actors); - if (actors[0]) { - cXyz& ref = actors[0]->current.pos; - field_0x67c = ref; - field_0x67c.y += 100.0f; - mPrevShapeAngle = cLib_targetAngleY(¤t.pos, &field_0x67c); - } + } + } else { + field_0x6c2 = 0x14; + if (mAcch.ChkWallHit()) { + field_0x6c4 = 5; + } + + if (pl_dist < 400.0f && field_0x6c4 == 0) { + cLib_chaseF(&speedF, -15.0f, 1.0f); + } else { + cLib_chaseF(&speedF, 0.0f, 1.0f); + } + + if (speedF < 0.0f) { + if (checkBck(0x1e) == 0 || mpMorf->getPlaySpeed() != -1.0f) { + setBck(0x1e, 2, 5.0f, -1.0f); + mSound.startCreatureVoice(Z2SE_EN_OC_V_WALK_ST, -1); + } + } else if (!speedF && (s16)cLib_distanceAngleS(shape_angle.y, pl_ang) < 0x1000) { + if (checkBck(0x1c) == 0) { + setBck(0x1c, 2, 5.0f, 1.0f); + mSound.startCreatureVoice(Z2SE_EN_OC_V_WAIT_ST, -1); + } + } else { + if (checkBck(0x1e) == 0 || mpMorf->getPlaySpeed() != 1.3f) { + setBck(0x1e, 2, 5.0f, 1.3f); + mSound.startCreatureVoice(Z2SE_EN_OC_V_WALK_ST, -1); } } - if (field_0x6c0 == 0) { - if ((searchPlayer2() & 0xff) == 0) { - setActionMode(0, 0); - } else if (field_0x6e3) { - setActionMode(0x10, 0); + + if (0 == strcmp("D_MN05", dComIfGp_getStartStageName()) + && dComIfGp_getStartStageRoomNo() == 0x16) { + // Forest Temple - Entrance + fopAc_ac_c* ks_actor; + // Caged girl monkey in 1st room: + fopAcM_SearchByName(PROC_NPC_KS, &ks_actor); + if (ks_actor) { + mWatchPos = ks_actor->current.pos; + mWatchPos.y += 100.0f; + mPrevShapeAngle = cLib_targetAngleY(¤t.pos, &mWatchPos); } } } + + if (field_0x6c0 == 0) { + if (!searchPlayer2()) { + setActionMode(E_OC_ACTION_WAIT, 0); + } else if (field_0x6e3) { + setActionMode(E_OC_ACTION_MOVE_OUT, 0); + } + } + break; case 5: setBck(0x16, 0, 5.0f, 1.0f); @@ -1193,17 +1360,20 @@ void daE_OC_c::executeFind() { field_0x6de = 0; // fallthrough intentional. case 6: - mBattleOn = 1; + mBattleOn = true; mPrevShapeAngle = shape_angle.y; if (mpMorf->isStop()) { mOcState = 0; } + if (pl_dist < 500.0f) { mOcState = 0; } - if (mpMorf->getFrame() >= 20.0f && searchPlayerShakeHead() & 0xff) { + + if (mpMorf->getFrame() >= 20.0f && searchPlayerShakeHead()) { mOcState = 0; } + break; default: break; @@ -1231,17 +1401,18 @@ void daE_OC_c::setWeaponGroundAngle() { gnd_chk.SetPos(&my_vec_1); my_vec_1.y = dComIfG_Bgsp().GroundCross(&gnd_chk); if (my_vec_1.y != -G_CM3D_F_INF) { - f32 my_float = my_vec_0.absXZ(my_vec_1); - my_val = (s16) -cM_atan2s(my_vec_1.y - my_vec_0.y, my_float); + my_val = (s16) -cM_atan2s(my_vec_1.y - my_vec_0.y, my_vec_0.absXZ(my_vec_1)); if (my_val < -0x2000) { my_val = -0x2000; } + if (my_val > 0x2000) { my_val = 0x2000; } } } } + cLib_addCalcAngleS(&field_0x6d0, my_val, 4, 0x1000, 0x100); } @@ -1253,16 +1424,18 @@ void daE_OC_c::executeAttack() { if (frame_ctrl >= 9) { frame_ctrl = 9; } + if (checkBck(5)) { my_float = E_OC_n::oc_attackb_trans[frame_ctrl]; } else { my_float = E_OC_n::oc_attackc_trans[frame_ctrl]; } } - mBattleOn = 1; + + mBattleOn = true; mPrevShapeAngle = shape_angle.y; switch (mOcState) { - case 0: + case 0: { if (cLib_chaseF(&speedF, 0.0f, 1.0f)) { if (cM_rndF(1.0f) < 0.5f) { setBck(5, 0, 5.0f, 1.0f); @@ -1273,19 +1446,26 @@ void daE_OC_c::executeAttack() { mSound.startCreatureVoice(Z2SE_EN_OC_V_ATTACK_C, -1); mOcState = 2; } + field_0x6a0 = 0.0f; } + break; + } + case 2: { MtxP my_mtx_p = mpMorf->getModel()->getAnmMtx(0); cXyz my_vec_0(my_mtx_p[0][3], my_mtx_p[1][3], my_mtx_p[2][3]); - mParticleKey = dComIfGp_particle_set(mParticleKey, 0x8379, &my_vec_0, &tevStr, - &shape_angle, NULL, 0xff, NULL, -1, - NULL, NULL, NULL); - field_0xe6c = dComIfGp_particle_set(field_0xe6c, 0x837a, &my_vec_0, &tevStr, - &shape_angle, NULL, 0xff, NULL, -1, - NULL, NULL, NULL); + mParticleKeys[0] = dComIfGp_particle_set(mParticleKeys[0], dPa_RM(ID_ZM_S_ORCATTACKBLUR00), + &my_vec_0, &tevStr, + &shape_angle, NULL, -1, NULL, -1, + NULL, NULL, NULL); + mParticleKeys[1] = dComIfGp_particle_set(mParticleKeys[1], dPa_RM(ID_ZM_S_ORCATTACKBLUR01), + &my_vec_0, &tevStr, + &shape_angle, NULL, -1, NULL, -1, + NULL, NULL, NULL); } + // fallthrough intentional case 1: { if (mOcState == 1) { if (mpMorf->checkFrame(10.0f)) { @@ -1306,31 +1486,38 @@ void daE_OC_c::executeAttack() { mSound.startCreatureSound(Z2SE_EN_OC_ATTACK_C, 0, -1); } } + if (mpMorf->getFrame() >= 14.0f && mpMorf->getFrame() <= 22.0f) { mSphs_at[0].OnAtSetBit(); mSphs_at[1].OnAtSetBit(); } + if (mpMorf->getFrame() >= 22.0f) { mPrevShapeAngle = fopAcM_searchPlayerAngleY(this); } + u8 my_bool = 0; + fopAc_ac_c* hit_actor; if (mSphs_at[0].ChkAtHit()) { - fopAc_ac_c* hit_actor = dCc_GetAc(mSphs_at[0].GetAtHitObj()->GetAc()); - if (fopAcM_GetName(hit_actor) == 0xfd) { + hit_actor = dCc_GetAc(mSphs_at[0].GetAtHitObj()->GetAc()); + if (fopAcM_GetName(hit_actor) == PROC_ALINK) { my_bool = 1; } } + if (mSphs_at[1].ChkAtHit()) { - fopAc_ac_c* hit_actor = dCc_GetAc(mSphs_at[1].GetAtHitObj()->GetAc()); - if (fopAcM_GetName(hit_actor) == 0xfd) { + hit_actor = dCc_GetAc(mSphs_at[1].GetAtHitObj()->GetAc()); + if (fopAcM_GetName(hit_actor) == PROC_ALINK) { my_bool = 1; } } + if (my_bool && daPy_getPlayerActorClass()->checkPlayerGuard()) { mpMorf->setPlaySpeed(-1.0); mOcState = 3; dComIfGp_getVibration().StartShock(3, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); } + current.pos.x += (my_float - field_0x6a0) * cM_ssin(shape_angle.y); current.pos.z += (my_float - field_0x6a0) * cM_scos(shape_angle.y); field_0x6a0 = my_float; @@ -1338,18 +1525,18 @@ void daE_OC_c::executeAttack() { setBck(0x1c, 2, 0.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_OC_V_WAIT_ST, -1); if (field_0x6e3) { - setActionMode(0x10, 0); + setActionMode(E_OC_ACTION_MOVE_OUT, 0); + } else if (field_0x6ca && fopAcM_searchPlayerDistance(this) < 500.0f) { + mOcState = 0; } else { - if (field_0x6ca && fopAcM_searchPlayerDistance(this) < 500.0f) { - mOcState = 0; - } else { - setActionMode(3, 0); - } + setActionMode(E_OC_ACTION_FIND, 0); } } + break; } - case 3: + + case 3: { current.pos.x += (my_float - field_0x6a0) * cM_ssin(shape_angle.y); current.pos.z += (my_float - field_0x6a0) * cM_scos(shape_angle.y); field_0x6a0 = my_float; @@ -1357,7 +1544,7 @@ void daE_OC_c::executeAttack() { setBck(0x1c, 2, 5.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_OC_V_WAIT_ST, -1); if (field_0x6e3) { - setActionMode(0x10, 0); + setActionMode(E_OC_ACTION_MOVE_OUT, 0); } else { if (field_0x6ca && fopAcM_searchPlayerDistance(this) < 500.0f) { if (abs(shape_angle.y - fopAcM_searchPlayerAngleY(this)) < 0x1000) { @@ -1365,19 +1552,20 @@ void daE_OC_c::executeAttack() { break; } } - setActionMode(3, 0); + + setActionMode(E_OC_ACTION_FIND, 0); } } break; - default: - break; + } } + current.angle.y = shape_angle.y; } /* 80730DC0-80731124 0048E0 0364+00 2/1 0/0 0/0 .text executeDamage__8daE_OC_cFv */ void daE_OC_c::executeDamage() { - mBattleOn = 1; + mBattleOn = true; mPrevShapeAngle = shape_angle.y; switch (mOcState) { case 0: @@ -1398,19 +1586,17 @@ void daE_OC_c::executeDamage() { mSound.startCreatureVoice(Z2SE_EN_OC_V_DAMAGE_LR, -1); mOcState = 5; break; - case 3: { + case 3: setBck(0x8, 0, 0.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_OC_V_DAMAGE, -1); mOcState = 5; - s16 half_val = cLib_distanceAngleS(shape_angle.y, fopAcM_searchPlayerAngleY(this)); - if (half_val < 0x4000) { + if (s16(cLib_distanceAngleS(shape_angle.y, fopAcM_searchPlayerAngleY(this))) < 0x4000) { speedF = -20.0f; } else { speedF = 20.0f; } onHeadLockFlg(); break; - } case 4: setBck(0xf, 0, 0.0f, 1.0f); mSound.startCreatureVoice(Z2SE_EN_OC_V_GALE, -1); @@ -1421,15 +1607,15 @@ void daE_OC_c::executeDamage() { setSpitEffect(); cLib_chaseF(&speedF, 0.0f, 3.0f); if (speedF) { - fopAcM_effSmokeSet1(&field_0xe60, &field_0xe64, ¤t.pos, NULL, 2.0f, &tevStr, 0); + fopAcM_effSmokeSet2(&field_0xe60, &field_0xe64, ¤t.pos, NULL, 2.0f, &tevStr); } if (mpMorf->isStop()) { - if (daPy_getPlayerActorClass()->getCutType() != 5) { + if (daPy_getPlayerActorClass()->getCutType() != daPy_py_c::CUT_TYPE_HEAD_JUMP) { offHeadLockFlg(); if (field_0x6e3) { - setActionMode(0x10, 0); + setActionMode(E_OC_ACTION_MOVE_OUT, 0); } else { - setActionMode(3, 0); + setActionMode(E_OC_ACTION_FIND, 0); } } } @@ -1438,20 +1624,18 @@ void daE_OC_c::executeDamage() { setSpitEffect(); if (mpMorf->isStop()) { if (field_0x6e3) { - setActionMode(0x10, 0); + setActionMode(E_OC_ACTION_MOVE_OUT, 0); } else { - setActionMode(3, 0); + setActionMode(E_OC_ACTION_FIND, 0); } } break; - default: - break; } } /* 80731124-807316F8 004C44 05D4+00 1/1 0/0 0/0 .text executeBigDamage__8daE_OC_cFv */ void daE_OC_c::executeBigDamage() { - mBattleOn = 1; + mBattleOn = true; mPrevShapeAngle = shape_angle.y; switch (mOcState) { case 0: @@ -1484,8 +1668,8 @@ void daE_OC_c::executeBigDamage() { mOcState = 3; speed.y = 40.0f; speedF = 20.0f; - current.angle.y = field_0xe4a + 0x8000; - shape_angle.y = field_0xe4a; + current.angle.y = mAtInfo.mHitDirection.y + 0x8000; + shape_angle.y = mAtInfo.mHitDirection.y; field_0x6be = 0; break; case 3: @@ -1506,8 +1690,7 @@ void daE_OC_c::executeBigDamage() { speedF = 0.0f; } if (mAcch.ChkGroundHit()) { - field_0x6d8 = 0; - shape_angle.x = 0; + shape_angle.x = field_0x6d8 = 0; setBck(0x14, 0, 0.0f, 1.0f); mSound.startCreatureSound(Z2SE_CM_BODYFALL_M, 0, -1); if (field_0x6dc) { @@ -1533,7 +1716,7 @@ void daE_OC_c::executeBigDamage() { cLib_chaseF(&speedF, 0.0f, 1.0f); if (mpMorf->isStop()) { if (health < 1) { - setActionMode(9, 0); + setActionMode(E_OC_ACTION_DEATH, 0); offTgSph(); } else { mOcState = 5; @@ -1550,7 +1733,7 @@ void daE_OC_c::executeBigDamage() { cLib_chaseF(&speedF, 0.0f, 1.0f); mSphs_cc[0].OnCoSetBit(); mSphs_cc[1].OnCoSetBit(); - if (daPy_getPlayerActorClass()->getCutType() == 0x27) { + if (daPy_getPlayerActorClass()->getCutType() == daPy_py_c::CUT_TYPE_DOWN) { mSphs_cc[0].OffCoSetBit(); mSphs_cc[1].OffCoSetBit(); mStts.ClrCcMove(); @@ -1567,7 +1750,7 @@ void daE_OC_c::executeBigDamage() { cLib_chaseAngleS(&field_0x688.x, 0, 0x400); cLib_chaseAngleS(&field_0x688.z, 0, 0x400); if (mpMorf->isStop()) { - setActionMode(3, 5); + setActionMode(E_OC_ACTION_FIND, 5); } default: break; @@ -1594,7 +1777,7 @@ void daE_OC_c::executeWatch() { mPrevShapeAngle = fopAcM_searchActorAngleY(this, mpDamage); } if (field_0x6c0 == 0) { - setActionMode(3, 2); + setActionMode(E_OC_ACTION_FIND, 2); } break; case 2: @@ -1609,7 +1792,7 @@ void daE_OC_c::executeWatch() { field_0x6c0 = (s8) (cM_rndFX(15.0f) + 35.0f); mOcState = 3; case 3: - mPrevShapeAngle = cLib_targetAngleY(¤t.pos, &field_0x67c); + mPrevShapeAngle = cLib_targetAngleY(¤t.pos, &mWatchPos); if (field_0x6c0 == 0) { mOcState = 4; setBck(7, 0, 5.0f, 1.0f); @@ -1619,7 +1802,7 @@ void daE_OC_c::executeWatch() { case 4: mPrevShapeAngle = fopAcM_searchPlayerAngleY(this); if (mpMorf->isStop()) { - setActionMode(3, 2); + setActionMode(E_OC_ACTION_FIND, 2); } break; default: @@ -1629,19 +1812,19 @@ void daE_OC_c::executeWatch() { /* 807319E4-80731D18 005504 0334+00 1/1 0/0 0/0 .text executeSoundWatch__8daE_OC_cFv */ void daE_OC_c::executeSoundWatch() { - s16 tgt_angle = cLib_targetAngleY(¤t.pos, &field_0x67c); - mPrevShapeAngle = tgt_angle; - field_0x6bc = tgt_angle; + field_0x6bc = mPrevShapeAngle = cLib_targetAngleY(¤t.pos, &mWatchPos); if (mOcState == 2) { field_0x6de = 0; - if (setWatchMode() & 0xff) { + if (setWatchMode()) { return; } - if (searchPlayer2() & 0xff) { - setActionMode(3, 3); + + if (searchPlayer2()) { + setActionMode(E_OC_ACTION_FIND, 3); return; } } + switch (mOcState) { case 0: speedF = 0.0f; @@ -1658,10 +1841,10 @@ void daE_OC_c::executeSoundWatch() { } break; case 2: - cLib_chaseF(&speedF, 20.0f, 1.0f); + cLib_chaseF(&speedF, 20.0f + nREG_F(0), 1.0f); cLib_addCalcAngleS(&shape_angle.y, field_0x6bc, 4, 0x800, 0x100); current.angle.y = shape_angle.y; - if (current.pos.abs(field_0x67c) < 300.0f || field_0x6c0 == 0) { + if (current.pos.abs(mWatchPos) < 300.0f || field_0x6c0 == 0) { setBck(0x16, 0, 5.0f, 1.0f); mOcState = 3; speedF = 0.0f; @@ -1669,7 +1852,7 @@ void daE_OC_c::executeSoundWatch() { break; case 3: if (mpMorf->isStop()) { - setActionMode(0, 0); + setActionMode(E_OC_ACTION_WAIT, 0); } break; default: @@ -1678,16 +1861,17 @@ void daE_OC_c::executeSoundWatch() { } /* 80731D18-80731D4C 005838 0034+00 1/1 0/0 0/0 .text checkBeforeDeath__8daE_OC_cFv */ -int daE_OC_c::checkBeforeDeath() { - if (mActionMode == 9 && mOcState >= 2 && field_0x6c0 < 2) { - return 1; +bool daE_OC_c::checkBeforeDeath() { + if (mActionMode == E_OC_ACTION_DEATH && mOcState >= 2 && field_0x6c0 < 2) { + return true; } - return 0; + + return false; } /* 80731D4C-80731F5C 00586C 0210+00 1/1 0/0 0/0 .text executeDeath__8daE_OC_cFv */ void daE_OC_c::executeDeath() { - mBattleOn = 1; + mBattleOn = true; mPrevShapeAngle = shape_angle.y; switch (mOcState) { case 0: @@ -1718,9 +1902,10 @@ void daE_OC_c::executeDeath() { } else { fopAcM_createDisappear(this, ¤t.pos, 10, 0, 0x34); } + fopAcM_delete(this); - if (field_0x6e0 != 0xff && dComIfGs_isSwitch(field_0x6e0, fopAcM_GetRoomNo(this)) == 0) { - dComIfGs_onSwitch(field_0x6e0, fopAcM_GetRoomNo(this)); + if (mDefeatedSwitch != 0xFF && dComIfGs_isSwitch(mDefeatedSwitch, fopAcM_GetRoomNo(this)) == 0) { + dComIfGs_onSwitch(mDefeatedSwitch, fopAcM_GetRoomNo(this)); } } break; @@ -1737,11 +1922,15 @@ void daE_OC_c::setWaterEffect() { cXyz my_vec_0(current.pos.x, mWaterLvl, current.pos.z); static cXyz sc(1.0f, 1.0f, 1.0f); static u16 w_eff_id[4] = { - 0x01B8, 0x01B9, 0x01BA, 0x01BB, + ID_ZI_J_DOWNWTRA_A, + ID_ZI_J_DOWNWTRA_B, + ID_ZI_J_DOWNWTRA_C, + ID_ZI_J_DOWNWTRA_D, }; + for (int idx = 0; idx < 4; ++idx) { - field_0xe70[idx] = dComIfGp_particle_set(field_0xe70[idx], w_eff_id[idx], &my_vec_0, - &tevStr, NULL, &sc, 0xff, NULL, + mWaterEffects[idx] = dComIfGp_particle_set(mWaterEffects[idx], w_eff_id[idx], &my_vec_0, + &tevStr, NULL, &sc, -1, NULL, -1, NULL, NULL, NULL); } } @@ -1755,8 +1944,7 @@ void daE_OC_c::executeWaterDeath() { mSound.startCreatureSound(Z2SE_EN_OC_DROWNED, 0, -1); current.pos.y += 140.0f; mOcState = 1; - speedF = 0.0f; - gravity = 0.0f; + gravity = speedF = 0.0f; setWaterEffect(); mSound.startCreatureSound(Z2SE_CM_BODYFALL_WATER_M, 0, -1); offTgSph(); @@ -1783,6 +1971,7 @@ void daE_OC_c::executeWaterDeath() { mpMorf->checkFrame(49.0f)) { setWaterEffect(); } + if (mpMorf->isStop()) { if (mName == "E_OC") { fopAcM_createDisappear(this, ¤t.pos, 10, 0, 4); @@ -1791,8 +1980,8 @@ void daE_OC_c::executeWaterDeath() { } fopAcM_delete(this); - if (field_0x6e0 != 0xFF && !dComIfGs_isSwitch(field_0x6e0, fopAcM_GetRoomNo(this))) { - dComIfGs_onSwitch(field_0x6e0, fopAcM_GetRoomNo(this)); + if (mDefeatedSwitch != 0xFF && !dComIfGs_isSwitch(mDefeatedSwitch, fopAcM_GetRoomNo(this))) { + dComIfGs_onSwitch(mDefeatedSwitch, fopAcM_GetRoomNo(this)); } } break; @@ -1814,8 +2003,8 @@ void daE_OC_c::executeDemoMaster() { mPrevShapeAngle = shape_angle.y; camera_class* p_camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); switch (mOcState) { - case 0: { - field_0x6eb = 0; + case 0: + mHide = false; mOcState = 1; field_0x6f8.set(16300.0f, 3700.0f, 8400.0f); field_0x6f8 += my_vec_0; @@ -1823,14 +2012,10 @@ void daE_OC_c::executeDemoMaster() { mPlayerPos += my_vec_0; field_0x704 = 55.0f; field_0x6bc = 0x5000; - daPy_py_c *player = daPy_getPlayerActorClass(); - player->setPlayerPosAndAngle(&my_vec_1, field_0x6bc, 0); + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&my_vec_1, field_0x6bc, 0); p_camera->mCamera.SetTrimSize(3); - s16 angle = fopAcM_searchPlayerAngleY(this); - current.angle.y = angle; - shape_angle.y = angle; + shape_angle.y = current.angle.y = fopAcM_searchPlayerAngleY(this); return; - } case 1: mSound.startCreatureVoice(Z2SE_EN_OC_V_SAKEBU, -1); setBck(7, 0, 5.0f, 1.0f); @@ -1857,8 +2042,8 @@ void daE_OC_c::executeDemoMaster() { if (mpMorf->checkFrame(9.0f)) { mSound.startCreatureSound(Z2SE_EN_OC_ATTACK_C, 0, -1); } - s16 angle = fopAcM_searchPlayerAngleY(this); - cLib_chaseAngleS(&field_0x6bc, angle + 0x8000, 0x200); + + cLib_chaseAngleS(&field_0x6bc, fopAcM_searchPlayerAngleY(this) + 0x8000, 0x200); if (mpMorf->isStop()) { mOcState = 6; setBck(0x10, 0, 5.0f, 1.0f); @@ -1875,9 +2060,11 @@ void daE_OC_c::executeDemoMaster() { if (field_0x6c0 > 20) { cLib_addCalc2(&field_0x6f8.y, current.pos.y + 100.0f, 0.2f, 10.0f); } + if (mpMorf->isStop()) { setBck(0x11, 0, 5.0f, 1.0f); } + if (field_0x6c0 == 0) { mOcState = 7; field_0x6f8.set(16450.0f, 3050.0f, 8250.0f); @@ -1887,9 +2074,7 @@ void daE_OC_c::executeDemoMaster() { field_0x704 = 37.0f; current.pos.set(16449.0f, 3300.0f, 7879.0f); current.pos += my_vec_0; - s16 angle = fopAcM_searchPlayerAngleY(this); - current.angle.y = angle; - shape_angle.y = angle; + shape_angle.y = current.angle.y = fopAcM_searchPlayerAngleY(this); speedF = 0.0f; field_0x6c0 = 10; } @@ -1898,12 +2083,14 @@ void daE_OC_c::executeDemoMaster() { if (field_0x6c0 == 0) { cLib_addCalc2(&field_0x6f8.y, my_vec_0.y + 2950.0f, 0.1f, 10.0f); } + if (mAcch.ChkGroundHit()) { mSound.startCreatureSound(Z2SE_CM_BODYFALL_S, 0, -1); fopAcM_effSmokeSet1(&field_0xe60, &field_0xe64, ¤t.pos, NULL, 2.0f, &tevStr, 1); setBck(0x12, 0, 5.0f, 1.0f); mOcState = 8; } + break; case 8: field_0x704 = 47.0f; @@ -1911,20 +2098,20 @@ void daE_OC_c::executeDemoMaster() { if (mpMorf->checkFrame(34.0f)) { mSound.startCreatureVoice(Z2SE_EN_OC_V_FIND, -1); } + if (mpMorf->isStop()) { field_0x6c8 = 30; - setActionMode(3, 0); - Z2GetAudioMgr()->setBattleSeqState(2); + setActionMode(E_OC_ACTION_FIND, 0); + Z2GetAudioMgr()->onEnemyDamage(); Z2GetAudioMgr()->unMuteSceneBgm(1); return; } - break; - default: + break; } + if (mOcState) { - daPy_py_c *player = daPy_getPlayerActorClass(); - player->setPlayerPosAndAngle(&my_vec_1, field_0x6bc, 0); + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&my_vec_1, field_0x6bc, 0); p_camera->mCamera.Set(field_0x6f8, mPlayerPos, field_0x704, 0); } } @@ -1938,7 +2125,7 @@ void daE_OC_c::executeDemoChild() { switch (mOcState) { case 0: if (mpParent->mOcState == 1) { - field_0x6eb = 0; + mHide = false; setBck(0x1C, 2, 5.0f, 1.0f); mOcState = 1; } @@ -1966,11 +2153,8 @@ void daE_OC_c::executeDemoChild() { if (mpParent->mOcState == 7) { current.pos.set(16249.0f, 4000.0f, 8036.0f); current.pos += local_18; - s16 angle = fopAcM_searchPlayerAngleY(this); - current.angle.y = angle; - shape_angle.y = angle; - speed.y = 0.0f; - speedF = 0.0f; + shape_angle.y = current.angle.y = fopAcM_searchPlayerAngleY(this); + speedF = speed.y = 0.0f; mOcState = 7; } break; @@ -1987,7 +2171,7 @@ void daE_OC_c::executeDemoChild() { mSound.startCreatureVoice(Z2SE_EN_OC_V_FIND, -1); } if (mpMorf->isStop()) { - setActionMode(3, 0); + setActionMode(E_OC_ACTION_FIND, 0); } break; default: @@ -2007,16 +2191,22 @@ void daE_OC_c::checkFall() { field_0x69c = groundY; return; } - if (mActionMode != 0xD && mActionMode != 0xE && mActionMode != 10 && - mActionMode != 0xB && mActionMode != 0xC && speed.y < 0.0f) { + + if (mActionMode != E_OC_ACTION_FALL_DEAD + && mActionMode != E_OC_ACTION_FALL + && mActionMode != E_OC_ACTION_WATER_DEATH + && mActionMode != E_OC_ACTION_DEMO_MASTER + && mActionMode != E_OC_ACTION_DEMO_CHILD + && speed.y < 0.0f) { if (groundY == -G_CM3D_F_INF || dComIfG_Bgsp().GetGroundCode(gnd_chk) == 4 || dComIfG_Bgsp().GetGroundCode(gnd_chk) == 10 || dComIfG_Bgsp().GetGroundCode(gnd_chk) == 5) { if (field_0x69c > current.pos.y) { - setActionMode(0xD, 0); + setActionMode(E_OC_ACTION_FALL_DEAD, 0); } - } else if (mActionMode != 6 && (field_0x69c - 100.0f) > current.pos.y && (field_0x69c - groundY) > 500.0f) { - setActionMode(0xE, 0); + } else if (mActionMode != E_OC_ACTION_BIG_DAMAGE && (field_0x69c - 100.0f) > current.pos.y + && (field_0x69c - groundY) > 500.0f) { + setActionMode(E_OC_ACTION_FALL, 0); } } } @@ -2048,10 +2238,8 @@ void daE_OC_c::executeFallDead() { cLib_chaseF(&speedF, 0.0f, 0.2f); if (field_0x6c0 == 0) { fopAcM_delete(this); - if (field_0x6e0 != 0xFF) { - if (!dComIfGs_isSwitch(field_0x6e0, fopAcM_GetRoomNo(this))) { - dComIfGs_onSwitch(field_0x6e0, fopAcM_GetRoomNo(this)); - } + if (mDefeatedSwitch != 0xFF && !dComIfGs_isSwitch(mDefeatedSwitch, fopAcM_GetRoomNo(this))) { + dComIfGs_onSwitch(mDefeatedSwitch, fopAcM_GetRoomNo(this)); } } break; @@ -2080,7 +2268,7 @@ void daE_OC_c::executeFall() { break; case 2: if (mpMorf->isStop()) { - setActionMode(3, 0); + setActionMode(E_OC_ACTION_FIND, 0); } break; default: @@ -2095,8 +2283,8 @@ void daE_OC_c::executeFindStay() { mPrevShapeAngle = target_angle; mBattleOn = true; - if ((checkBeforeFloorBg(200.0f) & 0xff) == 0) { - setActionMode(3, 0); + if (!checkBeforeFloorBg(200.0f)) { + setActionMode(E_OC_ACTION_FIND, 0); return; } @@ -2126,75 +2314,77 @@ void daE_OC_c::executeFindStay() { } else { cLib_chaseF(&speedF, 0.0f, 1.0f); } - s16 angleDiff = cLib_distanceAngleS(shape_angle.y, target_angle); - if (angleDiff >= 0x400) { + + if (s16(cLib_distanceAngleS(shape_angle.y, target_angle)) >= 0x400) { cLib_addCalcAngleS(&shape_angle.y, target_angle, 4, 0x800, 0x100); } + current.angle.y = shape_angle.y; if (target_dist < 400.0f && target_dist > 200.0f) { - s16 newAngle = fopAcM_searchPlayerAngleY(this); - if (abs(shape_angle.y - newAngle) < 0x1000 && checkBeforeFloorBg(100.0f) & 0xff && dComIfGp_event_runCheck() == 0) { - setActionMode(4, 0); - } - } else { - if ((searchPlayer2() & 0xff) == 0) { - setActionMode(0, 0); + if (abs(shape_angle.y - fopAcM_searchPlayerAngleY(this)) < 0x1000 && checkBeforeFloorBg(100.0f) + && dComIfGp_event_runCheck() == FALSE) { + setActionMode(E_OC_ACTION_ATTACK, 0); } + + return; + } + + if (!searchPlayer2()) { + setActionMode(E_OC_ACTION_WAIT, 0); + return; } - break; } - default: - return; } } /* 807335B4-80733E48 0070D4 0894+00 1/1 0/0 0/0 .text executeMoveOut__8daE_OC_cFv */ void daE_OC_c::executeMoveOut() { - f32 target_distance = fopAcM_searchPlayerDistance(this); + f32 player_distance = fopAcM_searchPlayerDistance(this); s16 target_angle = fopAcM_searchPlayerAngleY(this); s16 home_angle = cLib_targetAngleY(&home.pos, ¤t.pos); mBattleOn = true; mPrevShapeAngle = shape_angle.y; - cXyz adj_curr_vec; - cXyz adj_home_vec; + BOOL my_cond; switch (mOcState) { case 0: if (field_0x6e3 == 2) { if (!checkBck(0x1E)) { setBck(0x1E, 2, 5.0f, 1.0f); } + mOcState = 1; } else { if (!checkBck(0x1C)) { setBck(0x1C, 2, 5.0f, 1.0f); } + field_0x6c0 = 30; mOcState = 2; } - case 1: { + // fallthrough intentional + case 1: cLib_addCalcAngleS(&shape_angle.y, home_angle, 4, 0x800, 0x100); current.angle.y = shape_angle.y; cLib_chaseF(&speedF, -15.0f, 1.0f); - adj_home_vec.set(home.pos.x, 0.0f, home.pos.z); - adj_curr_vec.set(current.pos.x, 0.0f, current.pos.z); - if (adj_home_vec.abs(adj_curr_vec) < mMoveRange) { + if (home.pos.absXZ(current.pos) < mMoveRange) { setBck(0x1C, 2, 5.0f, 1.0f); field_0x6c0 = 30; mOcState = 2; } + break; - } - case 2: { - int my_cond = 0; - if (target_distance < 200.0f || home.pos.abs(current.pos) > mMoveRange + 200.0f) { - if (abs((s16)(shape_angle.y - home_angle)) < 0x3000) { - my_cond = 1; + + case 2: + my_cond = FALSE; + if (player_distance < 200.0f || home.pos.abs(current.pos) > mMoveRange + 200.0f) { + if (abs(s16(shape_angle.y - home_angle)) < 0x3000) { + my_cond = TRUE; cLib_chaseF(&speedF, -15.0f, 1.0f); } } - if (my_cond == 0) { - // + + if (my_cond == FALSE) { cLib_chaseF(&speedF, 0.0f, 1.0f); if (!speedF && !checkBck(0x1C)) { setBck(0x1C, 2, 5.0f, 1.0f); @@ -2203,43 +2393,41 @@ void daE_OC_c::executeMoveOut() { if (!checkBck(0x1E)) { setBck(0x1E, 2, 5.0f, 1.0f); } + cLib_chaseF(&speedF, -15.0f, 1.0f); if (home.pos.abs(current.pos) < mMoveRange - 200.0f) { - setActionMode(3, 0); + setActionMode(E_OC_ACTION_FIND, 0); return; } } - s16 angle_diff = cLib_distanceAngleS(shape_angle.y, target_angle); - if (angle_diff >= 0x400) { + + if (s16(cLib_distanceAngleS(shape_angle.y, target_angle)) >= 0x400) { cLib_addCalcAngleS(&shape_angle.y, target_angle, 4, 0x800, 0x100); } + current.angle.y = shape_angle.y; if (field_0x6c0 == 0) { if (home.pos.abs(daPy_getPlayerActorClass()->current.pos) < (mMoveRange - 200.0f)) { - setActionMode(3, 0); + setActionMode(E_OC_ACTION_FIND, 0); return; } - if (target_distance > l_HIO.field_0x20) { + + if (player_distance > l_HIO.standby_distance) { if (home.pos.abs(daPy_getPlayerActorClass()->current.pos) > mMoveRange + 200.0f) { - setActionMode(0,0); + setActionMode(E_OC_ACTION_WAIT, 0); return; } } - if (target_distance < 400.0f && target_distance > 200.0f) { - s16 new_angle = fopAcM_searchPlayerAngleY(this); - if (abs(shape_angle.y - new_angle) >= 0x1000) { - return; + + if (player_distance < 400.0f && player_distance > 200.0f) { + if (abs(shape_angle.y - fopAcM_searchPlayerAngleY(this)) < 0x1000 + && dComIfGp_event_runCheck() == FALSE) { + setActionMode(E_OC_ACTION_ATTACK, 0); } - if (dComIfGp_event_runCheck() != 0) { - return; - } - setActionMode(4, 0); + + return; } } - break; - } - default: - break; } } @@ -2253,6 +2441,7 @@ bool daE_OC_c::checkWaterSurface() { if (mAcch.ChkGroundHit()) { mWaterLvl = -G_CM3D_F_INF; } + if (mWaterLvl > (current.pos.y - 140.0f)) { return 1; } else { @@ -2285,36 +2474,78 @@ void daE_OC_c::action() { mBattleOn = false; field_0x6df = 0; - if (mActionMode != 10 && checkWaterSurface()) { - setActionMode(10, 0); + if (mActionMode != E_OC_ACTION_WATER_DEATH && checkWaterSurface()) { + setActionMode(E_OC_ACTION_WATER_DEATH, 0); } - if (mActionMode == 3 || mActionMode == 1) { + if (mActionMode == E_OC_ACTION_FIND || mActionMode == E_OC_ACTION_WALK) { mAcchCir.SetWallR(60.0f); } else { mAcchCir.SetWallR(100.0f); } + checkFall(); field_0x566 = 0; switch (mActionMode) { - case 0: executeWait(); break; - case 1: executeWalk(); break; - case 2: executeTalk(); break; - case 3: field_0x566 = 1; executeFind(); break; - case 4: field_0x566 = 1; executeAttack(); break; - case 5: executeDamage(); break; - case 6: executeBigDamage(); break; - case 7: executeWatch(); break; - case 8: executeSoundWatch(); break; - case 9: executeDeath(); break; - case 10: executeWaterDeath(); break; - case 11: field_0x566 = 1; executeDemoMaster(); break; - case 12: field_0x566 = 1; executeDemoChild(); break; - case 13: executeFallDead(); break; - case 14: executeFall(); break; - case 15: field_0x566 = 1; executeFindStay(); break; - case 16: field_0x566 = 1; executeMoveOut(); break; + case E_OC_ACTION_WAIT: + executeWait(); + break; + case E_OC_ACTION_WALK: + executeWalk(); + break; + case E_OC_ACTION_TALK: + executeTalk(); + break; + case E_OC_ACTION_FIND: + field_0x566 = 1; + executeFind(); + break; + case E_OC_ACTION_ATTACK: + field_0x566 = 1; + executeAttack(); + break; + case E_OC_ACTION_DAMAGE: + executeDamage(); + break; + case E_OC_ACTION_BIG_DAMAGE: + executeBigDamage(); + break; + case E_OC_ACTION_WATCH: + executeWatch(); + break; + case E_OC_ACTION_SOUND_WATCH: + executeSoundWatch(); + break; + case E_OC_ACTION_DEATH: + executeDeath(); + break; + case E_OC_ACTION_WATER_DEATH: + executeWaterDeath(); + break; + case E_OC_ACTION_DEMO_MASTER: + field_0x566 = 1; + executeDemoMaster(); + break; + case E_OC_ACTION_DEMO_CHILD: + field_0x566 = 1; + executeDemoChild(); + break; + case E_OC_ACTION_FALL_DEAD: + executeFallDead(); + break; + case E_OC_ACTION_FALL: + executeFall(); + break; + case E_OC_ACTION_FIND_STAY: + field_0x566 = 1; + executeFindStay(); + break; + case E_OC_ACTION_MOVE_OUT: + field_0x566 = 1; + executeMoveOut(); + break; } + mSound.setLinkSearch(field_0x566); setFootNoteSound(); s16 angle_diff = shape_angle.y - mPrevShapeAngle; @@ -2327,18 +2558,18 @@ void daE_OC_c::action() { if (field_0x6d2 >= 0x3000) { field_0x6d2 = 0x3000; } + if (field_0x6d2 < -0x3000) { - field_0x6d2 = 0xd000; + field_0x6d2 = -0x3000; } fopAcM_posMoveF(this, mStts.GetCCMoveP()); mAcch.CrrPos(dComIfG_Bgsp()); cXyz head_lock_pos(eyePos); - head_lock_pos.y += 300.0f; + head_lock_pos.y += 300.0f + NREG_F(7); setHeadLockPos(&head_lock_pos); setWeaponGroundAngle(); - s8 reverb = dComIfGp_getReverb(static_cast(fopAcM_GetRoomNo(this))); - mpMorf->play(0, reverb); + mpMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); } /* 807345D8-80734698 0080F8 00C0+00 1/1 0/0 0/0 .text mtx_set__8daE_OC_cFv */ @@ -2347,7 +2578,7 @@ void daE_OC_c::mtx_set() { mDoMtx_stack_c::ZXYrotM(field_0x688); mDoMtx_stack_c::ZXYrotM(shape_angle); mDoMtx_stack_c::YrotM(field_0x6d8); - mDoMtx_stack_c::scaleM(l_HIO.field_0x1c, l_HIO.field_0x1c, l_HIO.field_0x1c); + mDoMtx_stack_c::scaleM(l_HIO.basic_size, l_HIO.basic_size, l_HIO.basic_size); J3DModel* model = mpMorf->getModel(); model->setBaseTRMtx(mDoMtx_stack_c::get()); mpMorf->modelCalc(); @@ -2418,6 +2649,7 @@ int daE_OC_c::execute() { if (field_0x6ce) { --field_0x6ce; } + if (field_0x6c8) { --field_0x6c8; if (field_0x6c8 == 0) { @@ -2436,13 +2668,14 @@ int daE_OC_c::execute() { } } } + action(); mtx_set(); cc_set(); cXyz my_vec_0; mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(0x1)); mDoMtx_stack_c::multVecZero(&my_vec_0); - cXyz my_vec_1(1.0f, 2.0f, 1.0f); + cXyz my_vec_1(1.0f + nREG_F(3), 2.0f + nREG_F(4), 1.0f + nREG_F(5)); setMidnaBindEffect(this, &mSound, &my_vec_0, &my_vec_1); return 1; } @@ -2463,78 +2696,91 @@ int daE_OC_c::_delete() { dComIfG_resDelete(&mPhaseReqs[1], "E_ocb"); if (field_0xe84) { lbl_216_bss_58 = 0; + mDoHIO_DELETE_CHILD(l_HIO.field_0x04); } + if (heap) { mSound.deleteObject(); } + return 1; } /* 80734BF0-80734C10 008710 0020+00 1/0 0/0 0/0 .text daE_OC_Delete__FP8daE_OC_c */ static void daE_OC_Delete(daE_OC_c* i_this) { + fopAcM_RegisterDeleteID(i_this, "E_OC"); i_this->_delete(); } /* 80734C10-80734D88 008730 0178+00 1/1 0/0 0/0 .text CreateHeap__8daE_OC_cFv */ int daE_OC_c::CreateHeap() { - J3DModelData* model_data = (J3DModelData*) dComIfG_getObjectRes(mName, 0x3); - JUT_ASSERT(0xd73, model_data != NULL); - mpMorf = new mDoExt_McaMorfSO(model_data, NULL, NULL, + J3DModelData* modelData = (J3DModelData*) dComIfG_getObjectRes(mName, 0x3); + JUT_ASSERT(3443, modelData != NULL); + mpMorf = new mDoExt_McaMorfSO(modelData, NULL, NULL, (J3DAnmTransform*)dComIfG_getObjectRes("E_ocb", 0x1b), 0, 1.0f, 0, -1, &mSound, 0x80000, 0x11000084); if (mpMorf == NULL || mpMorf->getModel() == 0) { return 0; } + J3DModel* my_model = mpMorf->getModel(); my_model->setUserArea((uintptr_t)this); for (u16 idx = 1; idx < my_model->getModelData()->getJointNum(); ++idx) { - if (idx == 0x11 || idx == 0xc) { + if (idx == 17 || idx == 12) { my_model->getModelData()->getJointNodePointer(idx)->setCallBack(&daE_OC_c::JointCallBack); } } - model_data = (J3DModelData*) dComIfG_getObjectRes(mName, 0x4); - JUT_ASSERT(0xd96, model_data != NULL); - mpModel = mDoExt_J3DModel__create(model_data, 0x80000, 0x11000084); + + modelData = (J3DModelData*) dComIfG_getObjectRes(mName, 0x4); + JUT_ASSERT(3478, modelData != NULL); + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); if (mpModel == NULL) { return 0; } + return 1; } /* 80734D88-80734DA8 0088A8 0020+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */ static int useHeapInit(fopAc_ac_c* i_this) { - return static_cast(i_this)->CreateHeap(); + daE_OC_c* a_this = static_cast(i_this); + return a_this->CreateHeap(); } /* 80734DA8-807352AC 0088C8 0504+00 1/1 0/0 0/0 .text create__8daE_OC_cFv */ cPhs__Step daE_OC_c::create() { fopAcM_ct(this, daE_OC_c); - field_0x6b4 = fopAcM_GetParam(this) & 0xff; - if (field_0x6b4 == 0xff) { + field_0x6b4 = fopAcM_GetParam(this) & 0xFF; + if (field_0x6b4 == 0xFF) { field_0x6b4 = 0; } - u8 u_var = ((fopAcM_GetParam(this) & 0xff00) >> 8); + u8 u_var = ((fopAcM_GetParam(this) & 0xFF00) >> 8); if (u_var == 0x1) { - mPlayerRange = l_HIO.field_0x0c; + mPlayerRange = l_HIO.plyr_srch_max_radius_M; } else { - mPlayerRange = l_HIO.field_0x08; + mPlayerRange = l_HIO.plyr_srch_max_radius_S; } - field_0x6e0 = (fopAcM_GetParam(this) & 0xff0000) >> 0x10; - if (field_0x6e0 != 0xff) { - if (dComIfGs_isSwitch(field_0x6e0, fopAcM_GetRoomNo(this))) { + + mDefeatedSwitch = (fopAcM_GetParam(this) & 0xFF0000) >> 0x10; + if (mDefeatedSwitch != 0xFF) { + if (dComIfGs_isSwitch(mDefeatedSwitch, fopAcM_GetRoomNo(this))) { + // "E_OC I've been defeated so I won't reset it\n" + OS_REPORT("E_OC やられ後なので再セットしません\n"); return cPhs_ERROR_e; } } - field_0x6e1 = (fopAcM_GetParam(this) & 0xff000000) >> 0x18; - u_var = current.angle.x & 0xff; - if (u_var == 0xff) { + + field_0x6e1 = (fopAcM_GetParam(this) & 0xFF000000) >> 0x18; + u_var = current.angle.x & 0xFF; + if (u_var == 0xFF) { u_var = 0; } + mMoveRange = 100.0f * u_var; - u_var = current.angle.x >> 8 & 0xff; - if (u_var == 0xff || u_var == 0) { + u_var = current.angle.x >> 8 & 0xFF; + if (u_var == 0xFF || u_var == 0) { mName = "E_OC"; } else { mName = "E_OC2"; @@ -2544,14 +2790,18 @@ cPhs__Step daE_OC_c::create() { if (phase == cPhs_COMPLEATE_e) { phase = (cPhs__Step) dComIfG_resLoad(&mPhaseReqs[1], "E_ocb"); if (phase == cPhs_COMPLEATE_e) { + OS_REPORT("E_OC PARAM %x\n", fopAcM_GetParam(this)); if (!fopAcM_entrySolidHeap(this, useHeapInit, 0x2e40)) { return cPhs_ERROR_e; } + if (!lbl_216_bss_58) { field_0xe84 = 1; lbl_216_bss_58 = 1; - l_HIO.field_0x04 = 0xFF; + // "oku" + l_HIO.field_0x04 = mDoHIO_CREATE_CHILD("オーク", &l_HIO); } + attention_info.flags = fopAc_AttnFlag_BATTLE_e; fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx()); fopAcM_SetMin(this, -200.0f, -200.0f, -200.0f); @@ -2583,35 +2833,41 @@ cPhs__Step daE_OC_c::create() { if (mName == "E_OC") { mSphs_at[0].SetAtAtp(1); mSphs_at[1].SetAtAtp(1); - fopAcM_OnStatus(this,0x10000); + fopAcM_OnStatus(this, 0x10000); } else { mSphs_at[0].SetAtAtp(2); mSphs_at[1].SetAtAtp(2); } + mSound.init(¤t.pos, &eyePos, 3, 1); mSound.setEnemyName("E_oc"); - mpSound = &mSound; - field_0xe5a = 1; + mAtInfo.mpSound = &mSound; + mAtInfo.mPowerType = 1; current.angle.x = shape_angle.x = 0; gravity = -5.0f; switch (field_0x6b4) { case 2: break; case 3: - field_0x6eb = 1; - setActionMode(0xb, 0); + // When you break the monkey cage in Forest Temple - Underground Monkey Room, + // two bokoblins spawn. One with lowest bit == 3 and the other == 4. + mHide = true; + setActionMode(E_OC_ACTION_DEMO_MASTER, 0); break; case 4: - field_0x6eb = 1; - setActionMode(0xc, 0); + // Ditto to above. + mHide = true; + setActionMode(E_OC_ACTION_DEMO_CHILD, 0); break; default: fopAcM_OffStatus(this, 0x4000); break; } + daE_OC_Execute(this); } } + return phase; }