From 4b401652d9253186067a16582581b86aa6283f14 Mon Sep 17 00:00:00 2001 From: SuperDude88 <82904174+SuperDude88@users.noreply.github.com> Date: Fri, 26 Jun 2026 17:45:09 -0400 Subject: [PATCH] d_a_kb Almost Matching (#1040) * d_a_kb Almost Matching - Get most of the logic in Still need to switch over from inheritance to composition, will fix at least 2/3 of the functions * Switch Inheritance -> Composition Causes regressions in way_check and target_set * Use More Enums Now uses res/loop mode/item number/sound/particle/collision attribute/event flag enums properly * Fix d_a_npc_people Used kb_class in a couple spots * Another Inline Found it in the debug map * Joint Enums - Add joint enums with note about normal/big pigs needing to have (at least partially) identical joint setups * Assert for Joint Numbers - Make sure the joint numbers match for the normal pig + big pig models - Update/extend note accordingly --- include/d/actor/d_a_kb.h | 80 +- src/d/actor/d_a_kb.cpp | 2347 +++++++++++++++++++++++++++++++- src/d/actor/d_a_npc_people.cpp | 8 +- 3 files changed, 2339 insertions(+), 96 deletions(-) diff --git a/include/d/actor/d_a_kb.h b/include/d/actor/d_a_kb.h index 47fe17253..e5c37b470 100644 --- a/include/d/actor/d_a_kb.h +++ b/include/d/actor/d_a_kb.h @@ -6,12 +6,13 @@ #include "d/d_bg_s_acch.h" #include "SSystem/SComponent/c_phase.h" #include "d/d_path.h" +#include "d/d_particle.h" class mDoExt_McaMorf; class J3DTexNoAnm; class J3DMaterialTable; -class kb_class : public fopAc_ac_c { +class kb_class { public: void taura_pos_set(cXyz pos) { m450 = pos; @@ -19,57 +20,90 @@ public: } public: + /* 0x000 */ fopAc_ac_c actor; /* 0x290 */ dKy_tevstr_c mTevStr; - /* 0x340 */ u8 m340[0x3F4 - 0x340]; + /* 0x340 */ dKy_tevstr_c m340; + /* 0x3F0 */ u32 mShadowId; /* 0x3F4 */ request_of_phase_process_class mPhs; /* 0x3FC */ mDoExt_McaMorf* mpMorf; /* 0x400 */ u8 mShapeType; /* 0x401 */ u8 m401; /* 0x402 */ u8 mbCanBeBigPig; - /* 0x403 */ u8 m403[0x408 - 0x403]; + /* 0x403 */ u8 m403; + /* 0x404 */ u8 m404; + /* 0x405 */ u8 m405; + /* 0x406 */ u8 m406; + /* 0x407 */ u8 m407; /* 0x408 */ u8 m408; - /* 0x409 */ u8 m409[0x40C - 0x409]; + /* 0x409 */ u8 m409; + /* 0x40A */ u8 m40A; + /* 0x40B */ u8 m40B; /* 0x40C */ dPath* mpPath; /* 0x410 */ u8 m410[0x41D - 0x410]; /* 0x41D */ u8 m41D; - /* 0x41E */ u8 m41E[0x420 - 0x41E]; + /* 0x41E */ s16 m41E; /* 0x420 */ s16 m420; /* 0x422 */ s16 m422; /* 0x424 */ s16 m424; - /* 0x426 */ s16 m426; - /* 0x428 */ s16 m428; - /* 0x42A */ s16 m42A; - /* 0x42C */ u8 m42C[0x446 - 0x42C]; + /* 0x426 */ s16 m426[8]; + /* 0x436 */ s16 m436; + /* 0x438 */ s16 m438; + /* 0x43A */ s16 m43A; + /* 0x42C */ u8 m43C[0x440 - 0x43C]; + /* 0x440 */ s16 m440; + /* 0x442 */ s16 m442; + /* 0x444 */ s16 m444; /* 0x446 */ s16 m446; - /* 0x448 */ u8 m448[0x450 - 0x448]; + /* 0x448 */ s16 m448; + /* 0x44A */ s16 m44A; + /* 0x44C */ s16 m44C; + /* 0x44E */ s16 m44E; /* 0x450 */ cXyz m450; - /* 0x45C */ f32 m45C; - /* 0x460 */ u8 m460[0x464 - 0x460]; - /* 0x464 */ f32 m464; - /* 0x468 */ u8 m468[0x4A4 - 0x468]; + /* 0x45C */ cXyz m45C; + /* 0x468 */ cXyz field_0x468[2]; + /* 0x480 */ cXyz field_0x480[2]; + /* 0x498 */ cXyz field_0x498; /* 0x4A4 */ cXyz m4A4; - /* 0x4B0 */ u8 m4B0[0x4B4 - 0x4B0]; + /* 0x4B0 */ f32 m4B0; /* 0x4B4 */ f32 m4B4; /* 0x4B8 */ f32 m4B8; - /* 0x4BC */ u8 m4BC[0x4C4 - 0x4BC]; + /* 0x4BC */ f32 m4BC; + /* 0x4C0 */ f32 m4C0; /* 0x4C4 */ f32 m4C4; - /* 0x4C8 */ u8 m4C8[0x4CC - 0x4C8]; + /* 0x4C8 */ f32 m4C8; /* 0x4CC */ f32 m4CC; /* 0x4D0 */ u8 m4D0[0x4D4 - 0x4D0]; /* 0x4D4 */ f32 m4D4; - /* 0x4D8 */ u8 m4D8[0x4E8 - 0x4D8]; + /* 0x4D8 */ fpc_ProcID m4D8; + /* 0x4DC */ cXyz m4DC; /* 0x4E8 */ cXyz m4E8; - /* 0x4F4 */ u8 m4F4[0x504 - 0x4F4]; + /* 0x4F4 */ csXyz m4F4; + /* 0x4FA */ csXyz m4FA; + /* 0x500 */ J3DAnmTexPattern* m500; /* 0x504 */ J3DTexNoAnm* mpTexNoAnm; - /* 0x508 */ u8 m508[0x50C - 0x508]; + /* 0x508 */ u8 m508; + /* 0x509 */ u8 m509; + /* 0x50A */ u8 m50A; /* 0x50C */ int m50C; - /* 0x510 */ u8 m510[0x5F8 - 0x510]; + /* 0x510 */ u8 m510[0x514 - 0x510]; + /* 0x514 */ cXyz m514; + /* 0x520 */ cXyz m520; + /* 0x52C */ u8 m52C[0x53C - 0x52C]; + /* 0x53C */ f32 m53C; + /* 0x540 */ dPa_rippleEcallBack m540; + /* 0x554 */ dPa_smokeEcallBack m554; + /* 0x574 */ dPa_smokeEcallBack m574; + /* 0x594 */ dPa_followEcallBack m594; + /* 0x5A8 */ dPa_followEcallBack m5A8[2]; + /* 0x5D0 */ f32 m5D0; + /* 0x5D4 */ cXyz m5D4[2]; + /* 0x5EC */ csXyz m5EC[2]; /* 0x5F8 */ J3DMaterialTable* mpMaterialTable; /* 0x5FC */ dBgS_AcchCir mAcchCir; - /* 0x63C */ dBgS_Acch mAcch; + /* 0x63C */ dBgS_ObjAcch mAcch; /* 0x800 */ dCcD_Stts mStts; /* 0x83C */ dCcD_Sph mSph; - /* 0x968 */ u8 m968[0xA94 - 0x968]; + /* 0x968 */ dCcD_Sph m968; }; #endif /* D_A_KB_H */ diff --git a/src/d/actor/d_a_kb.cpp b/src/d/actor/d_a_kb.cpp index 2108664b6..e6066fd24 100644 --- a/src/d/actor/d_a_kb.cpp +++ b/src/d/actor/d_a_kb.cpp @@ -7,180 +7,2244 @@ #include "d/actor/d_a_kb.h" #include "m_Do/m_Do_ext.h" #include "d/d_cc_d.h" +#include "d/actor/d_a_esa.h" +#include "d/actor/d_a_tag_kb_item.h" +#include "d/actor/d_a_player.h" +#include "d/d_s_play.h" +#include "f_op/f_op_kankyo_mng.h" +#include "f_op/f_op_camera.h" +#include "res/Object/kb.h" +#include "d/d_snap.h" +#include "d/d_vibration.h" + +// Several functions use the same joint index for the tail on both the normal and big pig models +// Because of this, PG_JNT_J_PG_TAIL_e *must* match the value of PG_BIG_JNT_J_PG_TAIL_e +// Otherwise the code that deals with these joints would break in a couple places +STATIC_ASSERT(PG_JNT_J_PG_TAIL_e == PG_BIG_JNT_J_PG_TAIL_e); + +static bool ALL_ANGER; +static bool DEMO_START; /* 00000078-000001A4 .text anm_init__FP8kb_classifUcfi */ -void anm_init(kb_class*, int, float, unsigned char, float, int) { - /* Nonmatching */ +void anm_init(kb_class* i_this, int param_1, f32 param_2, u8 param_3, f32 param_4, int param_5) { + i_this->m50C = param_1; + + if(param_5 >= 0) { + void* pSoundAnimRes = (J3DAnmTransform*)dComIfG_getObjectRes("Kb", param_5); + J3DAnmTransform* pAnimRes = (J3DAnmTransform*)dComIfG_getObjectRes("Kb", param_1); + i_this->mpMorf->setAnm(pAnimRes, param_3, param_2, param_4, 0.0f, -1.0f, pSoundAnimRes); + } + else { + J3DAnmTransform* pAnimRes = (J3DAnmTransform*)dComIfG_getObjectRes("Kb", param_1); + i_this->mpMorf->setAnm(pAnimRes, param_3, param_2, param_4, 0.0f, -1.0f, NULL); + } } +static u16 kb_btp_idx[] = {dRes_INDEX_KB_BTP_PG_EYE1_e, dRes_INDEX_KB_BTP_PG_EYE1_e, dRes_INDEX_KB_BTP_PG_EYE2_e, dRes_INDEX_KB_BTP_PG_BIG_EYE1_e, dRes_INDEX_KB_BTP_PG_BIG_EYE1_e, dRes_INDEX_KB_BTP_PG_BIG_EYE2_e, dRes_INDEX_KB_BTP_PG_EYE1_e}; +static u16 kb_bmt_idx[] = {dRes_INDEX_KB_BMT_PG_PINK_e, dRes_INDEX_KB_BMT_PG_BUTI_e, dRes_INDEX_KB_BMT_PG_KURO_e, dRes_INDEX_KB_BMT_PG_BIG_PINK_e, dRes_INDEX_KB_BMT_PG_BIG_BUTI_e, dRes_INDEX_KB_BMT_PG_BIG_KURO_e, dRes_INDEX_KB_BMT_PG_PINK_e}; + /* 000001A4-00000258 .text tex_anm_set__FP8kb_classUs */ -void tex_anm_set(kb_class*, unsigned short) { - /* Nonmatching */ +void tex_anm_set(kb_class* i_this, u16 param_1) { + i_this->m509 = 1; + J3DAnmTexPattern* pPattern = (J3DAnmTexPattern*)dComIfG_getObjectRes("Kb", kb_btp_idx[param_1]); + i_this->m50A = 2; + i_this->m500 = pPattern; + i_this->m508 = 0; + i_this->m500->setFrame(0.0f); + + const u16 num = pPattern->getUpdateMaterialNum(); + for(u16 i = 0; i < num; i++) { + i_this->mpTexNoAnm[i].setAnmTexPattern(pPattern); + } } /* 00000258-0000028C .text kb_eye_tex_anm__FP8kb_class */ -void kb_eye_tex_anm(kb_class*) { - /* Nonmatching */ +void kb_eye_tex_anm(kb_class* i_this) { + if(i_this->m509) { + if(i_this->m508 < i_this->m50A) { + i_this->m508++; + } + else { + i_this->m509 = 0; + } + } } /* 0000028C-00000654 .text esa_search_sub__FPvPv */ -void esa_search_sub(void*, void*) { - /* Nonmatching */ +void* esa_search_sub(void* param_1, void* param_2) { + dBgS_LinChk linChk; + + if(fopAcM_IsActor(param_1) && fopAcM_GetName(param_1) == fpcNm_ESA_e) { + esa_class* pEsa = (esa_class*)param_1; + fopAc_ac_c* pActor = (fopAc_ac_c*)param_2; + + if(pEsa->field_0x298 == 0 && pEsa->mState == 1 && std::abs(pActor->current.pos.y - pEsa->current.pos.y) < 40.0f) { + if(fopAcM_searchActorDistanceXZ(pActor, pEsa) < 400.0f && cLib_distanceAngleS(pActor->current.angle.y, fopAcM_searchActorAngleY(pActor, pEsa)) < 0x55F0) { + cXyz temp(pEsa->current.pos); + temp.y += 40.0f; + + cXyz temp2(pActor->current.pos); + temp2.y += 40.0f; + + linChk.Set(&temp2, &temp, pActor); + if(!dComIfG_Bgsp()->LineCross(&linChk)) { + return param_1; + } + } + } + } + + return NULL; } /* 00000AC8-00000B60 .text item_tag_search__FPvPv */ -void item_tag_search(void*, void*) { - /* Nonmatching */ +void* item_tag_search(void* param_1, void* param_2) { + if(fopAcM_IsActor(param_1) && fopAcM_GetName(param_1) == fpcNm_TAG_KB_ITEM_e) { + daTagKbItem_c* pItem = (daTagKbItem_c*)param_1; + fopAc_ac_c* pActor = (fopAc_ac_c*)param_2; + + if(std::abs(pActor->current.pos.y - pItem->current.pos.y) < 40.0f && fopAcM_searchActorDistanceXZ(pActor, pItem) < 400.0f) { + return param_1; + } + } + + return NULL; } /* 00000B60-00000B9C .text search_get_esa__FP8kb_class */ -void search_get_esa(kb_class*) { - /* Nonmatching */ +void* search_get_esa(kb_class* i_this) { + void* pProc = fpcEx_Search(esa_search_sub, i_this); + if(pProc) { + return pProc; + } + + return NULL; } /* 00000B9C-00000BD8 .text search_get_item__FP8kb_class */ -void search_get_item(kb_class*) { - /* Nonmatching */ +daTagKbItem_c* search_get_item(kb_class* i_this) { + void* pProc = fpcEx_Search(item_tag_search, i_this); + if(pProc) { + return (daTagKbItem_c*)pProc; + } + + return NULL; } /* 00000BD8-00000DB0 .text carry_check__FP8kb_class */ -void carry_check(kb_class*) { - /* Nonmatching */ +BOOL carry_check(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + cLib_onBit(actor->attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + if(fopAcM_checkCarryNow(actor)) { + cLib_offBit(actor->attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + cLib_offBit(actor->attention_info.flags, fopAc_Attn_LOCKON_MISC_e); + i_this->mSph.OnTgSetBit(); + i_this->m41E = 1; + i_this->m420 = 10; + i_this->m4CC = 0; + i_this->m440 = 0; + i_this->m540.end(); + i_this->m404 = 0; + actor->gravity = 0.0f; + actor->speed.y = 0.0f; + + fopAc_ac_c* pActor = fopAcM_SearchByID(i_this->m4D8); + if(i_this->m4D8 != fpcM_ERROR_PROCESS_ID_e && pActor != NULL) { + ((esa_class*)pActor)->field_0x298 = 0; + } + i_this->m4D8 = fpcM_ERROR_PROCESS_ID_e; + + actor->shape_angle.z = 0; + actor->speedF = 0.0f; + actor->speed.set(0.0f, 0.0f, 0.0f); + i_this->m4BC = actor->current.pos.y; + i_this->m436 = 0; + i_this->m438 = 0; + i_this->m44A = 0; + + anm_init(i_this, dRes_INDEX_KB_BCK_JITA2_e, 5.0f, J3DFrameCtrl::EMode_LOOP, 1.0f, dRes_INDEX_KB_BAS_JITA2_e); + + if(i_this->mShapeType >= 8) { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_L_CATCH, 0); + } + else { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_CATCH, 0); + } + + return TRUE; + } + + return FALSE; } /* 00000DB0-00000EF4 .text speed_pos_set__FP8kb_class */ -void speed_pos_set(kb_class*) { - /* Nonmatching */ +void speed_pos_set(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + if(daPy_getPlayerActorClass()->getGrabMissActor() == actor) { + i_this->m40B = 1; + i_this->mpMorf->setPlaySpeed(0.0f); + actor->shape_angle.z = 0; + actor->shape_angle.x = 0; + actor->current.angle.x = 0; + actor->current.angle.z = 0; + } + else { + if(i_this->m40B) { + i_this->mpMorf->setPlaySpeed(1.0f); + i_this->m40B = 0; + } + + mDoMtx_YrotS(*calc_mtx, actor->current.angle.y); + cXyz temp1, temp2; + temp1.x = 0.0f; + temp1.y = 0.0f; + temp1.z = actor->speedF; + MtxPosition(&temp1, &temp2); + actor->speed.x = temp2.x; + actor->speed.z = temp2.z; + actor->speed.y += actor->gravity; + + if(actor->speed.y < -20.0f) { + actor->speed.y = -20.0f; + } + + if(!fopAcM_checkCarryNow(actor)) { + if(i_this->mSph.ChkCoSet()) { + fopAcM_posMove(actor, i_this->mStts.GetCCMoveP()); + } + else { + fopAcM_posMove(actor, NULL); + } + } + } } /* 00000EF4-00000FA0 .text hamon_set__FP8kb_classf */ -void hamon_set(kb_class*, float) { - /* Nonmatching */ +void hamon_set(kb_class* i_this, f32 param_2) { + fopAc_ac_c* actor = &i_this->actor; + + cXyz scale; + scale.setall(i_this->m5D0); + if(i_this->m540.getEmitter() == NULL) { + dComIfGp_particle_setShipTail(dPa_name::ID_AK_JN_HAMON00, &actor->current.pos, NULL, &scale, 0xFF, &i_this->m540); + } + + if(i_this->m540.getEmitter()) { + i_this->m540.setRate(param_2); + } } /* 00000FA0-00001130 .text sibuki_set__FP8kb_class */ -void sibuki_set(kb_class*) { - /* Nonmatching */ +void sibuki_set(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + f32 scaleXZ = 0.4f; + i_this->m440 = 1; + cXyz pos(actor->current.pos); + pos.y = i_this->mAcch.m_wtr.GetHeight(); + i_this->m4C4 = 30.0f; + if(i_this->m4D4) { + scaleXZ = REG8_F(4) + 0.8f; + } + fopKyM_createWpillar(&pos, scaleXZ, 0.75f, 0.0f); + fopAcM_seStart(actor, JA_SE_OBJ_FALL_WATER_S, 0); + + if(i_this->mShapeType >= 8) { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_L_CATCH, 0); + } + else { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_CATCH, 0); + } + + i_this->m5D0 = i_this->m4D4 * 0.5f + 1.0f; + hamon_set(i_this, 1.0f); } /* 00001130-00001268 .text swim_mode_change_check__FP8kb_class */ -void swim_mode_change_check(kb_class*) { - /* Nonmatching */ +BOOL swim_mode_change_check(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + f32 temp = i_this->m4D4 * 20.0f + 20.0f; + if(i_this->mAcch.ChkWaterHit() && i_this->mAcch.m_wtr.GetHeight() > actor->current.pos.y && std::abs(i_this->mAcch.m_wtr.GetHeight() - i_this->mAcch.GetGroundH()) > temp) { + if(i_this->m440 == 0) { + sibuki_set(i_this); + } + else { + i_this->m5D0 = 1.0f; + if(i_this->m540.getEmitter()) { + i_this->m540.setRate(1.0f); + } + } + + i_this->m554.end(); + i_this->m41E = 2; + i_this->m420 = 0x14; + + return TRUE; + } + if(i_this->m404) { + if(i_this->m440 == 0) { + i_this->m440 = 1; + i_this->m4C4 = 30.0f; + i_this->m5D0 = i_this->m4D4 * 0.5f + 0.5f; + hamon_set(i_this, 0.0f); + } + } + else if(i_this->m440) { + i_this->m440 = 0; + i_this->m540.end(); + } + + return FALSE; } /* 00001268-000014E0 .text pl_attack_hit_check__FP8kb_class */ -void pl_attack_hit_check(kb_class*) { - /* Nonmatching */ +void pl_attack_hit_check(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + if(i_this->mSph.ChkTgHit()) { + if(i_this->m403 == 0) { + i_this->m403 = 1; + + dComIfGp_particle_set(dPa_name::ID_AK_JN_TUBA00, &actor->current.pos, &actor->shape_angle); + + for(int i = 0; i < 2; i++) { + i_this->m5A8[i].end(); + } + + i_this->m4DC = *i_this->mSph.GetTgHitPosP(); + + if(i_this->m420 != 5) { + i_this->m420 = 4; + } + + CcAtInfo atInfo; + atInfo.pParticlePos = NULL; + atInfo.mpObj = i_this->mSph.GetTgHitObj(); + cc_at_check(actor, &atInfo); + + if(dComIfGs_getSelectEquip(0) == dItemNo_NONE_e) { + actor->health = 10; + } + + if(actor->health <= 0) { + actor->health = 10; + ALL_ANGER = true; + cLib_onBit(actor->attention_info.flags, fopAc_Attn_LOCKON_BATTLE_e); + i_this->m420 = 0x21; + i_this->m41E = 3; + } + + if(i_this->mShapeType >= 8) { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_L_CATCH, 0); + } + else { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_CATCH, 0); + } + } + } + else { + i_this->m403 = 0; + + if(ALL_ANGER) { + if(i_this->m50C != 0x16) { + anm_init(i_this, dRes_INDEX_KB_BCK_RUN1_e, 5.0f, J3DFrameCtrl::EMode_LOOP, 2.0f, dRes_INDEX_KB_BAS_RUN1_e); + } + + cLib_onBit(actor->attention_info.flags, fopAc_Attn_LOCKON_BATTLE_e); + cLib_offBit(actor->attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + + i_this->m4C4 = 30.0f; + i_this->m41E = 3; + i_this->m420 = 0x23; + } + } } /* 0000151C-0000160C .text he_set__FP8kb_class */ -void he_set(kb_class*) { - /* Nonmatching */ +void he_set(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + daPy_py_c* pPlayer = daPy_getPlayerActorClass(); + + i_this->m5D4[0] = i_this->m4A4; + i_this->m5EC[0] = pPlayer->shape_angle; + + if(i_this->m594.getEmitter() == NULL) { + i_this->m5D4[0] = i_this->m4A4; + // this could just use "i_this->m5D4" but I think pointer to first element is a clearer way to write it? + dComIfGp_particle_set(dPa_name::ID_AK_SN_PIGGAS00, &i_this->m5D4[0], NULL, NULL, 0xFF, &i_this->m594, fopAcM_GetRoomNo(actor)); + } + + if(i_this->m594.getEmitter()) { + i_this->m594.getEmitter()->setGlobalRTMatrix(i_this->mpMorf->getModel()->getAnmMtx(PG_JNT_J_PG_TAIL_e)); + } } /* 0000160C-000016E0 .text smoke_set__FP8kb_class */ -void smoke_set(kb_class*) { - /* Nonmatching */ +void smoke_set(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + f32 scale = i_this->m4D4 + 1.0f; + + if(i_this->m554.getEmitter() == NULL) { + dComIfGp_particle_setToon(dPa_name::ID_AK_JT_ELEMENTSMOKE00, &i_this->m5D4[0], &i_this->m5EC[0], NULL, 0xB9, &i_this->m554, fopAcM_GetRoomNo(actor)); + } + + if(i_this->m554.getEmitter()) { + JGeometry::TVec3 scaleVec(scale, scale, scale); + i_this->m554.getEmitter()->setRate(1.0f); + i_this->m554.getEmitter()->setSpread(1.0f); + i_this->m554.getEmitter()->setGlobalScale(scaleVec); + } } /* 000016E0-000017EC .text smoke_set2__FP8kb_class */ -void smoke_set2(kb_class*) { - /* Nonmatching */ +void smoke_set2(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + f32 scale = i_this->m4D4 + 1.0f; + + if(i_this->m554.getEmitter() == NULL) { + dComIfGp_particle_setToon(dPa_name::ID_AK_JT_ELEMENTSMOKE01, &i_this->m5D4[0], &actor->shape_angle, NULL, 0xB9, &i_this->m554, fopAcM_GetRoomNo(actor)); + } + + if(i_this->m554.getEmitter()) { + JGeometry::TVec3 scaleVec(scale, scale, scale); + i_this->m554.getEmitter()->setMaxFrame(25); + i_this->m554.getEmitter()->setAwayFromCenterSpeed(0.0f); + i_this->m554.getEmitter()->setAwayFromAxisSpeed(5.0f); + i_this->m554.getEmitter()->setRate(3.0f); + i_this->m554.getEmitter()->setDirectionalSpeed(2.0f); + i_this->m554.getEmitter()->setGlobalScale(scaleVec); + i_this->m554.getEmitter()->setLifeTime(25); + } } /* 000017EC-000018DC .text smoke_set3__FP8kb_class */ -void smoke_set3(kb_class*) { - /* Nonmatching */ +void smoke_set3(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + JGeometry::TVec3 scaleVec; + if(i_this->mShapeType >= 8) { + scaleVec.set(3.0f, 3.0f, 3.0f); + } + else { + scaleVec.set(1.0f, 1.0f, 1.0f); + } + + if(i_this->m574.getEmitter() == NULL) { + dComIfGp_particle_setToon(dPa_name::ID_AK_ST_PIGDIGSMOKE00, &i_this->m5D4[1], &actor->shape_angle, NULL, 0xA0, &i_this->m574, fopAcM_GetRoomNo(actor)); + } + + i_this->m574.onWindOff(); + + if(i_this->m574.getEmitter()) { + i_this->m574.getEmitter()->setGlobalScale(scaleVec); + } } /* 000018DC-000019A4 .text nodeCallBack__FP7J3DNodei */ -static BOOL nodeCallBack(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeCallBack(J3DNode* i_node, int calcTiming) { + if(calcTiming == J3DNodeCBCalcTiming_In) { + J3DJoint* joint = reinterpret_cast(i_node); + s32 jntNo = joint->getJntNo(); + J3DModel* pModel = j3dSys.getModel(); + kb_class* i_kb = (kb_class*)pModel->getUserArea(); + + if(i_kb && jntNo == PG_JNT_J_PG_TAIL_e) { + cMtx_copy(pModel->getAnmMtx(jntNo), *calc_mtx); + cXyz temp(0.0f, 0.0f, 0.0f); + MtxPosition(&temp, &i_kb->m4A4); + pModel->setAnmMtx(jntNo, *calc_mtx); + cMtx_copy(*calc_mtx, J3DSys::mCurrentMtx); + } + } + + return TRUE; } /* 000019A4-00001ACC .text draw_SUB__FP8kb_class */ -void draw_SUB(kb_class*) { - /* Nonmatching */ +void draw_SUB(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + J3DModel* pModel = i_this->mpMorf->getModel(); + MtxTrans(actor->current.pos.x, actor->current.pos.y, actor->current.pos.z, false); + mDoMtx_XrotM(*calc_mtx, i_this->m4F4.x); + mDoMtx_ZrotM(*calc_mtx, i_this->m4F4.z); + MtxScale(i_this->m4E8.x, i_this->m4E8.y, i_this->m4E8.x, true); + + if(i_this->m41E != 4) { + cLib_addCalc2(&i_this->m4C0, i_this->m4C4, 1.0f, 5.0f); + } + + MtxTrans(0.0f, i_this->m4C0, 0.0f, true); + mDoMtx_YrotM(*calc_mtx, actor->shape_angle.y); + mDoMtx_XrotM(*calc_mtx, actor->shape_angle.x); + mDoMtx_ZrotM(*calc_mtx, actor->shape_angle.z); + MtxTrans(0.0f, -30.0f, 0.0f, true); + pModel->setBaseTRMtx(*calc_mtx); } /* 00001ACC-00001F6C .text daKb_Draw__FP8kb_class */ -static BOOL daKb_Draw(kb_class*) { - /* Nonmatching */ +static BOOL daKb_Draw(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + J3DModel* pModel = i_this->mpMorf->getModel(); + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, &actor->current.pos, &actor->tevStr); + J3DModelData* pModelData = pModel->getModelData(); + pModelData->setTexNoAnimator(i_this->m500, i_this->mpTexNoAnm); + i_this->m500->setFrame(i_this->m508); + pModelData->setMaterialTable(i_this->mpMaterialTable, J3DMatCopyFlag_Material); + i_this->mTevStr = actor->tevStr; + i_this->mTevStr.mColorC0.r = actor->tevStr.mColorC0.r + (0x78 - actor->tevStr.mColorC0.r) * i_this->m4B0; + i_this->mTevStr.mColorC0.g = actor->tevStr.mColorC0.g + (-actor->tevStr.mColorC0.g) * i_this->m4B0; + i_this->mTevStr.mColorC0.b = actor->tevStr.mColorC0.b + (-actor->tevStr.mColorC0.b) * i_this->m4B0; + i_this->mTevStr.mColorK0.r = actor->tevStr.mColorK0.r + (0x78 - actor->tevStr.mColorK0.r) * i_this->m4B0; + i_this->mTevStr.mColorK0.g = actor->tevStr.mColorK0.g + (-actor->tevStr.mColorK0.g) * i_this->m4B0; + i_this->mTevStr.mColorK0.b = actor->tevStr.mColorK0.b + (-actor->tevStr.mColorK0.b) * i_this->m4B0; + g_env_light.setLightTevColorType(pModel, &i_this->mTevStr); + i_this->mpMorf->updateDL(); + + if(i_this->m420 < 0x2D && !fopAcM_checkCarryNow(actor) && i_this->m41E != 2) { + cXyz shadowPos(actor->current.pos.x, actor->current.pos.y + 150.0f + REG8_F(0x12), actor->current.pos.z); + i_this->mShadowId = dComIfGd_setShadow(i_this->mShadowId, + 1, + pModel, + &shadowPos, REG8_F(0x13) + 800.0f, REG8_F(0x11) + 40.0f, + actor->current.pos.y, + i_this->mAcch.GetGroundH(), + i_this->mAcch.m_gnd, + &actor->tevStr); + } + + if(i_this->m4D4 == 2.0f) { + f32 temp = i_this->m4D4 + 1.0f; + dSnap_RegistFig(DSNAP_TYPE_UNK54, actor, temp - 0.4f, temp - 1.1f, 1.0f); + } + else { + dSnap_RegistFig(DSNAP_TYPE_UNK54, actor, 1.0f, 1.0f, 1.0f); + } + + return TRUE; } /* 00001F6C-0000233C .text way_check__FP8kb_classsUc */ -void way_check(kb_class*, short, unsigned char) { - /* Nonmatching */ +s16 way_check(kb_class* i_this, s16 param_1, u8 param_2) { + fopAc_ac_c* actor = &i_this->actor; + + dBgS_LinChk linChk; + + s16 angle = param_1; + + cXyz temp1; + cXyz temp3 = actor->current.pos; + temp3.y += 50.0f; + s16 temp = 0x2000; + if(cM_rnd() < 0.5f) { + temp = -0x2000; + } + + temp1.set(0.0f, 50.0f, 300.0f); + if(param_2) { + temp3 = actor->current.pos; + temp3.y += 100.0f; + + temp1.x = 0.0f; + temp1.y = 100.0f; + temp1.z = 100.0f; + } + + cXyz temp2; + for(int i = 0; i < 8; i++) { + mDoMtx_YrotS(*calc_mtx, angle); + MtxPosition(&temp1, &temp2); + temp2 += actor->current.pos; + linChk.Set(&temp3, &temp2, actor); + if(!dComIfG_Bgsp()->LineCross(&linChk)) { + return angle; + } + + angle += temp; + } + + return param_1; } /* 0000233C-00002748 .text target_set__FP8kb_classUc */ -void target_set(kb_class*, unsigned char) { - /* Nonmatching */ +void target_set(kb_class* i_this, u8 param_1) { + fopAc_ac_c* actor = &i_this->actor; + + s16 temp; + cXyz temp2; + switch(param_1) { + case 0: + temp = actor->shape_angle.y; + if(i_this->m426[3] == 0) { + temp = way_check(i_this, cM_rndFX(32768.0f), 0); + } + + break; + case 1: + temp = way_check(i_this, 0x8000 + fopAcM_searchPlayerAngleY(actor) + (s16)cM_rndFX(10000.0f), 0); + + break; + case 2: { + temp2.x = i_this->m450.x - actor->current.pos.x; + temp2.z = i_this->m450.z - actor->current.pos.z; + i_this->m422 = way_check(i_this, (s16)cM_atan2s(temp2.x, temp2.z), 1); + } + + break; + case 3: + if(i_this->m4D8 != fpcM_ERROR_PROCESS_ID_e) { + fopAc_ac_c* pActor = fopAcM_SearchByID(i_this->m4D8); + if(pActor) { + dBgS_LinChk linChk; + + cXyz temp4, temp3; + temp3 = pActor->current.pos; + temp3.y += 10.0f; + temp4 = actor->current.pos; + temp4.y += 10.0f; + + linChk.Set(&temp4, &temp3, actor); + if(!dComIfG_Bgsp()->LineCross(&linChk)) { + i_this->m45C = pActor->current.pos; + } + else { + i_this->m4D8 = fpcM_ERROR_PROCESS_ID_e; + } + } + } + + break; + } + + if(param_1 < 3) { + mDoMtx_YrotS(*calc_mtx, temp); + temp2.set(0.0f, 0.0f, 1000.0f); + MtxPosition(&temp2, &i_this->m45C); + i_this->m45C += actor->current.pos; + } } /* 00002748-00002834 .text esa_demo_check__FP8kb_class */ -void esa_demo_check(kb_class*) { - /* Nonmatching */ +BOOL esa_demo_check(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + if(i_this->m426[4] != 0) { + return FALSE; + } + + if(fopAcM_searchPlayerDistanceXZ(actor) > 2000.0f) { + return FALSE; + } + + if(i_this->mAcch.ChkWallHit()) { + return FALSE; + } + + fopAc_ac_c* pEsa = (fopAc_ac_c*)search_get_esa(i_this); + if(pEsa) { + i_this->m4D8 = fopAcM_GetID(pEsa); + i_this->field_0x498 = pEsa->current.pos; + + if(!DEMO_START) { + DEMO_START = true; + + i_this->m406 = 1; + i_this->m41E = 4; + i_this->m420 = 0x28; + + return TRUE; + } + } + + return FALSE; } /* 00002834-00003120 .text normal_move__FP8kb_class */ -void normal_move(kb_class*) { - /* Nonmatching */ +void normal_move(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + if(swim_mode_change_check(i_this)) { + return; + } + + f32 diffX = i_this->m45C.x - actor->current.pos.x; + f32 diffZ = i_this->m45C.z - actor->current.pos.z; + f32 temp1 = std::sqrtf(diffX + diffX + diffZ * diffZ); + i_this->m422 = cM_atan2s(diffX, diffZ); + + switch(i_this->m420) { + case 0: + i_this->m420 += 1; + i_this->m426[0] = cM_rndF(50.0f) + 50.0f; + actor->shape_angle.z = 0; + + if(i_this->m50C != 0x17) { + anm_init(i_this, dRes_INDEX_KB_BCK_WAIT1_e, 5.0f, J3DFrameCtrl::EMode_LOOP, 1.0f, dRes_INDEX_KB_BAS_WAIT1_e); + } + + i_this->m4B4 = 0.0f; + i_this->m4B8 = 2.5f; + case 1: + if(esa_demo_check(i_this)) { + return; + } + + if(i_this->m426[0] == 0) { + i_this->m420 = 2; + } + + if(fopAcM_searchPlayerDistance(actor) < 200.0f && i_this->m408 == 0) { + if(dComIfGp_checkPlayerStatus0(0, daPyStts0_CRAWL_e)) { + i_this->m426[1] = cM_rndF(60.0f) + 60.0f; + } + else if(i_this->m426[1] == 0 && i_this->m405 == 0) { + i_this->m420 = 4; + } + } + + break; + case 2: + i_this->m420 += 1; + i_this->m426[0] = cM_rndF(50.0f) + 50.0f; + i_this->m4B4 = 3.0f; + + if(i_this->m50C != 0x18) { + anm_init(i_this, dRes_INDEX_KB_BCK_WALK1_e, 5.0f, J3DFrameCtrl::EMode_LOOP, 1.0f, dRes_INDEX_KB_BAS_WALK1_e); + } + + i_this->m4B8 = 2.0f; + target_set(i_this, 0); + i_this->m424 = 0x800; + case 3: + if(esa_demo_check(i_this)) { + return; + } + + if(i_this->m426[0] == 0) { + i_this->m420 = 0; + break; + } + + if(fopAcM_searchPlayerDistance(actor) < 200.0f) { + if(i_this->m408 != 0) { + break; + } + + if(dComIfGp_checkPlayerStatus0(0, daPyStts0_CRAWL_e)) { + i_this->m426[1] = cM_rndF(30.0f) + 30.0f; + break; + } + else if(i_this->m426[1] == 0 && i_this->m405 == 0) { + i_this->m420 = 4; + break; + } + } + + if(i_this->m4CC && (i_this->m450.x || i_this->m450.y || i_this->m450.z)) { + f32 diffX = i_this->m450.x - actor->current.pos.x; + f32 diffZ = i_this->m450.z - actor->current.pos.z; + if(std::sqrtf(diffX * diffX + diffZ * diffZ) > i_this->m4CC * 0.5f) { + i_this->m422 = cM_atan2s(diffX, diffZ); + mDoMtx_YrotS(*calc_mtx, i_this->m422); + cXyz temp(0.0f, 0.0f, 1000.0f); + MtxPosition(&temp, &i_this->m45C); + i_this->m45C += actor->current.pos; + } + } + + break; + case 4: + if(i_this->mbCanBeBigPig != 2 && i_this->mbCanBeBigPig != 3 && i_this->mbCanBeBigPig != 4) { + i_this->m4CC = 0.0f; + } + + i_this->m420 += 1; + i_this->m4B4 = 12.0f; + if(i_this->mShapeType >= 8) { + i_this->m4B4 *= 0.5f; + } + + if(i_this->m50C != 0x16) { + anm_init(i_this, dRes_INDEX_KB_BCK_RUN1_e, 5.0f, J3DFrameCtrl::EMode_LOOP, 1.5f, dRes_INDEX_KB_BAS_RUN1_e); + } + + i_this->m4B8 = 2.0f; + i_this->m426[0] = 0; + i_this->m424 = 0x2000; + case 5: + if(i_this->m426[0] == 0) { + target_set(i_this, 1); + i_this->m426[0] = cM_rndF(10.0f) + 10.0f; + } + + if(i_this->mpMorf->checkFrame(0.0f) || i_this->mpMorf->checkFrame(5.0f)) { + if(i_this->mShapeType >= 8 && i_this->mpMorf->checkFrame(0.0f)) { + dComIfGp_getVibration().StartShock(1, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + fopAcM_monsSeStart(actor, JA_SE_CM_PG_L_JUMP, 0); + } + + if(i_this->m426[2] == 0) { + if(i_this->mShapeType >= 8) { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_L_NORMAL, 0); + } + else { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_NORMAL, 0); + } + } + } + + if(fopAcM_searchPlayerDistance(actor) > 400.0f) { + i_this->m420 = 0; + } + + break; + case 6: + if(i_this->mpMorf->isStop()) { + i_this->m4C4 = 30.0f; + i_this->m420 = 2; + i_this->m426[1] = cM_rndF(30.0f) + 30.0f; + } + + break; + } + + if(i_this->m420 > 1 && i_this->m420 != 6) { + if(i_this->m40B == 0) { + cLib_addCalcAngleS2(&actor->current.angle.y, i_this->m422, 4, i_this->m424); + } + + if(i_this->m420 == 5) { + if(i_this->m426[2] == 0) { + s16 dist = cLib_distanceAngleS(actor->current.angle.y, i_this->m422); + if(dist > 0x4000) { + if(i_this->mShapeType >= 8) { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_L_TURN, 0); + } + else { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_TURN, 0); + } + + i_this->m426[2] = 0x18; + } + } + + if(i_this->m40B == 0) { + if(std::abs(actor->speedF - i_this->m4B4) < 0.2f) { + actor->shape_angle.z = (actor->current.angle.y - i_this->m422) * 0.5f; + if(actor->shape_angle.z < 0) { + if((int)(u16)actor->shape_angle.z < (u16)-0x2000) { + actor->shape_angle.z = -0x2000; + } + } + else if(actor->shape_angle.z > 0x2000) { + actor->shape_angle.z = 0x2000; + } + } + else { + actor->shape_angle.z = 0; + } + } + } + } + + cLib_addCalc2(&actor->speedF, i_this->m4B4, 1.0f, i_this->m4B8); + cLib_onBit(actor->attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + carry_check(i_this); + cLib_addCalcAngleS2(&actor->shape_angle.y, actor->current.angle.y, 2, 0x1000); } /* 00003120-00003DEC .text carry_move__FP8kb_class */ -void carry_move(kb_class*) { - /* Nonmatching */ +void carry_move(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + daPy_py_c* pPlayer = daPy_getPlayerActorClass(); + + switch(i_this->m420) { + case 0xA: + i_this->mSph.OffCoSetBit(); + actor->shape_angle.z = 0; + cLib_addCalcAngleS2(&i_this->m4F4.x, 0, 2, 0x400); + cLib_addCalcAngleS2(&i_this->m4F4.z, 0, 2, 0x400); + + if(i_this->m4BC != actor->current.pos.y) { + i_this->m438 += 1; + + if(i_this->m438 == 4) { + dComIfGp_particle_set(dPa_name::ID_AK_JN_TUBA00, &actor->current.pos, &actor->shape_angle); + } + + cLib_addCalcAngleS2(&actor->shape_angle.x, -0x7FFF, 1, 0x1000); + i_this->m4C4 = 20.0f; + } + + if(std::abs(actor->current.pos.y - pPlayer->current.pos.y) >= 110.0f) { + actor->shape_angle.x = -0x7FFF; + + if(i_this->mbCanBeBigPig == 3) { + he_set(i_this); + } + + i_this->m426[2] = 0; + i_this->m4C8 = 1.8f; + + dComIfGp_particle_set(dPa_name::ID_AK_JN_TUBA00, &actor->current.pos, &actor->shape_angle); + + anm_init(i_this, dRes_INDEX_KB_BCK_JITA2_e, 5.0f, J3DFrameCtrl::EMode_NONE, i_this->m4C8, dRes_INDEX_KB_BAS_JITA2_e); + + if(i_this->mShapeType >= 8) { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_L_CATCH, 0); + } + else { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_CATCH, 0); + } + + i_this->mAcch.OnLineCheck(); + i_this->m44A = 3; + i_this->m420 = 0xB; + } + + actor->current.angle.y = actor->shape_angle.y; + + break; + case 0xB: + if(i_this->mbCanBeBigPig == 3) { + he_set(i_this); + } + + if(i_this->m44A != 0) { + if(i_this->mpMorf->isStop()) { + i_this->m44A -= 1; + + if(i_this->m44A <= 0) { + anm_init(i_this, dRes_INDEX_KB_BCK_JITA1_e, 5.0f, J3DFrameCtrl::EMode_LOOP, 1.0f, dRes_INDEX_KB_BAS_JITA1_e); + + i_this->m426[2] = cM_rndF(300.0f) + 600.0f; + i_this->m44A = 0; + } + else { + i_this->m4C8 -= 0.6f; + if(i_this->m4C8 < 0.0f) { + i_this->m4C8 = 0.0f; + } + + if(i_this->m44A > 1) { + if(i_this->mShapeType >= 8) { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_L_CATCH, 0); + } + else { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_CATCH, 0); + } + } + + anm_init(i_this, dRes_INDEX_KB_BCK_JITA2_e, 0.0f, J3DFrameCtrl::EMode_NONE, i_this->m4C8, dRes_INDEX_KB_BAS_JITA2_e); + } + } + } + else { + if(i_this->m426[2] == 0) { + i_this->m44A = 3; + i_this->m4C8 = 1.8f; + + anm_init(i_this, dRes_INDEX_KB_BCK_JITA2_e, 5.0f, J3DFrameCtrl::EMode_NONE, i_this->m4C8, dRes_INDEX_KB_BAS_JITA2_e); + + if(i_this->mShapeType >= 8) { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_L_CATCH, 0); + } + else { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_CATCH, 0); + } + + dComIfGp_particle_set(dPa_name::ID_AK_JN_TUBA00, &actor->current.pos, &actor->shape_angle); + } + else if(pPlayer->getFootOnGround()) { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_CARRY, 0); + } + } + + cLib_addCalcAngleS2(&actor->shape_angle.x, -0x7FFF, 1, 0x1000); + actor->current.angle.y = actor->shape_angle.y; + + break; + case 0xC: + if(i_this->mAcch.ChkWaterHit() && i_this->mAcch.m_wtr.GetHeight() > actor->current.pos.y && i_this->m440 == 0) { + sibuki_set(i_this); + } + + if(i_this->mAcch.ChkWallHit() && std::abs(actor->speedF) > 3.0f) { + actor->speedF *= -0.5f; + } + + if(i_this->m444 > 3) { + if(i_this->m444 != 2) { + return; + } + + if(i_this->m436 == 0) { + return; + } + + actor->speedF = 20.0f; + actor->speed.y = 20.0f; + return; + } + + if(!i_this->mAcch.ChkGroundHit()) { + actor->speedF *= 0.99f; + } + + if(i_this->m436 == 0) { + actor->shape_angle.x += 0x1000; + cLib_addCalcAngleS2(&actor->shape_angle.y, actor->current.angle.y, 2, 0x800); + } + else { + cLib_addCalcAngleS2(&actor->shape_angle.x, 0, 1, 0x800); + } + + if((i_this->m440 == 0 && !i_this->mAcch.ChkGroundHit()) || (i_this->m440 && i_this->mAcch.m_wtr.GetHeight() < actor->current.pos.y)) { + return; + } + + if(i_this->mShapeType >= 8) { + dComIfGp_getVibration().StartShock(1, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + fopAcM_monsSeStart(actor, JA_SE_CM_PG_L_JUMP, 0); + + if(strcmp(dComIfGp_getStartStageName(), "sea") == 0 && fopAcM_GetRoomNo(actor) == dIsleRoom_OutsetIsland_e && i_this->mAcch.GetGroundH() != -G_CM3D_F_INF && dComIfG_Bgsp()->GetSpecialCode(i_this->mAcch.m_gnd) != 4 && !dKy_daynight_check()) { + dComIfGs_onEventBit(dSv_event_flag_c::UNK_3402); + } + } + + if(i_this->m440 != 0) { + if(i_this->mShapeType >= 8) { + i_this->mStts.SetWeight(0x64); + } + else { + i_this->mStts.SetWeight(0x32); + } + + dComIfGp_getCamera(0)->mCamera.ForceLockOff(fopAcM_GetID(actor)); + + i_this->m41E = 2; + i_this->m420 = 0x14; + + return; + } + + cLib_addCalc0(&actor->speedF, 1.0f, 4.0f); + + dComIfGp_particle_set(dPa_name::ID_AK_JN_TUBA00, &actor->current.pos, &actor->shape_angle); + + if(i_this->mShapeType >= 8) { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_L_CATCH, 0); + } + else { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_CATCH, 0); + } + + i_this->m444 = 6; + + if(i_this->m436 == 0) { + actor->speed.y = 20.0f; + i_this->m436 = 1; + + if(i_this->mbCanBeBigPig == 4) { + i_this->m444 = 0x1E; + actor->speed.y = 0.0f; + actor->speedF = 0.0f; + } + + dComIfGp_getCamera(0)->mCamera.ForceLockOff(fopAcM_GetID(actor)); + + if(i_this->m50C != 0x17) { + anm_init(i_this, dRes_INDEX_KB_BCK_WAIT1_e, 5.0f, J3DFrameCtrl::EMode_LOOP, 1.0f, dRes_INDEX_KB_BAS_WAIT1_e); + } + + i_this->mSph.OnCoSetBit(); + } + else { + i_this->m420 = 0xD; + + if(i_this->mbCanBeBigPig == 2) { + i_this->m426[5] = 0x1E; + } + + if(i_this->m404 == 0) { + i_this->m450 = actor->current.pos; + } + + cLib_onBit(actor->attention_info.flags, fopAc_Attn_LOCKON_MISC_e); + i_this->m426[0] = 0x10; + actor->speedF = 0.0f; + i_this->m4B4 = 0.0f; + actor->speed.set(0.0f, 0.0f, 0.0f); + + if(dComIfGs_getSelectEquip(0) != dItemNo_NONE_e) { + actor->health -= 1; + } + } + + break; + case 0xD: + cLib_addCalcAngleS2(&actor->shape_angle.x, 0, 1, 0x2000); + + if(i_this->m426[0] == 0 && !fopAcM_checkCarryNow(actor) && i_this->m444 == 0) { + i_this->mAcch.OffLineCheck(); + i_this->m4C4 = 30.0f; + actor->shape_angle.x = 0; + i_this->mSph.OnCoSetBit(); + + anm_init(i_this, dRes_INDEX_KB_BCK_NAKU1_e, 5.0f, J3DFrameCtrl::EMode_NONE, 1.0f, dRes_INDEX_KB_BAS_NAKU1_e); + + actor->speedF = 0.0f; + i_this->m4B4 = 0.0f; + actor->speed.set(0.0f, 0.0f, 0.0f); + i_this->m422 = actor->current.angle.y; + i_this->m426[2] = 0; + i_this->m45C = actor->current.pos; + i_this->m41E = 0; + i_this->m420 = 6; + + if(actor->health <= 0) { + actor->health = 10; + + ALL_ANGER = true; + + actor->speedF = cM_rndFX(2.0f) + 15.0f; + i_this->mSph.OnAtSetBit(); + i_this->mSph.OnAtHitBit(); + i_this->m426[0] = 0x14; + actor->current.angle.y = actor->shape_angle.y; + i_this->m442 = fopAcM_searchPlayerAngleY(actor); + i_this->m5D4[0] = actor->current.pos; + i_this->m5EC[0] = actor->current.angle; + + smoke_set(i_this); + + i_this->m448 = 0; + i_this->m420 = 0x24; + } + + if(swim_mode_change_check(i_this)) { + return; + } + } + } + + if((i_this->m420 == 0xA || i_this->m420 == 0xB) && !fopAcM_checkCarryNow(actor)) { + actor->gravity = -3.0f; + + if(actor->speedF <= 0.0f) { + i_this->m4C4 = 30.0f; + i_this->m426[0] = 0; + + if(i_this->mbCanBeBigPig == 2) { + i_this->m426[5] = 0x1E; + } + + if(i_this->mbCanBeBigPig == 3) { + i_this->m594.end(); + } + + i_this->m420 = 0xD; + cLib_onBit(actor->attention_info.flags, fopAc_Attn_LOCKON_MISC_e); + } + else { + i_this->m436 = 0; + i_this->m4C4 = 30.0f; + + if(i_this->mbCanBeBigPig == 3) { + i_this->m594.end(); + } + + anm_init(i_this, dRes_INDEX_KB_BCK_JITA2_e, 5.0f, J3DFrameCtrl::EMode_LOOP, 1.0f, dRes_INDEX_KB_BAS_JITA2_e); + + actor->shape_angle.x = 0x8000; + actor->speedF = 20.0f; + actor->speed.y = 20.0f; + i_this->m420 = 0xC; + } + } } /* 00003DEC-0000494C .text swim_move__FP8kb_class */ -void swim_move(kb_class*) { - /* Nonmatching */ +void swim_move(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + dBgS_LinChk linChk; + + csXyz temp(actor->shape_angle); + + int temp3 = 0; + + f32 temp2 = i_this->mAcch.m_wtr.GetHeight(); + + switch(i_this->m420) { + case 0x14: + i_this->mSph.OffTgSetBit(); + i_this->mSph.ClrTgHit(); + actor->health = 10; + i_this->m436 = 0; + i_this->m438 = 0; + i_this->m43A = 0; + actor->shape_angle.z = 0; + cLib_offBit(actor->attention_info.flags, fopAc_Attn_LOCKON_BATTLE_e); + cLib_offBit(actor->attention_info.flags, fopAc_Attn_LOCKON_MISC_e); + i_this->mSph.OnCoSetBit(); + anm_init(i_this, dRes_INDEX_KB_BCK_JITA1_e, 5.0f, J3DFrameCtrl::EMode_LOOP, 1.0f, dRes_INDEX_KB_BAS_JITA1_e); + actor->speedF = 1.5f; + actor->speed.x = 0.0f; + actor->speed.z = 0.0f; + actor->shape_angle.z = 0; + actor->gravity = 0.0f; + actor->speed.y = -20.0f; + i_this->m420 += 1; + case 0x15: + cLib_addCalcAngleS2(&actor->shape_angle.x, 0, 1, 0x2000); + cLib_addCalcAngleS2(&actor->shape_angle.z, 0, 1, 0x2000); + cLib_addCalc0(&actor->speed.y, 1.0f, 2.0f); + + if(actor->speed.y > -0.1f) { + actor->shape_angle.x = 0; + actor->shape_angle.z = 0; + actor->speed.y = 0.0f; + i_this->m420 += 1; + } + + break; + case 0x16: + { + f32 temp3 = i_this->m4D4 * (REG8_F(6) + 10.0f) + 10.0f; + + if(i_this->m426[6] == 0) { + i_this->m426[6] = cM_rndF(15.0f) + 15.0f; + + if(i_this->mShapeType >= 8) { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_L_NORMAL, 0); + } + else { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_NORMAL, 0); + } + } + + i_this->m436 += 0x800; + + f32 temp4 = cM_ssin(i_this->m436) * (REG8_F(7) + 5.0f) + 29.0f; + temp4 += i_this->m4D4 * (REG8_F(8) + 29.0f); + cLib_addCalc2(&actor->current.pos.y, temp2 - temp4, 1.0f, 3.0f); + + if(std::abs(i_this->mAcch.m_wtr.GetHeight() - i_this->mAcch.GetGroundH()) < temp3) { + i_this->m5D0 = 0.5f; + + if(i_this->m540.getEmitter()) { + i_this->m540.setRate(0.0f); + } + + if(i_this->m50C != 0x18) { + anm_init(i_this, dRes_INDEX_KB_BCK_WALK1_e, 5.0f, J3DFrameCtrl::EMode_LOOP, 1.0f, dRes_INDEX_KB_BAS_WALK1_e); + } + + actor->gravity = -3.0f; + i_this->m420 += 1; + } + + carry_check(i_this); + + break; + } + case 0x17: + if(swim_mode_change_check(i_this)) { + return; + } + + if(i_this->m440 == 0) { + i_this->m540.end(); + i_this->m440 = 0; + i_this->m420 = 0x18; + } + + if(i_this->m426[6] == 0) { + i_this->m426[6] = cM_rndF(15.0f) + 15.0f; + + if(i_this->mShapeType >= 8) { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_L_NORMAL, 0); + } + else { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_NORMAL, 0); + } + } + + carry_check(i_this); + + break; + case 0x18: + anm_init(i_this, dRes_INDEX_KB_BCK_DASSUI_e, 5.0f, J3DFrameCtrl::EMode_NONE, 1.0f, -1); + + i_this->m436 = 0; + actor->speedF = 0.0f; + i_this->m420 += 1; + + break; + case 0x19: + if(i_this->mpMorf->checkFrame(10.0f) || i_this->mpMorf->checkFrame(11.0f)) { + if(i_this->mpMorf->checkFrame(11.0f)) { + temp.y += 0x8000; + temp3 = 1; + } + + if(i_this->m5A8[temp3].getEmitter() == NULL) { + dComIfGp_particle_set(dPa_name::ID_AK_SN_PIGDASSUI, &actor->current.pos, &temp, NULL, 0xFF, &i_this->m5A8[temp3], fopAcM_GetRoomNo(actor)); + } + + JPABaseEmitter* pEmtr = i_this->m5A8[temp3].getEmitter(); + if(pEmtr && i_this->m4D4) { + JGeometry::TVec3 scale(2.0f, 2.0f, 2.0f); + pEmtr->setGlobalScale(scale); + } + } + + if(i_this->mpMorf->isStop() || carry_check(i_this) == TRUE) { + for(int i = 0; i < 2; i++) { + i_this->m5A8[i].end(); + } + + i_this->m436 = 0; + i_this->m438 = 0; + i_this->m440 = 0; + + if(i_this->m41E != 1) { + i_this->mSph.OnTgSetBit(); + cLib_onBit(actor->attention_info.flags, fopAc_Attn_LOCKON_MISC_e); + + if(i_this->m404 == 0) { + i_this->m450 = actor->current.pos; + } + + i_this->m41E = 0; + i_this->m420 = 2; + i_this->m426[1] = cM_rndF(20.0f) + 20.0f; + i_this->m426[3] = cM_rndF(20.0f) + 20.0f; + } + } + break; + } + + actor->current.angle = actor->shape_angle; + + if(i_this->m420 >= 0x18) { + return; + } + + if(!actor->speed.y) { + cLib_addCalcAngleS2(&actor->shape_angle.x, 0, 4, 0x800); + + if(i_this->m43A == 0) { + target_set(i_this, 2); + i_this->m43A = 1; + + if(i_this->mAcch.ChkWallHit()) { + cXyz temp1, temp2, temp3; + dComIfG_Bgsp()->GetTriPnt(i_this->mAcchCir, &temp1, &temp2, &temp3); + + if((s16)cLib_distanceAngleS(actor->current.angle.y, cM_atan2s(temp1.x - actor->current.pos.x, temp1.z - actor->current.pos.z)) < 0x2000) { + if(cM_rnd() < 0.5f) { + i_this->m422 = actor->shape_angle.y + 0x4000; + } + else { + i_this->m422 = actor->shape_angle.y - 0x4000; + } + + i_this->m43A = cM_rndF(20.0f) + 5.0f; + } + } + } + + cLib_addCalcAngleS2(&actor->shape_angle.y, i_this->m422, 2, 0x200); + if((s16)cLib_distanceAngleS(actor->shape_angle.y, i_this->m422) < 0x100 && i_this->m43A > 0) { + i_this->m43A -= 1; + } + } } /* 0000494C-0000519C .text attack_move__FP8kb_class */ -void attack_move(kb_class*) { - /* Nonmatching */ +void attack_move(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + daPy_py_c* pPlayer = daPy_getPlayerActorClass(); + + switch(i_this->m420) { + case 0x1E: + { + anm_init(i_this, dRes_INDEX_KB_BCK_DAMAGE1_e, 5.0f, J3DFrameCtrl::EMode_LOOP, 1.0f, -1); + + cLib_offBit(actor->attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + + f32 diffX = i_this->m4DC.x - pPlayer->current.pos.x; + f32 diffZ = i_this->m4DC.z - pPlayer->current.pos.z; + f32 temp1 = std::sqrtf(diffX + diffX + diffZ * diffZ); + actor->current.angle.y = cM_atan2s(diffX, diffZ); + + mDoMtx_YrotS(*calc_mtx, actor->current.angle.y); + cXyz temp(0.0f, 0.0f, 12288.0f); + cXyz temp2; + MtxPosition(&temp, &temp2); + i_this->m4FA.x = temp2.x; + i_this->m4FA.z = temp2.z; + + actor->speedF = 50.0f; + i_this->m420 += 1; + + break; + } + case 0x1F: + cLib_addCalcAngleS2(&actor->shape_angle.x, i_this->m4FA.x, 1, 0x800); + cLib_addCalcAngleS2(&actor->shape_angle.z, i_this->m4FA.z, 1, 0x800); + cLib_addCalc0(&actor->speedF, 0.5f, 7.0f); + + if(i_this->mpMorf->isStop()) { + actor->speedF = 0.0f; + i_this->m420 += 1; + } + + break; + case 0x20: + cLib_addCalcAngleS2(&actor->shape_angle.x, 0, 1, 0x800); + cLib_addCalcAngleS2(&actor->shape_angle.z, 0, 1, 0x800); + + if(actor->shape_angle.x < 0x100 && actor->shape_angle.z < 0x100) { + actor->shape_angle.x = 0; + actor->shape_angle.z = 0; + i_this->m420 = 4; + } + + break; + case 0x21: + { + if(i_this->m50C != 0x16) { + anm_init(i_this, dRes_INDEX_KB_BCK_RUN1_e, 5.0f, J3DFrameCtrl::EMode_LOOP, 2.0f, dRes_INDEX_KB_BAS_RUN1_e); + } + + cLib_offBit(actor->attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + + f32 diffX = i_this->m4DC.x - actor->current.pos.x; + f32 diffZ = i_this->m4DC.z - actor->current.pos.z; + actor->shape_angle.x = 0; + actor->shape_angle.z = 0; + actor->shape_angle.y = cM_atan2s(diffX, diffZ); + actor->current.angle.y = actor->shape_angle.y + 0x8000; + actor->speedF = cM_rndFX(3.0f) + 7.0f; + + if(i_this->mShapeType < 8) { + actor->speed.y = cM_rndFX(5.0f) + 30.0f; + } + + i_this->mAcch.OnLineCheck(); + i_this->m4C4 = 30.0f; + i_this->m420 += 1; + + break; + } + case 0x22: + actor->shape_angle.x -= 0x2000; + + if(i_this->mAcch.ChkGroundHit()) { + ALL_ANGER = false; + + i_this->mAcch.OffLineCheck(); + + dComIfGp_getVibration().StartShock(1, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + + i_this->m420 = 0x23; + } + + break; + case 0x23: + if(abs(actor->shape_angle.x) > 0x100) { + actor->shape_angle.x -= 0x1000; + } + + cLib_addCalc0(&actor->speedF, 1.0f, 4.0f); + + if(abs(actor->shape_angle.x) < 0x100) { + actor->speedF = cM_rndFX(2.0f) + 15.0f; + i_this->mSph.OnAtSetBit(); + i_this->mSph.OnAtHitBit(); + i_this->m426[0] = 0x14; + actor->current.angle.y = actor->shape_angle.y; + i_this->m442 = fopAcM_searchPlayerAngleY(actor); + i_this->m5D4[0] = actor->current.pos; + i_this->m5EC[0] = actor->current.angle; + + smoke_set(i_this); + + i_this->m448 = 0; + i_this->m420 = 0x24; + } + + break; + case 0x24: + bool temp = false; + if(i_this->mSph.ChkAtHit()) { + fopAc_ac_c* pPlayer = daPy_getPlayerActorClass(); + fopAc_ac_c* pHitActor = i_this->mSph.GetAtHitAc(); + if(pHitActor && pHitActor == pPlayer) { + temp = true; + } + } + if(i_this->mSph.ChkAtShieldHit() || temp) { + if(i_this->m50C != 0x16) { + anm_init(i_this, dRes_INDEX_KB_BCK_RUN1_e, 5.0f, J3DFrameCtrl::EMode_LOOP, 2.0f, dRes_INDEX_KB_BAS_RUN1_e); + } + + actor->current.angle.y = actor->shape_angle.y + 0x8000; + actor->speedF = cM_rndFX(3.0f) + 7.0f; + + if(i_this->mShapeType < 8) { + actor->speed.y = cM_rndFX(5.0f) + 30.0f; + } + + i_this->m4C4 = 30.0f; + i_this->m41E = 3; + i_this->m420 = 0x22; + i_this->m554.end(); + } + else { + if((s16)cLib_distanceAngleS(actor->current.angle.y, i_this->m442) < 0x100) { + i_this->m442 = fopAcM_searchPlayerAngleY(actor) + cM_rndFX(4096.0f); + } + + i_this->m5D4[0] = actor->current.pos; + i_this->m5EC[0] = actor->current.angle; + + cLib_addCalcAngleS2(&actor->shape_angle.y, i_this->m442, 2, 0x2000); + + actor->current.angle.y = actor->shape_angle.y; + + if((i_this->mpMorf->checkFrame(0.0f) || i_this->mpMorf->checkFrame(5.0f)) && i_this->m426[2] == 0) { + if(i_this->mShapeType >= 8) { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_L_NORMAL, 0); + } + else { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_NORMAL, 0); + } + } + + if(i_this->m426[2] == 0 && (s16)cLib_distanceAngleS(actor->current.angle.y, actor->shape_angle.y) > 0x4000) { + if(i_this->mShapeType >= 8) { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_L_TURN, 0); + } + else { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_TURN, 0); + } + + i_this->m426[2] = 0x18; + } + + actor->shape_angle.z = (actor->current.angle.y - actor->shape_angle.y) * 0.5f; + if(actor->shape_angle.z < 0) { + if((int)(u16)actor->shape_angle.z < (u16)-0x1000) { + actor->shape_angle.z = -0x1000; + } + } + else if(actor->shape_angle.z > 0x1000) { + actor->shape_angle.z = 0x1000; + } + } + break; + } + + if(swim_mode_change_check(i_this)) { + actor->shape_angle.x = 0; + actor->speed.y = 0.0f; + actor->gravity = 0.0f; + + if(i_this->m420 == 0x22) { + i_this->mAcch.OffLineCheck(); + } + + ALL_ANGER = false; + + i_this->mSph.ClrAtSet(); + } } /* 0000519C-000054A8 .text money_drop__FP8kb_class */ -void money_drop(kb_class*) { - /* Nonmatching */ +void money_drop(kb_class* i_this) { + /* Nonmatching - regalloc */ + + fopAc_ac_c* actor = &i_this->actor; + + int i = 0; + + static u32 gold_rate_dt[] = { + dItemNo_GREEN_RUPEE_e, dItemNo_BLUE_RUPEE_e, dItemNo_YELLOW_RUPEE_e + }; + static u32 item_rate_dt[] = { + dItemNo_ARROW_10_e, dItemNo_BOMB_5_e, dItemNo_SMALL_MAGIC_e + }; + + csXyz temp = actor->current.angle; + cXyz temp3; + cXyz temp4; + + u8 count = 0; + + i_this->m407 = 0; + + for(i = 0; i < 2; i++) { + f32 rnd = cM_rnd(); + if(REG8_S(4) == 0) { + if(rnd < 0.9f) { + rnd *= 10.0f; + u32 temp2 = gold_rate_dt[(int)(0.3f * rnd)]; + i_this->m407 = 1; + mDoMtx_YrotS(*calc_mtx, cM_rndFX(32768.0f)); + temp3.set(0.0f, 0.0f, 20.0f); + MtxPosition(&temp3, &temp4); + temp4 += actor->current.pos; + + fopAc_ac_c* pItem = (fopAc_ac_c*)fopAcM_fastCreateItem(&temp4, temp2, -1, &temp, &actor->scale, cM_rndF(5.0f), cM_rndF(10.0f) + 20.0f, -3.0f); + if(pItem) { + fopAcM_OnStatus(pItem, fopAcStts_UNK4000_e); + fopAcM_seStart(actor, JA_SE_OBJ_LUPY_OUT, 0); + count += 1; + } + } + } + } + + for(i = 0; i < 2; i++) { + f32 rnd = cM_rnd(); + if(rnd < 0.9f) { + rnd *= 10.0f; + u32 temp2 = item_rate_dt[(int)(0.3f * rnd)]; + i_this->m407 = 1; + mDoMtx_YrotS(*calc_mtx, cM_rndFX(32768.0f)); + temp3.set(0.0f, 0.0f, 20.0f); + MtxPosition(&temp3, &temp4); + temp4 += actor->current.pos; + + fopAc_ac_c* pItem = (fopAc_ac_c*)fopAcM_fastCreateItem(&temp4, temp2, -1, &temp, &actor->scale, cM_rndF(5.0f), cM_rndF(10.0f) + 20.0f, -3.0f); + if(pItem) { + fopAcM_OnStatus(pItem, fopAcStts_UNK4000_e); + + if(count == 0) { + fopAcM_seStart(actor, JA_SE_OBJ_ITEM_OUT, 0); + } + } + } + } } /* 000054A8-00006670 .text esa_demo_move__FP8kb_class */ -void esa_demo_move(kb_class*) { - /* Nonmatching */ +void esa_demo_move(kb_class* i_this) { + /* Nonmatching - regalloc */ + + fopAc_ac_c* actor = &i_this->actor; + + daPy_py_c* pPlayer = daPy_getPlayerActorClass(); + camera_class* pCamera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); + dBgS_LinChk linChk; + + switch(i_this->m420) { + case 0x28: + if(i_this->m50C != 0x18) { + anm_init(i_this, dRes_INDEX_KB_BCK_WALK1_e, 5.0f, J3DFrameCtrl::EMode_LOOP, 1.5f, dRes_INDEX_KB_BAS_WALK1_e); + } + + i_this->mSph.SetCoVsGrp(cCcD_CoSPrm_VsEnemy_e); + fopAcM_OnStatus(actor, fopAcStts_UNK4000_e); + i_this->m420 += 1; + case 0x29: + if(!actor->eventInfo.checkCommandDemoAccrpt()) { + dComIfGp_event_onEventFlag(1); + fopAcM_orderPotentialEvent(actor, dEvtType_OTHER_e, 0xFFFF, 0); + actor->eventInfo.onCondition(dEvtCnd_UNK2_e); + + break; + } + + pPlayer->changeOriginalDemo(); + pPlayer->changeDemoMode(daPy_demo_c::DEMO_N_WAIT_e); + + pCamera->mCamera.Stop(); + pCamera->mCamera.SetTrimSize(2); + + i_this->m426[0] = 200; + i_this->m53C = 50.0f; + i_this->m420 += 1; + case 0x2A: + { + i_this->m520.x = actor->current.pos.x + REG12_F(1); + i_this->m520.y = actor->current.pos.y + 60.0f + REG12_F(2); + i_this->m520.z = actor->current.pos.z + REG12_F(3); + mDoMtx_YrotS(*calc_mtx, REG12_F(4)); + cXyz temp(0.0f, 0.0f, REG12_F(5) + 300.0f); + cXyz temp2; + MtxPosition(&temp, &temp2); + temp2 += i_this->field_0x498; + temp2.y += REG12_F(7) + 300.0f; + linChk.Set(&i_this->m520, &temp2, actor); + if(dComIfG_Bgsp()->LineCross(&linChk)) { + temp.z = -(REG12_F(5) + 300.0f); + MtxPosition(&temp, &temp2); + temp2 += i_this->field_0x498; + temp2.y += REG12_F(7) + 300.0f; + } + + i_this->m514 = temp2; + actor->speedF = REG12_F(9) + 3.0f; + f32 diffX = i_this->field_0x498.x - actor->current.pos.x; + f32 diffZ = i_this->field_0x498.z - actor->current.pos.z; + cLib_addCalcAngleS2(&actor->current.angle.y, (s16)cM_atan2s(diffX, diffZ), 4, 0x800); + actor->shape_angle.y = actor->current.angle.y; + + if(i_this->mAcch.ChkWallHit()) { + i_this->m426[0] = 0; + } + + if(std::sqrtf(diffX * diffX + diffZ * diffZ) < 40.0f) { + actor->speedF = 0.0f; + actor->speed.setall(0.0f); + + anm_init(i_this, dRes_INDEX_KB_BCK_EAT1_e, 5.0f, J3DFrameCtrl::EMode_NONE, 2.0f, dRes_INDEX_KB_BAS_EAT1_e); + + i_this->m44A = 1; + i_this->m420 += 1; + } + else if(i_this->m426[0] == 0) { + i_this->m420 = 0x31; + } + + break; + } + case 0x2B: + if(i_this->mpMorf->isStop()) { + i_this->m44A -= 1; + if(i_this->m44A == 0) { + if(i_this->m4D8 != fpcM_ERROR_PROCESS_ID_e) { + fopAc_ac_c* pEsa = fopAcM_SearchByID(i_this->m4D8); + if(pEsa) { + fopAcM_delete(pEsa); + } + + i_this->m4D8 = fpcM_ERROR_PROCESS_ID_e; + } + + anm_init(i_this, dRes_INDEX_KB_BCK_NAKU1_e, 5.0f, J3DFrameCtrl::EMode_NONE, 1.0f, dRes_INDEX_KB_BAS_NAKU1_e); + + if(i_this->mShapeType >= 8) { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_L_TURN, 0); + } + else { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_TURN, 0); + } + + i_this->m420 +=1; + } + } + + break; + case 0x2C: + i_this->m40A = 0; + + if(i_this->mpMorf->isStop()) { + if(i_this->mAcch.GetGroundH() != -G_CM3D_F_INF) { + if(dComIfG_Bgsp()->GetSpecialCode(i_this->mAcch.m_gnd) == 5) { + if(i_this->mShapeType >= 8) { + anm_init(i_this, dRes_INDEX_KB_BCK_RUN1_e, 5.0f, J3DFrameCtrl::EMode_LOOP, 2.0f, dRes_INDEX_KB_BAS_RUN1_e); + + i_this->m409 = 1; + i_this->m5D4[0] = actor->current.pos; + i_this->m5EC[0] = actor->current.angle; + + smoke_set2(i_this); + + i_this->m5D4[1] = actor->current.pos; + i_this->m5D4[1].y = i_this->mAcch.GetGroundH() + 15.0f; + i_this->m5EC[1] = actor->current.angle; + + smoke_set3(i_this); + + i_this->m420 += 1; + } + else { + i_this->m420 = 0x31; + } + + break; + } + + if(dComIfG_Bgsp()->GetAttributeCode(i_this->mAcch.m_gnd) == dBgS_Attr_DIRT_e || dComIfG_Bgsp()->GetAttributeCode(i_this->mAcch.m_gnd) == dBgS_Attr_GRASS_e || dComIfG_Bgsp()->GetAttributeCode(i_this->mAcch.m_gnd) == dBgS_Attr_SAND_e || dComIfG_Bgsp()->GetAttributeCode(i_this->mAcch.m_gnd) == dBgS_Attr_WATER_e) { + i_this->m5D4[0] = actor->current.pos; + i_this->m5EC[0] = actor->current.angle; + + smoke_set2(i_this); + + i_this->m5D4[1] = actor->current.pos; + i_this->m5D4[1].y = i_this->mAcch.GetGroundH() + 15.0f; + i_this->m5EC[1] = actor->current.angle; + + smoke_set3(i_this); + anm_init(i_this, dRes_INDEX_KB_BCK_RUN1_e, 5.0f, J3DFrameCtrl::EMode_LOOP, 2.0f, dRes_INDEX_KB_BAS_RUN1_e); + + i_this->m420 += 1; + + break; + } + } + + i_this->m420 = 0x31; + } + + break; + case 0x2D: + if(i_this->m40A == 0) { + if(i_this->mShapeType >= 8) { + fopAcM_seStart(actor, JA_SE_CM_PG_L_DIG, 0); + } + else { + fopAcM_seStart(actor, JA_SE_CM_PG_DIG, 0); + } + + i_this->m40A = 1; + } + + i_this->m5D4[0] = actor->current.pos; + i_this->m5EC[0] = actor->current.angle; + i_this->m5D4[1] = actor->current.pos; + i_this->m5D4[1].y = i_this->mAcch.GetGroundH() + 15.0f; + i_this->m5EC[1] = actor->current.angle; + + cLib_addCalcAngleS2(&actor->shape_angle.x, REG12_F(9) + 10000.0f, 1, REG12_F(10) + 300.0f); + cLib_addCalc2(&i_this->m4C0, REG12_F(0xB) + -33.0f, 1.0f, REG12_F(0xC) + 1.0f); + + if(std::abs(i_this->m4C0 - (REG12_F(0xB) + -30.0f)) < 1.0f) { + actor->shape_angle.x = REG12_F(9) + 10000.0f; + i_this->m4C0 = -33.0f; + i_this->m554.end(); + i_this->m574.end(); + + if(i_this->m409 != 0) { + daTagKbItem_c* pItem = search_get_item(i_this); + if(pItem) { + pItem->kb_dig(actor); + + i_this->m407 = 1; + + if(actor->home.angle.z == 1) { + actor->home.angle.z = 0; + i_this->m407 = 0; + + for(int i = 0; i < 10; i++) { + fopAcM_create(fpcNm_KS_e, 0x00000007, &actor->current.pos); + } + } + } + else { + money_drop(i_this); + } + } + else { + money_drop(i_this); + } + + i_this->m426[0] = REG12_F(0xF) + 40.0f; + i_this->m420 += 1; + } + + break; + case 0x2E: + if(i_this->m426[0] == 0x23) { + if(i_this->m407) { + pPlayer->changeDemoMode(daPy_demo_c::DEMO_SMILE_e); + } + else { + pPlayer->changeDemoMode(daPy_demo_c::DEMO_UNK_018_e); + } + } + + if(i_this->m426[0] == 0) { + actor->shape_angle.x = -0x7FFF; + + pPlayer->changeDemoMode(daPy_demo_c::DEMO_N_WAIT_e); + + i_this->m5D4[1] = actor->current.pos; + i_this->m5D4[1].y = i_this->mAcch.GetGroundH() + 15.0f + REG8_F(0x11); + i_this->m5EC[1] = actor->current.angle; + + smoke_set3(i_this); + + actor->speed.y = REG12_F(0xE) + 20.0f; + + if(i_this->mShapeType >= 8) { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_L_CATCH, 0); + } + else { + fopAcM_monsSeStart(actor, JA_SE_CV_PG_CATCH, 0); + } + + i_this->m426[0] = REG12_F(0xF) + 40.0f; + i_this->m420 += 1; + } + + break; + case 0x2F: + i_this->m5D4[1] = actor->current.pos; + i_this->m5D4[1].y = i_this->mAcch.GetGroundH() + 15.0f + REG8_F(0x11); + i_this->m5EC[1] = actor->current.angle; + i_this->m520.x = actor->current.pos.x + REG12_F(1); + i_this->m520.y = actor->current.pos.y + 60.0f + REG12_F(2); + i_this->m520.z = actor->current.pos.z + REG12_F(3); + + cLib_addCalc2(&i_this->m4C0, REG12_F(0xB) + 30.0f, 1.0f, REG12_F(0xC) + 10.0f); + cLib_addCalcAngleS2(&actor->shape_angle.x, 0, 1, 0x1000); + + if(i_this->m426[0] == 0 || (actor->speed.y < 0.0f && i_this->mAcch.GetGroundH() + 10.0f + REG8_F(5) > actor->current.pos.y)) { + i_this->m574.end(); + + if(i_this->mShapeType >= 8) { + dComIfGp_getVibration().StartShock(1, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + fopAcM_seStart(actor, JA_SE_CM_PG_L_JUMP, 0); + } + else { + fopAcM_seStart(actor, JA_SE_CM_PG_DIG_LANDING, 0); + } + + actor->shape_angle.x = 0; + i_this->m4C0 = 30.0f; + actor->speedF = 0.0f; + + anm_init(i_this, dRes_INDEX_KB_BCK_NAKU1_e, 5.0f, J3DFrameCtrl::EMode_NONE, 1.0f, dRes_INDEX_KB_BAS_NAKU1_e); + + i_this->m420 += 1; + } + + break; + case 0x30: + i_this->m520.x = actor->current.pos.x + REG12_F(1); + i_this->m520.y = actor->current.pos.y + 60.0f + REG12_F(2); + i_this->m520.z = actor->current.pos.z + REG12_F(3); + + if(i_this->mpMorf->isStop()) { + i_this->m420 += 1; + } + + break; + case 0x31: + if(i_this->mShapeType >= 8) { + fopAcM_monsSeStart(actor, JA_SE_CM_PG_L_JUMP, 0); + } + + pPlayer->cancelOriginalDemo(); + + pCamera->mCamera.Reset(i_this->m520, i_this->m514); + pCamera->mCamera.Start(); + pCamera->mCamera.SetTrimSize(0); + + dComIfGp_event_reset(); + + fopAcM_OffStatus(actor, fopAcStts_UNK4000_e); + i_this->mSph.SetCoVsGrp(cCcD_CoSPrm_VsGrpAll_e); + + DEMO_START = false; + + i_this->m406 = 0; + i_this->m426[4] = 0x64; + actor->gravity = -3.0f; + i_this->m420 = 2; + i_this->m41E = 0; + + break; + } + + if(i_this->m420 >= 0x2A) { + pCamera->mCamera.Set(i_this->m520, i_this->m514, i_this->m53C, 0); + pPlayer->setPlayerPosAndAngle(&pPlayer->current.pos, fopAcM_searchActorAngleY(pPlayer, actor)); + } } /* 00006670-0000671C .text BG_check__FP8kb_class */ -void BG_check(kb_class*) { - /* Nonmatching */ +void BG_check(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + i_this->mAcchCir.SetWall(i_this->m4D4 * (REG12_F(0x11) + 10.0f) + 25.0f, i_this->m4D4 * 30.0f + 35.0f); + i_this->mAcch.CrrPos(*dComIfG_Bgsp()); + actor->tevStr.mRoomNo = dComIfG_Bgsp()->GetRoomId(i_this->mAcch.m_gnd); + actor->tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(i_this->mAcch.m_gnd); } /* 0000671C-00006E38 .text daKb_Execute__FP8kb_class */ -static BOOL daKb_Execute(kb_class*) { - /* Nonmatching */ +static BOOL daKb_Execute(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + if(REG8_S(1) != 0) { + i_this->m540.setRate(1.0f); + } + + for(int i = 0; i < 8; i++) { + if(i_this->m426[i] != 0) { + i_this->m426[i] -= 1; + } + } + + i_this->m446 += 1; + + switch(i_this->m41E) { + case 0: + pl_attack_hit_check(i_this); + normal_move(i_this); + + if(i_this->m426[7] == 0 && i_this->mAcch.ChkGroundHit()) { + if(i_this->mShapeType < 8 && strcmp(dComIfGp_getStartStageName(), "sea") == 0 && fopAcM_GetRoomNo(actor) == dIsleRoom_OutsetIsland_e) { + if(i_this->mAcch.GetGroundH() != -G_CM3D_F_INF && dComIfG_Bgsp()->GetSpecialCode(i_this->mAcch.m_gnd) == 4) { + u8 temp = 1 << (i_this->mShapeType & 3); + u8 temp2 = dComIfGs_getEventReg(dSv_event_flag_c::UNK_BFFF); + temp2 |= temp; + dComIfGs_setEventReg(dSv_event_flag_c::UNK_BFFF, temp2); + i_this->m405 = temp; + } + else { + i_this->m405 = 0; + } + } + + if(i_this->mShapeType >= 8 && strcmp(dComIfGp_getStartStageName(), "sea") == 0 && fopAcM_GetRoomNo(actor) == dIsleRoom_OutsetIsland_e && i_this->mAcch.GetGroundH() != -G_CM3D_F_INF && dComIfG_Bgsp()->GetSpecialCode(i_this->mAcch.m_gnd) != 4) { + if(i_this->mShapeType >= 8) { + i_this->mStts.SetWeight(100); + } + else { + i_this->mStts.SetWeight(0x32); + } + + dComIfGs_onEventBit(dSv_event_flag_c::UNK_3402); + } + } + + break; + case 1: + carry_move(i_this); + break; + case 2: + swim_move(i_this); + break; + case 3: + attack_move(i_this); + break; + case 4: + esa_demo_move(i_this); + break; + } + + kb_eye_tex_anm(i_this); + + cXyz* ccMoveP = i_this->mStts.GetCCMoveP(); + if(ccMoveP) { + actor->current.pos.x += ccMoveP->x; + actor->current.pos.y += ccMoveP->y; + actor->current.pos.z += ccMoveP->z; + } + + if(i_this->m41E != 3) { + f32 temp = i_this->m4D4 + 1.0f; + if(i_this->m444) { + i_this->m444 -= 1; + + if(i_this->m444 >= 3) { + temp = i_this->m4D4 + 0.5625f; + } + else { + temp = i_this->m4D4 + 1.125f; + } + } + + cLib_addCalc2(&i_this->m4E8.y, temp, 0.5f, 0.5f); + } + + actor->attention_info.position = actor->current.pos; + actor->attention_info.position.y += i_this->m4D4 * 50.0f + 50.0f; + actor->eyePos = actor->attention_info.position; + + cXyz temp = actor->current.pos; + temp.y += i_this->m4D4 * 35.0f + 25.0f; + i_this->mSph.SetC(temp); + i_this->mSph.SetR(i_this->m4D4 * 25.0f + 20.0f); + dComIfG_Ccsp()->Set(&i_this->mSph); + dComIfG_Ccsp()->SetMass(&i_this->mSph, 3); + temp = actor->current.pos; + speed_pos_set(i_this); + BG_check(i_this); + + if(i_this->mAcch.GetGroundH() != -G_CM3D_F_INF) { + s8 roomNo = fopAcM_GetRoomNo(actor); + + u32 mtrlSndId; + if (i_this->mAcch.ChkGroundHit()) { + mtrlSndId = dComIfG_Bgsp()->GetMtrlSndId(i_this->mAcch.m_gnd); + } + else { + mtrlSndId = 0; + } + + i_this->mpMorf->play(&actor->eyePos, mtrlSndId, dComIfGp_getReverb(roomNo)); + } + else { + i_this->mpMorf->play(NULL, 0, 0); + } + + if(i_this->mAcch.ChkGroundHit()) { + fopAcM_getGroundAngle(actor, &i_this->m4F4); + + if(i_this->m450.x == 0.0f && i_this->m450.y == 0.0f && i_this->m450.z == 0.0f) { + i_this->m450 = actor->current.pos; + } + + if(i_this->m41E != 1 && i_this->mAcch.GetGroundH() != -G_CM3D_F_INF) { + i_this->m404 = 0; + + if(dComIfG_Bgsp()->GetAttributeCode(i_this->mAcch.m_gnd) == dBgS_Attr_WATER_e) { + i_this->m404 = 1; + } + } + } + + draw_SUB(i_this); + + if(fopAcM_checkCarryNow(actor)) { + actor->current.pos = temp; + } + + if(i_this->m41E == 3 && i_this->m420 >= 0x24) { + if(actor->speed.y > -20.0f) { + actor->speed.y -= 3.0f; + } + + cXyz temp3 = actor->old.pos - actor->current.pos; + f32 temp2 = temp3.abs(); + if(temp2 < 1.0f) { + i_this->m448 += 1; + if(i_this->m448 > 10) { + ALL_ANGER = false; + cLib_offBit(actor->attention_info.flags, fopAc_Attn_LOCKON_BATTLE_e); + i_this->mSph.OffAtSetBit(); + i_this->m41E = 0; + i_this->m420 = 2; + i_this->m554.end(); + } + } + } + + f32 temp2 = 0.0f; + if(i_this->m426[5] || (0x21 <= i_this->m420 && i_this->m420 <= 0x24)) { + i_this->m44C += (s16)(REG8_F(10) + 1000.0f); + temp2 = 1.0f - (REG8_F(0xB) + 0.5f) * std::abs(cM_ssin(i_this->m44C)); + } + + cLib_addCalc2(&i_this->m4B0, temp2, 1.0f, 0.1f); + + return TRUE; } /* 00006E38-00006E40 .text daKb_IsDelete__FP8kb_class */ -static BOOL daKb_IsDelete(kb_class*) { +static BOOL daKb_IsDelete(kb_class* i_this) { return TRUE; } /* 00006E40-00006F28 .text daKb_Delete__FP8kb_class */ -static BOOL daKb_Delete(kb_class*) { - /* Nonmatching */ +static BOOL daKb_Delete(kb_class* i_this) { + fopAc_ac_c* actor = &i_this->actor; + + dComIfG_resDelete(&i_this->mPhs, "Kb"); + + if(actor->heap) { + i_this->mpMorf->stopZelAnime(); + } + + i_this->m540.end(); + i_this->m554.end(); + i_this->m574.end(); + i_this->m594.end(); + for(int i = 0; i < 2; i++) { + i_this->m5A8[i].end(); + } + + if(i_this->m406) { + DEMO_START = false; + i_this->m406 = 0; + } + + return TRUE; } /* 00006F28-000071F4 .text useHeapInit__FP10fopAc_ac_c */ -static BOOL useHeapInit(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL useHeapInit(fopAc_ac_c* i_actor) { + /* Nonmatching - regalloc */ + kb_class* i_this = reinterpret_cast(i_actor); + + J3DModelData* pModelData; + if(i_this->mShapeType >= 8) { + pModelData = static_cast(dComIfG_getObjectRes("Kb", dRes_INDEX_KB_BDL_PG_BIG_e)); + } + else { + pModelData = static_cast(dComIfG_getObjectRes("Kb", dRes_INDEX_KB_BDL_PG_e)); + } + + i_this->mpMorf = new mDoExt_McaMorf( + pModelData, + NULL, NULL, + static_cast(dComIfG_getObjectRes("Kb", dRes_INDEX_KB_BCK_WAIT1_e)), + J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, 1, + dComIfG_getObjectRes("Kb", dRes_INDEX_KB_BAS_WAIT1_e), + 0x00080000, + 0x11020022 + ); + + J3DModel* pModel; + if(i_this->mpMorf == NULL || (pModel = i_this->mpMorf->getModel()) == NULL) { + return FALSE; + } + + J3DAnmTexPattern* pAnmTexPattern; + for(int i = 0; i < 6; i++) { + pAnmTexPattern = static_cast(dComIfG_getObjectRes("Kb", kb_btp_idx[i])); + pAnmTexPattern->searchUpdateMaterialID(pModel->getModelData()); + } + + u16 materialCount = pAnmTexPattern->getUpdateMaterialNum(); + i_this->mpTexNoAnm = new J3DTexNoAnm[materialCount]; + + if(i_this->mpTexNoAnm == NULL) { + return FALSE; + } + + for(u16 i = 0; i < materialCount; i++) { + i_this->mpTexNoAnm[i].setAnmIndex(i); + } + + u32 temp = i_this->mShapeType & 3; + if(i_this->mShapeType >= 8) { + temp += 3; + } + + tex_anm_set(i_this, temp); + + i_this->mpMaterialTable = (J3DMaterialTable*)dComIfG_getObjectRes("Kb", kb_bmt_idx[temp]); + i_this->mpMorf->getModel()->setUserArea((u32)i_this); + + for (u16 i = 0; i < i_this->mpMorf->getModel()->getModelData()->getJointNum(); i++) { + i_this->mpMorf->getModel()->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack); + } + + return TRUE; } /* 00007258-00007798 .text daKb_Create__FP10fopAc_ac_c */ -static cPhs_State daKb_Create(fopAc_ac_c*) { - /* Nonmatching */ +static cPhs_State daKb_Create(fopAc_ac_c* i_actor) { static dCcD_SrcSph co_sph_src = { // dCcD_SrcGObjInf { @@ -209,6 +2273,151 @@ static cPhs_State daKb_Create(fopAc_ac_c*) { /* Radius */ 15.0f, }}, }; + + fopAcM_ct(i_actor, kb_class); + + kb_class* i_this = (kb_class*)i_actor; + + cPhs_State status = dComIfG_resLoad(&i_this->mPhs, "Kb"); + if(status == cPhs_COMPLEATE_e) { + i_this->mShapeType = (fopAcM_GetParam(i_this) >> 0) & 0xF; + i_this->m401 = (fopAcM_GetParam(i_this) >> 4) & 0xF; + i_this->mbCanBeBigPig = (fopAcM_GetParam(i_this) >> 8); + i_this->m41D = (fopAcM_GetParam(i_this) >> 0x10); + + if(i_this->mShapeType == 0xFF) { + i_this->mShapeType = 0; + } + + if(i_this->m401 == 0xFF) { + i_this->m401 = 0; + } + + i_actor->health = 10; + + if(i_this->m41D != 0xFF) { + i_this->mpPath = dPath_GetRoomPath(i_this->m41D, fopAcM_GetRoomNo(i_actor)); + } + + i_actor->gravity = -3.0f; + + if(i_this->mbCanBeBigPig != 0xFF) { + if(strcmp(dComIfGp_getStartStageName(), "sea") == 0 && fopAcM_GetRoomNo(i_actor) == dIsleRoom_OutsetIsland_e) { + u8 reg = dComIfGs_getEventReg(dSv_event_flag_c::UNK_BFFF); + u8 temp = 1 << (i_this->mShapeType & 3); + + if(REG8_S(8)) { + dComIfGs_setEventReg(dSv_event_flag_c::UNK_BFFF, 0); + REG8_S(8) = 0; + } + + if(REG8_S(9) || dComIfGs_isEventBit(dSv_event_flag_c::UNK_0520)) { + if(i_this->mbCanBeBigPig == 0) { + return cPhs_ERROR_e; + } + + u8 temp4 = reg & 0xFF; + u8 temp3 = reg & 7; + u8 temp2 = i_this->mShapeType & 3; + if(temp3 == 0 || temp3 == 7) { + if(temp2 != 2) { + return cPhs_ERROR_e; + } + } + else if(temp3 == 5 || temp3 == 6) { + if(temp2 != 2) { + return cPhs_ERROR_e; + } + } + else if(temp3 == 3) { + if(temp2 != 0) { + return cPhs_ERROR_e; + } + } + else if((temp4 & temp) == 0) { + return cPhs_ERROR_e; + } + + i_this->m4D4 = 2.0f; + fopAcM_SetParam(i_this, fopAcM_GetParam(i_this) + 8); + i_this->mShapeType += 8; + i_actor->attention_info.distances[fopAc_Attn_TYPE_CARRY_e] = 0x12; + fopAcM_OnStatus(i_actor, fopAcStts_UNK10000_e); + } + else { + if((reg & temp) == 0) { + if(i_this->mbCanBeBigPig == 1) { + return cPhs_ERROR_e; + } + } + else if(i_this->mbCanBeBigPig == 0) { + return cPhs_ERROR_e; + } + } + } + + if(strcmp(dComIfGp_getStartStageName(), "sea") == 0 && fopAcM_GetRoomNo(i_actor) == dIsleRoom_WindfallIsland_e && i_this->m41D != 0xFF && i_this->mpPath) { + s32 point = cM_rndF(i_this->mpPath->m_num); + if(point == 0) { + point = 1; + } + else if(point == i_this->mpPath->m_num) { + point -= 1; + } + i_actor->current.pos = i_this->mpPath->m_points[point].m_position; + i_actor->current.pos.y += 150.0f; + + i_this->m401 = 3; + if(i_this->mbCanBeBigPig == 2) { + i_actor->health = 5; + } + } + } + + i_this->m4CC = i_this->m401 * 100.0f; + if(!i_this->m4CC) { + i_this->m4CC = 300.0f; + } + + i_this->m4E8.setall(i_this->m4D4 + 1.0f); + + if(!fopAcM_entrySolidHeap(i_actor, useHeapInit, 0x3AB4)) { + return cPhs_ERROR_e; + } + + dKy_tevstr_init(&i_this->mTevStr, fopAcM_GetHomeRoomNo(i_actor), 0xFF); + fopAcM_SetMtx(i_actor, i_this->mpMorf->getModel()->getBaseTRMtx()); + i_this->mAcch.Set(&i_actor->current.pos, &i_actor->old.pos, i_actor, 1, &i_this->mAcchCir, &i_actor->speed); + i_this->mAcch.ClrWaterNone(); + i_this->mAcch.SetWaterCheckOffset(300.0f); + i_this->m446 = cM_rndF(10000.0f); + i_this->mStts.Init(0x32, 2, i_actor); + i_this->mSph.Set(co_sph_src); + i_this->mSph.SetStts(&i_this->mStts); + + if(i_this->mShapeType >= 8) { + i_this->mSph.SetAtAtp(0xC); + } + + i_actor->attention_info.flags = fopAc_Attn_LOCKON_MISC_e; + fopAcM_SetModel(i_actor, i_this->mpMorf->getModel()); + + if(i_this->mShapeType >= 8) { + i_this->mStts.SetWeight(0xF0); + } + else { + i_this->mStts.SetWeight(0x32); + } + + i_this->mSph.ClrAtSet(); + i_this->m4C4 = 30.0f; + i_this->m4C0 = 30.0f; + i_this->m426[7] = 5; + BG_check(i_this); + draw_SUB(i_this); + } + + return status; } static actor_method_class l_daKb_Method = { diff --git a/src/d/actor/d_a_npc_people.cpp b/src/d/actor/d_a_npc_people.cpp index 8358940b4..4e98a599e 100644 --- a/src/d/actor/d_a_npc_people.cpp +++ b/src/d/actor/d_a_npc_people.cpp @@ -4495,7 +4495,7 @@ cPhs_State daNpcPeople_c::createInit() { kb_class* pig = (kb_class*)fopAcM_searchFromName("Pig", 0xF00, l_pig_para[i]); if (pig != NULL) { pig->taura_pos_set(current.pos); - pig->current.pos = current.pos; + pig->actor.current.pos = current.pos; } } } @@ -8337,8 +8337,8 @@ BOOL daNpcPeople_c::checkPig() { kb_class* pPig = (kb_class*)fopAcM_searchFromName("Pig", 0xF00, l_pig_para[i]); if(pPig && pPig->m408 == 0) { f32 temp; - dNpc_calc_DisXZ_AngY(current.pos, pPig->current.pos, &temp, NULL); - if(temp < 400.0f && std::abs(current.pos.y - pPig->current.pos.y) <= 10.0f) { + dNpc_calc_DisXZ_AngY(current.pos, pPig->actor.current.pos, &temp, NULL); + if(temp < 400.0f && std::abs(current.pos.y - pPig->actor.current.pos.y) <= 10.0f) { pPig->taura_pos_set(current.pos); mOrderEventNum = 2; mEtcFlag |= 0x80; @@ -8380,7 +8380,7 @@ void daNpcPeople_c::resetPig() { #endif kb_class* pig = (kb_class*)fopAcM_searchFromName("Pig", 0xF00, l_pig_para[i]); if (pig != NULL) { - pig->current.pos = pig->home.pos; + pig->actor.current.pos = pig->actor.home.pos; pig->m408 = 0; } }