Files
tww/src/d/actor/d_a_bk.cpp
T
2023-12-27 23:46:12 -05:00

898 lines
27 KiB
C++

//
// Generated by dtk
// Translation Unit: d_a_bk.cpp
//
#include "d/actor/d_a_bk.h"
#include "f_op/f_op_actor_mng.h"
#include "d/d_procname.h"
#include "d/d_com_inf_game.h"
#include "d/actor/d_a_obj_search.h"
#include "d/actor/d_a_item.h"
#include "d/d_item_data.h"
#include "d/actor/d_a_boko.h"
#include "d/actor/d_a_bomb.h"
#include "d/d_bg_s_lin_chk.h"
#include "m_Do/m_Do_mtx.h"
#include "d/actor/d_a_player.h"
#include "d/d_s_play.h"
#include "d/d_path.h"
static u8 hio_set;
static u8 another_hit;
static u32 ken;
static u8 search_sp;
static bkHIO_c l_bkHIO;
enum BK_RES_FILE_ID { // IDs and indexes are synced
/* BAS */
BK_BAS_BK_AOMUKE=0x8,
BK_BAS_BK_ATTACK1=0x9,
BK_BAS_BK_ATTACK2=0xA,
BK_BAS_BK_ATTACK3=0xB,
BK_BAS_BK_BOKKURI=0xC,
BK_BAS_BK_CATCH=0xD,
BK_BAS_BK_HAKKEN=0xE,
BK_BAS_BK_IATTACK1=0xF,
BK_BAS_BK_JATTACK2=0x10,
BK_BAS_BK_JATTACK3=0x11,
BK_BAS_BK_JUMP1=0x12,
BK_BAS_BK_JUMP2=0x13,
BK_BAS_BK_KERI1=0x14,
BK_BAS_BK_KERI2=0x15,
BK_BAS_BK_KYORO1=0x16,
BK_BAS_BK_KYORO2=0x17,
BK_BAS_BK_NIGERU=0x18,
BK_BAS_BK_NOBI=0x19,
BK_BAS_BK_NOMWAIT=0x1A,
BK_BAS_BK_OKIRUA=0x1B,
BK_BAS_BK_OKIRUU=0x1C,
BK_BAS_BK_OTISOU1=0x1D,
BK_BAS_BK_OTISOU2=0x1E,
BK_BAS_BK_RUN=0x1F,
BK_BAS_BK_SLEEP=0x20,
BK_BAS_BK_SUWARI=0x21,
BK_BAS_BK_TUTUKU1=0x22,
BK_BAS_BK_UTUBUSE=0x23,
BK_BAS_BK_WAIT=0x24,
BK_BAS_BK_WALK=0x25,
BK_BAS_BK_WALK2=0x26,
/* BCK */
BK_BCK_BK_AOMUKE=0x29,
BK_BCK_BK_ATTACK1=0x2A,
BK_BCK_BK_ATTACK2=0x2B,
BK_BCK_BK_ATTACK3=0x2C,
BK_BCK_BK_BIKKURI=0x2D,
BK_BCK_BK_BOUGYO1=0x2E,
BK_BCK_BK_BOUGYO2=0x2F,
BK_BCK_BK_CATCH=0x30,
BK_BCK_BK_HAKKEN=0x31,
BK_BCK_BK_HAKOBI=0x32,
BK_BCK_BK_HIDARIROT=0x33,
BK_BCK_BK_JATTACK1=0x34,
BK_BCK_BK_JATTACK2=0x35,
BK_BCK_BK_JATTACK3=0x36,
BK_BCK_BK_JUMP1=0x37,
BK_BCK_BK_JUMP2=0x38,
BK_BCK_BK_KERI1=0x39,
BK_BCK_BK_KERI2=0x3A,
BK_BCK_BK_KIME=0x3B,
BK_BCK_BK_KOUKA=0x3C,
BK_BCK_BK_KYORO1=0x3D,
BK_BCK_BK_KYORO2=0x3E,
BK_BCK_BK_MIGIROT=0x3F,
BK_BCK_BK_NIGERU=0x40,
BK_BCK_BK_NOBI=0x41,
BK_BCK_BK_NOMWAIT=0x42,
BK_BCK_BK_NOZOKU=0x43,
BK_BCK_BK_OKIRUA=0x44,
BK_BCK_BK_OKIRUU=0x45,
BK_BCK_BK_OTISOU1=0x46,
BK_BCK_BK_OTISOU2=0x47,
BK_BCK_BK_RUN=0x48,
BK_BCK_BK_SLEEP=0x49,
BK_BCK_BK_SUWARI=0x4A,
BK_BCK_BK_TATAKU=0x4B,
BK_BCK_BK_TUTUKU1=0x4C,
BK_BCK_BK_TUTUKU2=0x4D,
BK_BCK_BK_TUTUKU3=0x4E,
BK_BCK_BK_TYAKU=0x4F,
BK_BCK_BK_UTUBUSE=0x50,
BK_BCK_BK_WAIT=0x51,
BK_BCK_BK_WALK=0x52,
BK_BCK_BK_WALK2=0x53,
/* BDLM */
BK_BDL_BK=0x56,
BK_BDL_BOUEN=0x57,
/* BMD */
BK_BMD_BK_KB=0x5A,
BK_BMD_BK_TATE=0x5B,
/* BMT */
BK_BMT_BK_BOKO=0x5E,
BK_BMT_BK_KEN=0x5F,
BK_BMT_GREEN=0x60,
BK_BMT_PINK=0x61,
/* BTP */
BK_BTP_TMABATAKI=0x64,
};
/* 000000EC-00000234 .text anm_init__FP8bk_classifUcfi */
static void anm_init(bk_class* i_this, int bckFileIdx, f32 morf, u8 loopMode, f32 speed, int soundFileIdx) {
if (i_this->mDamageReaction.mState == 0x13 && bckFileIdx != BK_BCK_BK_OTISOU1 && bckFileIdx != BK_BCK_BK_OTISOU2) {
return;
}
if (soundFileIdx >= 0) {
void* soundAnm = dComIfG_getObjectRes("Bk", soundFileIdx);
J3DAnmTransform* bckAnm = (J3DAnmTransform*)dComIfG_getObjectRes("Bk", bckFileIdx);
i_this->mpMorf->setAnm(bckAnm, loopMode, morf, speed, 0.0f, -1.0f, soundAnm);
} else {
J3DAnmTransform* bckAnm = (J3DAnmTransform*)dComIfG_getObjectRes("Bk", bckFileIdx);
i_this->mpMorf->setAnm(bckAnm, loopMode, morf, speed, 0.0f, -1.0f, NULL);
}
}
/* 00000234-000005A8 .text yari_off_check__FP8bk_class */
static void yari_off_check(bk_class* i_this) {
if (i_this->m0B34 == 0) {
return;
}
daBoko_c* boko = (daBoko_c*)fopAcM_SearchByID(i_this->m1200);
if (boko) {
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
fopAcM_cancelCarryNow(boko);
if (i_this->m0B34 != 2) {
boko->setRotAngleSpeed(cM_rndFX(2000.0f));
s16 angleY = i_this->shape_angle.y + 0x8000 + (s16)cM_rndFX(8000.0f);
f32 speedY = 20.0f + cM_rndF(20.0f);
f32 speedForward = 20.0f + cM_rndF(10.0f);
boko->moveStateInit(speedForward, speedY, angleY);
}
boko->current.angle.y = player->shape_angle.y;
dBgS_LinChk linChk;
linChk.Set(&i_this->mEyePos, &boko->current.pos, i_this);
if (dComIfG_Bgsp()->LineCross(&linChk)) {
MtxP mtx = i_this->mpMorf->getModel()->getAnmMtx(0x10); // mune (chest) joint
cMtx_copy(mtx, *calc_mtx);
boko->setMatrix(*calc_mtx);
cXyz offset;
offset.set(0.0f, 0.0f, 0.0f);
MtxPosition(&offset, &boko->current.pos);
}
}
i_this->m121F = 1;
i_this->m0B34 = 0;
i_this->m0B30 = 0;
}
/* 00000A1C-00000EE8 .text smoke_set_s__FP8bk_classf */
static void smoke_set_s(bk_class* i_this, f32 rate) {
dBgS_LinChk linChk;
s32 attribCode;
attribCode = 0;
cXyz startPos = i_this->m0338;
startPos.y += 100.0f;
cXyz endPos = i_this->m0338;
endPos.y -= 100.0f;
linChk.Set(&startPos, &endPos, i_this);
dBgS* bgs = dComIfG_Bgsp(); // Fakematch? fixes regalloc
if (bgs->LineCross(&linChk)) {
endPos = linChk.GetCross();
i_this->m0338.y = endPos.y;
attribCode = bgs->GetAttributeCode(linChk);
} else {
i_this->m0338.y -= 20000.0f;
}
if (i_this->m034F != 0 && attribCode != dBgS_Attr_GRASS_e) {
return;
}
i_this->m034F++;
switch (attribCode) {
case dBgS_Attr_NORMAL_e:
case dBgS_Attr_DIRT_e:
case dBgS_Attr_WOOD_e:
case dBgS_Attr_STONE_e:
case dBgS_Attr_SAND_e:
i_this->m0350.end();
JPABaseEmitter* emitter1 = dComIfGp_particle_setToon(
0x2022, &i_this->m0338, &i_this->m0344, NULL, 0xB9,
&i_this->m0350, fopAcM_GetRoomNo(i_this)
);
if (emitter1) {
emitter1->setRate(rate);
emitter1->setSpread(1.0f);
JGeometry::TVec3<f32> scale;
scale.x = scale.y = scale.z = 1.2f;
emitter1->setGlobalScale(scale);
scale.x = scale.y = scale.z = 1.5f + g_regHIO.mChild[0].mFloatRegs[16];
emitter1->setGlobalParticleScale(scale);
}
break;
case dBgS_Attr_GRASS_e:
JPABaseEmitter* emitter2 = dComIfGp_particle_set(0x24, &i_this->m0338, &i_this->m0344);
if (emitter2) {
emitter2->setRate(rate * 0.5f);
emitter2->setMaxFrame(3);
}
break;
}
}
/* 00000EE8-000011F0 .text ground_smoke_set__FP8bk_class */
static void ground_smoke_set(bk_class* i_this) {
/* Nonmatching */
}
/* 000011F0-00001454 .text nodeCallBack__FP7J3DNodei */
static BOOL nodeCallBack(J3DNode*, int) {
/* Nonmatching */
}
/* 00001454-00001564 .text nodeCallBack_P__FP7J3DNodei */
static BOOL nodeCallBack_P(J3DNode*, int) {
/* Nonmatching */
}
/* 00001564-000019A4 .text search_check_draw__FP8bk_class */
static void search_check_draw(bk_class* i_this) {
/* Nonmatching */
}
/* 000019A8-00001B88 .text br_draw__FP8bk_class */
static void br_draw(bk_class* i_this) {
/* Nonmatching */
}
/* 00001B88-00001CD0 .text daBk_shadowDraw__FP8bk_class */
static BOOL daBk_shadowDraw(bk_class* i_this) {
/* Nonmatching - regalloc */
J3DModel* model = i_this->mpMorf->getModel();
if (!fopAcM_checkCarryNow(i_this)) {
cXyz shadowPos(
i_this->current.pos.x,
i_this->current.pos.y + 150.0f + g_regHIO.mChild[8].mFloatRegs[18],
i_this->current.pos.z
);
f32 temp = 800.0f + g_regHIO.mChild[8].mFloatRegs[19];
f32 shadowSize = 40.0f + g_regHIO.mChild[8].mFloatRegs[17];
i_this->mShadowId = dComIfGd_setShadow(
i_this->mShadowId, 1, model, &shadowPos, temp, shadowSize,
i_this->current.pos.y, i_this->mDamageReaction.mAcch.GetGroundH(),
i_this->mDamageReaction.mAcch.m_gnd, &i_this->mTevStr,
0, 1.0f, dDlst_shadowControl_c::getSimpleTex()
);
}
if (i_this->mShadowId) {
daBoko_c* boko = (daBoko_c*)fopAcM_SearchByID(i_this->m1200);
if (boko) {
dComIfGd_addRealShadow(i_this->mShadowId, boko->model);
}
if (i_this->m02D4) {
dComIfGd_addRealShadow(i_this->mShadowId, i_this->m02D0);
}
if (i_this->m02DC) {
dComIfGd_addRealShadow(i_this->mShadowId, i_this->m02D8);
}
}
}
/* 00001CD0-00001F60 .text daBk_Draw__FP8bk_class */
static BOOL daBk_Draw(bk_class* i_this) {
/* Nonmatching */
}
/* 00001F60-00002404 .text way_pos_check__FP8bk_classP4cXyz */
static void way_pos_check(bk_class* i_this, cXyz*) {
/* Nonmatching */
}
/* 0000259C-00002864 .text ground_4_check__FP8bk_classisf */
static void ground_4_check(bk_class* i_this, int, s16, f32) {
/* Nonmatching */
}
/* 00002864-00002C4C .text daBk_other_bg_check__FP8bk_classP10fopAc_ac_c */
static void daBk_other_bg_check(bk_class* i_this, fopAc_ac_c*) {
/* Nonmatching */
}
static fopAc_ac_c* target_info[10];
static s32 target_info_count;
/* 00002C4C-00002CD4 .text s_w_sub__FPvPv */
static void* s_w_sub(void* param_1, void*) {
if (fopAc_IsActor(param_1) && fopAcM_GetName(param_1) == PROC_BOKO) {
daBoko_c* boko = (daBoko_c*)param_1;
// TODO: enum for boko type
if (fopAcM_GetParam(boko) != 4 && !fopAcM_checkCarryNow(boko)) {
if (target_info_count < (s32)ARRAY_SIZE(target_info)) {
target_info[target_info_count] = boko;
target_info_count++;
}
}
}
return NULL;
}
/* 00002CD4-00002FB0 .text search_wepon__FP8bk_class */
static u32 search_wepon(bk_class* i_this) {
/* Nonmatching */
}
/* 00002FB0-0000302C .text s_b_sub__FPvPv */
static void* s_b_sub(void* param_1, void*) {
if (fopAc_IsActor(param_1) && fopAcM_GetName(param_1) == PROC_BOMB) {
daBomb_c* bomb = (daBomb_c*)param_1;
// TODO: why is it checking the bomb's params as a single field instead of just one param? bug?
if (fopAcM_GetParam(bomb) != 0) {
if (target_info_count < (s32)ARRAY_SIZE(target_info)) {
target_info[target_info_count] = bomb;
target_info_count++;
}
}
}
return NULL;
}
/* 0000302C-000033BC .text search_bomb__FP8bk_classi */
static fopAc_ac_c* search_bomb(bk_class* i_this, int) {
/* Nonmatching */
}
/* 000033BC-00003438 .text daBk_wepon_view_check__FP8bk_class */
static BOOL daBk_wepon_view_check(bk_class* i_this) {
if (i_this->m02CC != 0) {
return FALSE;
}
i_this->m1200 = search_wepon(i_this);
if (i_this->m1200 != fpcM_ERROR_PROCESS_ID_e) {
if (fopAcM_SearchByID(i_this->m1200)) {
return TRUE;
}
}
return FALSE;
}
/* 00003438-00003478 .text daBk_bomb_view_check__FP8bk_class */
static BOOL daBk_bomb_view_check(bk_class* i_this) {
i_this->m11F8 = search_bomb(i_this, 1);
return i_this->m11F8 != NULL ? TRUE : FALSE;
}
/* 00003478-000034B8 .text daBk_bomb_check__FP8bk_class */
static BOOL daBk_bomb_check(bk_class* i_this) {
i_this->m11F8 = search_bomb(i_this, 0);
if (i_this->m11F8) {
return TRUE;
}
return FALSE;
}
/* 000034B8-0000385C .text daBk_player_bg_check__FP8bk_classP4cXyz */
static void daBk_player_bg_check(bk_class* i_this, cXyz*) {
/* Nonmatching */
}
/* 0000385C-00003A18 .text daBk_player_view_check__FP8bk_classP4cXyzss */
static void daBk_player_view_check(bk_class* i_this, cXyz*, s16, s16) {
/* Nonmatching */
}
/* 00003A18-00003A5C .text daBk_player_way_check__FP8bk_class */
static BOOL daBk_player_way_check(bk_class* i_this) {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
s16 angleDiff = i_this->current.angle.y - player->shape_angle.y;
if (angleDiff < 0) {
angleDiff = -angleDiff;
}
if ((u16)angleDiff < 0x4000) {
return FALSE;
}
return TRUE;
}
/* 00003A5C-00003B2C .text wait_set__FP8bk_class */
static void wait_set(bk_class* i_this) {
/* Nonmatching */
}
/* 00003B2C-00003C34 .text walk_set__FP8bk_class */
static void walk_set(bk_class* i_this) {
/* Nonmatching */
}
/* 00003C34-00003C74 .text fight_run_set__FP8bk_class */
static void fight_run_set(bk_class* i_this) {
anm_init(i_this, BK_BCK_BK_RUN, 10.0f, J3DFrameCtrl::LOOP_REPEAT_e, l_bkHIO.m070, BK_BAS_BK_RUN);
}
/* 00003C74-00004104 .text path_check__FP8bk_classUc */
static void path_check(bk_class* i_this, u8) {
/* Nonmatching */
}
/* 00004104-0000488C .text jyunkai__FP8bk_class */
static void jyunkai(bk_class* i_this) {
/* Nonmatching */
}
/* 0000488C-000048E4 .text ken_s_sub__FPvPv */
static void* ken_s_sub(void* param_1, void*) {
if (fopAc_IsActor(param_1) && fopAcM_GetName(param_1) == PROC_ITEM) {
daItem_c* item = (daItem_c*)param_1;
if (item->getItemNo() == DROPPED_SWORD) {
return param_1;
}
}
return NULL;
}
/* 000048E4-000053E0 .text stand__FP8bk_class */
static void stand(bk_class* i_this) {
/* Nonmatching */
}
/* 000053E0-000054E0 .text s_s_sub__FPvPv */
static void s_s_sub(void*, void*) {
/* Nonmatching */
}
/* 000054E0-00005D40 .text stand2__FP8bk_class */
static void stand2(bk_class* i_this) {
/* Nonmatching */
}
/* 00005D40-00006218 .text path_run__FP8bk_class */
static void path_run(bk_class* i_this) {
/* Nonmatching */
}
/* 00006218-0000647C .text attack_set__FP8bk_classUc */
static void attack_set(bk_class* i_this, u8) {
/* Nonmatching */
}
u16 learn_check;
/* 0000647C-000064D8 .text shot_s_sub__FPvPv */
static void* shot_s_sub(void* param_1, void*) {
if (fopAc_IsActor(param_1) && learn_check & 0x400 && fopAcM_GetName(param_1) == PROC_HIMO2) {
return param_1;
}
return NULL;
}
/* 000064D8-000073B8 .text fight_run__FP8bk_class */
static void fight_run(bk_class* i_this) {
/* Nonmatching */
}
/* 000073B8-000075E8 .text yari_hit_check__FP8bk_class */
static void yari_hit_check(bk_class* i_this) {
/* Nonmatching */
}
/* 000075E8-00007EF4 .text fight__FP8bk_class */
static void fight(bk_class* i_this) {
/* Nonmatching */
}
/* 00007EF4-00008108 .text p_lost__FP8bk_class */
static void p_lost(bk_class* i_this) {
/* Nonmatching */
}
/* 00008108-00008470 .text b_nige__FP8bk_class */
static void b_nige(bk_class* i_this) {
/* Nonmatching */
}
/* 00008470-00008580 .text defence__FP8bk_class */
static void defence(bk_class* i_this) {
/* Nonmatching */
}
/* 00008580-00008654 .text oshi__FP8bk_class */
static void oshi(bk_class* i_this) {
/* Nonmatching */
}
/* 00008654-00008C38 .text hukki__FP8bk_class */
static void hukki(bk_class* i_this) {
/* Nonmatching */
}
/* 00008C38-00008D1C .text aite_miru__FP8bk_class */
static void aite_miru(bk_class* i_this) {
/* Nonmatching */
}
/* 00008D1C-00008ECC .text fail__FP8bk_class */
static void fail(bk_class* i_this) {
/* Nonmatching */
}
/* 00008ECC-000090E0 .text yogan_fail__FP8bk_class */
static void yogan_fail(bk_class* i_this) {
/* Nonmatching */
}
/* 000090E0-0000924C .text water_fail__FP8bk_class */
static void water_fail(bk_class* i_this) {
/* Nonmatching */
}
/* 0000924C-00009944 .text wepon_search__FP8bk_class */
static void wepon_search(bk_class* i_this) {
/* Nonmatching */
}
/* 00009944-00009AFC .text d_dozou__FP8bk_class */
static void d_dozou(bk_class* i_this) {
/* Nonmatching */
}
/* 00009AFC-00009B0C .text carry__FP8bk_class */
static void carry(bk_class* i_this) {
i_this->speed.y = 0.0f;
}
/* 00009B0C-00009DF0 .text carry_drop__FP8bk_class */
static void carry_drop(bk_class* i_this) {
/* Nonmatching */
}
/* 00009DF0-00009F1C .text d_mahi__FP8bk_class */
static void d_mahi(bk_class* i_this) {
/* Nonmatching */
}
/* 00009F1C-0000A350 .text tubo_wait__FP8bk_class */
static void tubo_wait(bk_class* i_this) {
/* Nonmatching */
}
/* 0000A350-0000A630 .text z_demo_1__FP8bk_class */
static void z_demo_1(bk_class* i_this) {
/* Nonmatching */
}
/* 0000A630-0000A9BC .text b_hang__FP8bk_class */
static void b_hang(bk_class* i_this) {
/* Nonmatching */
}
/* 0000A9BC-0000AC6C .text rope_on__FP8bk_class */
static void rope_on(bk_class* i_this) {
/* Nonmatching */
}
/* 0000AC6C-0000AC84 .text search_target__FP8bk_class */
static BOOL search_target(bk_class* i_this) {
i_this->mDamageReaction.m714 = dComIfGp_getPlayer(0);
return FALSE;
}
/* 0000AC84-0000B25C .text Bk_move__FP8bk_class */
static void Bk_move(bk_class* i_this) {
/* Nonmatching */
}
/* 0000B25C-0000B324 .text bk_eye_tex_anm__FP8bk_class */
static void bk_eye_tex_anm(bk_class* i_this) {
/* Nonmatching */
}
/* 0000B324-0000BC98 .text damage_check__FP8bk_class */
static void damage_check(bk_class* i_this) {
/* Nonmatching */
}
/* 0000BCD4-0000BD30 .text s_s2_sub__FPvPv */
static void* s_s2_sub(void* param_1, void*) {
if (fopAc_IsActor(param_1) && fopAcM_GetName(param_1) == PROC_OBJ_SEARCH) {
if (daObj_Search::Act_c::getFindFlag()) {
return param_1;
}
}
return NULL;
}
/* 0000BD30-0000C2D0 .text waki_set__FP8bk_class */
static void waki_set(bk_class* i_this) {
/* Nonmatching */
}
/* 0000C2D0-0000CC68 .text demo_camera__FP8bk_class */
static void demo_camera(bk_class* i_this) {
/* Nonmatching */
}
/* 0000CC68-0000CD00 .text tate_mtx_set__FP8bk_class */
static void tate_mtx_set(bk_class* i_this) {
/* Nonmatching */
}
/* 0000CD00-0000CE18 .text bou_mtx_set__FP8bk_class */
static void bou_mtx_set(bk_class* i_this) {
/* Nonmatching */
}
/* 0000CE18-0000DD1C .text daBk_Execute__FP8bk_class */
static BOOL daBk_Execute(bk_class* i_this) {
/* Nonmatching */
}
/* 0000DD1C-0000DD24 .text daBk_IsDelete__FP8bk_class */
static BOOL daBk_IsDelete(bk_class* i_this) {
return TRUE;
}
/* 0000DD24-0000DDD8 .text daBk_Delete__FP8bk_class */
static BOOL daBk_Delete(bk_class* i_this) {
dComIfG_resDelete(&i_this->mPhs, "Bk");
if (i_this->heap) {
i_this->mpMorf->stopZelAnime();
}
if (i_this->m121D) {
hio_set = 0;
mDoHIO_root.mDoHIO_deleteChild(l_bkHIO.mChildID);
}
i_this->m0350.end();
i_this->mDamageReaction.mParticleCallBack.end();
enemy_fire_remove(&i_this->mEnemyFire);
return TRUE;
}
/* 0000DDD8-0000E2C8 .text useHeapInit__FP10fopAc_ac_c */
static BOOL useHeapInit(fopAc_ac_c* i_this) {
/* Nonmatching */
}
/* 0000E310-0000EA2C .text daBk_Create__FP10fopAc_ac_c */
static s32 daBk_Create(fopAc_ac_c* i_actor) {
/* Nonmatching - data */
fopAcM_SetupActor(i_actor, bk_class);
bk_class* i_this = (bk_class*)i_actor;
s32 phase_state = dComIfG_resLoad(&i_this->mPhs, "Bk");
if (phase_state == cPhs_COMPLEATE_e) {
i_this->mGbaName = 1;
if (strcmp(dComIfGp_getStartStageName(), "ITest63") == 0 ||
strcmp(dComIfGp_getStartStageName(), "GanonJ") == 0)
{
search_sp = 1;
} else {
search_sp = 0;
}
i_this->mType = fopAcM_GetParam(i_this) & 0xF;
i_this->m02B9 = fopAcM_GetParam(i_this) & 0x10;
i_this->m02D4 = fopAcM_GetParam(i_this) & 0x20;
if (i_this->mType == 0xB) {
i_this->m02D4 = 0;
i_this->m02DC = 1;
i_this->mType = 4;
}
i_this->m02D5 = fopAcM_GetParam(i_this) & 0xC0;
i_this->m02B5 = fopAcM_GetParam(i_this) >> 8 & 0xFF;
i_this->m02B6 = fopAcM_GetParam(i_this) >> 16 & 0xFF;
i_this->m02B7 = fopAcM_GetParam(i_this) >> 24 & 0xFF;
i_this->m02B8 = i_this->current.angle.z;
i_this->current.angle.z = 0;
i_this->current.angle.x = 0;
if (i_this->m02B8 == 0xFF) {
i_this->m02B8 = 0;
}
if (i_this->m02B8 != 0) {
if (dComIfGs_isSwitch(i_this->m02B8, fopAcM_GetRoomNo(i_this))) {
return cPhs_ERROR_e;
}
}
if (i_this->m02B9 != 0) {
if (dComIfGs_isSwitch(i_this->m02B7, fopAcM_GetRoomNo(i_this))) {
return cPhs_ERROR_e;
}
i_this->m02B7 = 0xFF;
}
i_this->mItemTableIdx = dComIfGp_CharTbl()->GetNameIndex("Bk", 0);
if (!fopAcM_entrySolidHeap(i_this, useHeapInit, 0x17B20)) {
return cPhs_ERROR_e;
}
if (!hio_set) {
l_bkHIO.mChildID = mDoHIO_root.mDoHIO_createChild("ボコちゃん", &l_bkHIO);
i_this->m121D = 1;
hio_set = 1;
}
ken = 0;
if (!i_this->mpMorf || !i_this->mpMorf->getModel()) {
return cPhs_ERROR_e;
}
fopAcM_SetMin(i_this, -200.0f, -50.0f, -100.0f);
fopAcM_SetMax(i_this, 125.0f, 250.0f, 250.0f);
fopAcM_SetMtx(i_this, i_this->mpMorf->getModel()->getBaseTRMtx());
i_this->mpMorf->getModel()->setUserArea((u32)i_this);
i_this->initBt(162.5f, 125.0f);
i_this->mDamageReaction.m70C = 1;
i_this->mDamageReaction.mSpawnY = i_this->current.pos.y;
i_this->mDamageReaction.mMaxFallDistance = 1000.0f;
if (i_this->m02B6 != 0xFF) {
i_this->m1218 = dPath_GetRoomPath(i_this->m02B6, fopAcM_GetRoomNo(i_this));
if (i_this->m1218 == NULL) {
return cPhs_ERROR_e;
}
i_this->m1215 = i_this->m02B6 + 1;
i_this->m1217 = 1;
}
if (i_this->mType == 4 || i_this->mType == 0xA) {
i_this->mDamageReaction.mState = 1;
if (i_this->mType == 0xA) {
i_this->mDamageReaction.m004 = -0x14;
fopAcM_OnStatus(i_this, fopAcStts_BOSS_e);
} else {
i_this->mDamageReaction.m004 = -1;
}
i_this->m0302 = 1000.0f + cM_rndF(1000.0f);
} else if (i_this->mType == 6) {
i_this->mDamageReaction.mState = 2;
i_this->mDamageReaction.mMaxFallDistance = 300.0f;
} else if (i_this->mType == 7) {
i_this->mDamageReaction.mState = 0x1D;
i_this->mDamageReaction.mMaxFallDistance = 300.0f;
} else if (i_this->mType == 5) {
anm_init(i_this, BK_BCK_BK_HAKOBI, 1.0f, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, -1);
i_this->mDamageReaction.mState = 0x1E;
i_this->mDamageReaction.mMaxFallDistance = 100000.0f;
} else if (i_this->mType == 2 || i_this->mType == 3) {
i_this->m02BA = 0xFF;
i_this->mDamageReaction.mState = 0xF;
i_this->m030E = 0xA;
} else if (i_this->mType == 9) {
i_this->mDamageReaction.mState = 3;
i_this->m1216 = i_this->current.angle.z;
i_this->m1217 = i_this->current.angle.y;
i_this->current.angle.z = 0;
i_this->current.angle.y = 0;
}
if (i_this->m02B7 != 0xFF) {
if (i_this->mType != 6) {
i_this->m02BA = i_this->m02B7 + 1;
}
}
if (i_this->mType == 0xF) {
i_this->mDamageReaction.mState = 0x17;
i_this->m02BA = 0;
}
if (i_this->mType != 8 && i_this->m02DC == 0 &&
strcmp(dComIfGp_getStartStageName(), "A_mori") != 0)
{
u32 weaponType; // TODO enum
if (i_this->m02D5 & 0x40) {
weaponType = 1;
} else if (i_this->m02D5 & 0x80) {
weaponType = 7;
} else {
weaponType = 0;
}
i_this->m1200 = fopAcM_create(PROC_BOKO, weaponType, &i_this->current.pos, fopAcM_GetRoomNo(i_this));
i_this->m1214 = 1;
i_this->m02D5 &= 0x40;
} else {
i_this->m11F3 = 1;
}
i_this->mDamageReaction.mAcch.Set(
&fopAcM_GetPosition_p(i_this), &fopAcM_GetOldPosition_p(i_this),
i_this, 1, &i_this->mDamageReaction.mAcchCir,
&fopAcM_GetSpeed_p(i_this)
);
i_this->mDamageReaction.mAcchCir.SetWall(40.0f, 40.0f);
i_this->mDamageReaction.mAcch.ClrRoofNone();
i_this->mDamageReaction.mAcch.SetRoofCrrHeight(80.0f + g_regHIO.mChild[0].mFloatRegs[7]);
i_this->mDamageReaction.mAcch.OnLineCheck();
i_this->mDamageReaction.mInvincibleTimer = 5;
if (i_this->m02D4 != 0) {
i_this->mMaxHealth = i_this->mHealth = 7;
} else {
i_this->mMaxHealth = i_this->mHealth = 5;
}
i_this->mDamageReaction.mStts.Init(0xC8, 0xFF, i_this);
static dCcD_SrcCyl co_cyl_src = {}; // TODO
i_this->m0B88.Set(co_cyl_src);
i_this->m0B88.SetStts(&i_this->mDamageReaction.mStts);
static dCcD_SrcCyl tg_cyl_src = {}; // TODO
i_this->m0CB8.Set(tg_cyl_src);
i_this->m0CB8.SetStts(&i_this->mDamageReaction.mStts);
static dCcD_SrcSph head_sph_src = {}; // TODO
i_this->m0DE8.Set(head_sph_src);
i_this->m0DE8.SetStts(&i_this->mDamageReaction.mStts);
static dCcD_SrcSph wepon_sph_src = {}; // TODO
i_this->m1040.Set(wepon_sph_src);
i_this->m1040.SetStts(&i_this->mDamageReaction.mStts);
static dCcD_SrcSph defence_sph_src = {}; // TODO
i_this->m0F14.Set(defence_sph_src);
i_this->m0F14.SetStts(&i_this->mDamageReaction.mStts);
i_this->m02CC = 5;
i_this->model = i_this->mpMorf->getModel();
i_this->mEnemyIce.mpActor = i_this;
i_this->mEnemyIce.mWallRadius = 50.0f + g_regHIO.mChild[0].mFloatRegs[4];
i_this->mEnemyIce.mCylHeight = 180.0f + g_regHIO.mChild[0].mFloatRegs[5];
i_this->mEnemyIce.mDeathSwitch = i_this->m02B8;
i_this->mEnemyFire.mpMcaMorf = i_this->mpMorf;
i_this->mEnemyFire.mpActor = i_this;
static u8 fire_j[10] = {
// TODO
};
static f32 fire_sc[10] = {
// TODO
};
for (int i = 0; i < ARRAY_SIZE(i_this->mEnemyFire.mFlameJntIdxs); i++) {
i_this->mEnemyFire.mFlameJntIdxs[i] = fire_j[i];
i_this->mEnemyFire.mParticleScale[i] = fire_sc[i];
}
i_this->mItemStealLeft = 3;
daBk_Execute(i_this);
}
return phase_state;
}
static actor_method_class l_daBk_Method = {
(process_method_func)daBk_Create,
(process_method_func)daBk_Delete,
(process_method_func)daBk_Execute,
(process_method_func)daBk_IsDelete,
(process_method_func)daBk_Draw,
};
actor_process_profile_definition g_profile_BK = {
/* LayerID */ fpcLy_CURRENT_e,
/* ListID */ 7,
/* ListPrio */ fpcPi_CURRENT_e,
/* ProcName */ PROC_BK,
/* Proc SubMtd */ &g_fpcLf_Method.mBase,
/* Size */ sizeof(bk_class),
/* SizeOther */ 0,
/* Parameters */ 0,
/* Leaf SubMtd */ &g_fopAc_Method.base,
/* Priority */ 0x00B0,
/* Actor SubMtd */ &l_daBk_Method,
/* Status */ fopAcStts_CULL_e | fopAcStts_UNK40000_e | fopAcStts_UNK80000_e,
/* Group */ fopAc_ENEMY_e,
/* CullType */ fopAc_CULLBOX_CUSTOM_e,
};