summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYunataSavior <58997725+YunataSavior@users.noreply.github.com>2025-11-09 01:19:04 -0800
committerGitHub <noreply@github.com>2025-11-09 11:19:04 +0200
commit72cb2950a0d8218eb791e3c5eeeaf2acd28e66e6 (patch)
tree8335015f91be3a7991382d42e5b742178825da3d /src
parentc9bc11d47000066e053f150e187a570dc4b85afc (diff)
e_oc dbg work and cleanup (#2783)
* e_oc dbg work and cleanup * daE_OC_c::getVisionAngle arg rename
Diffstat (limited to 'src')
-rw-r--r--src/d/actor/d_a_e_oc.cpp1370
1 files changed, 813 insertions, 557 deletions
diff --git a/src/d/actor/d_a_e_oc.cpp b/src/d/actor/d_a_e_oc.cpp
index a92b3ad77e..76504b6759 100644
--- a/src/d/actor/d_a_e_oc.cpp
+++ b/src/d/actor/d_a_e_oc.cpp
@@ -15,27 +15,48 @@
#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;
+
+#if DEBUG
+ void genMessage(JORMContext*);
+#endif
};
-//
-// Declarations:
-//
-
/* 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] = {
0.0f, 0.0f, 0.0f, 0.0f, 15.3f,
@@ -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, &current.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<fopAc_ac_c*>(arg_rhs);
- daE_OC_c* actor_lhs = static_cast<daE_OC_c*>(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<fopAc_ac_c*>(arg_lhs);
- fopAc_ac_c* actor_rhs = static_cast<fopAc_ac_c*>(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, &current.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(&current.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)
+ 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:
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(&current.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(&current.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, &current.pos, NULL, 2.0f, &tevStr, 0);
+ fopAcM_effSmokeSet2(&field_0xe60, &field_0xe64, &current.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(&current.pos, &field_0x67c);
+ mPrevShapeAngle = cLib_targetAngleY(&current.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(&current.pos, &field_0x67c);
- mPrevShapeAngle = tgt_angle;
- field_0x6bc = tgt_angle;
+ field_0x6bc = mPrevShapeAngle = cLib_targetAngleY(&current.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, &current.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, &current.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, &current.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, &current.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 (dComIfGp_event_runCheck() != 0) {
- 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);
}
- 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<int>(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<daE_OC_c*>(i_this)->CreateHeap();
+ daE_OC_c* a_this = static_cast<daE_OC_c*>(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(&current.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;
}