mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-05-29 16:14:54 -04:00
a6e76c0841
* some wii OS fixes * remove old dol2asm comments * remove dol2asm.h * remove function address comments * normalize ATTRIBUTE_ALIGN usage * DECL_WEAK macro * fix gcc attribute weak macro * wrap more mwcc specific things in ifdefs * fixes * fix revo sdk version flags * fixes
411 lines
13 KiB
C++
411 lines
13 KiB
C++
/**
|
|
* @file d_a_obj_rw.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
|
|
#include "d/actor/d_a_obj_rw.h"
|
|
#include "d/actor/d_a_player.h"
|
|
#include "d/d_a_obj.h"
|
|
#include "d/d_s_play.h"
|
|
|
|
class daOBJ_RW_HIO_c : public JORReflexible {
|
|
public:
|
|
daOBJ_RW_HIO_c();
|
|
virtual ~daOBJ_RW_HIO_c() {}
|
|
|
|
void genMessage(JORMContext*);
|
|
|
|
/* 0x4 */ s8 id;
|
|
/* 0x8 */ f32 base_size;
|
|
/* 0xC */ u8 unk_0xC[0x14 - 0xC];
|
|
};
|
|
|
|
daOBJ_RW_HIO_c::daOBJ_RW_HIO_c() {
|
|
id = -1;
|
|
base_size = 1.0f;
|
|
}
|
|
|
|
static int nodeCallBack(J3DJoint* i_joint, int param_1) {
|
|
if (param_1 == 0) {
|
|
int jnt_no = i_joint->getJntNo();
|
|
J3DModel* model = j3dSys.getModel();
|
|
obj_rw_class* i_this = (obj_rw_class*)model->getUserArea();
|
|
|
|
if (i_this != NULL) {
|
|
if (jnt_no == 1) {
|
|
MTXCopy(model->getAnmMtx(jnt_no), *calc_mtx);
|
|
cMtx_YrotM(*calc_mtx, i_this->field_0x670);
|
|
model->setAnmMtx(jnt_no, *calc_mtx);
|
|
MTXCopy(*calc_mtx, J3DSys::mCurrentMtx);
|
|
}
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
static int daOBJ_RW_Draw(obj_rw_class* i_this) {
|
|
fopAc_ac_c* actor = &i_this->enemy;
|
|
|
|
g_env_light.settingTevStruct(0, &actor->current.pos, &actor->tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(i_this->model, &actor->tevStr);
|
|
|
|
J3DShape* shape = i_this->model->getModelData()->getMaterialNodePointer(0)->getShape();
|
|
if (shape != NULL) {
|
|
if (i_this->field_0xe38 != 0) {
|
|
shape->hide();
|
|
} else {
|
|
shape->show();
|
|
}
|
|
}
|
|
|
|
mDoExt_modelUpdateDL(i_this->model);
|
|
|
|
cXyz sp8;
|
|
sp8.set(actor->current.pos.x, 100.0f + actor->current.pos.y + BREG_F(18), actor->current.pos.z);
|
|
if (fopAcM_gc_c::gndCheck(&sp8)) {
|
|
i_this->shadowId = dComIfGd_setShadow(i_this->shadowId, 1, i_this->model, &sp8, 1500.0f, 0.0f, actor->current.pos.y, actor->current.pos.y, *fopAcM_gc_c::getGroundCheck(), &actor->tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex());
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
static void damage_check(obj_rw_class* i_this) {
|
|
fopAc_ac_c* actor = &i_this->enemy;
|
|
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
|
|
|
|
i_this->ccStts.Move();
|
|
|
|
if (i_this->invulnerability_timer == 0) {
|
|
for (int i = 0; i < 2; i++) {
|
|
if (i_this->ccSph[i].ChkTgHit()) {
|
|
i_this->atInfo.mpCollider = i_this->ccSph[i].GetTgHitObj();
|
|
cc_at_check(actor, &i_this->atInfo);
|
|
|
|
if (player->getCutType() == daPy_py_c::CUT_TYPE_JUMP && player->checkCutJumpCancelTurn()) {
|
|
i_this->invulnerability_timer = 3;
|
|
} else {
|
|
i_this->invulnerability_timer = 10;
|
|
}
|
|
|
|
if (i_this->field_0x66c < 50.0f) {
|
|
s16 sp8 = (actor->shape_angle.y + 0x4000) - fopAcM_searchPlayerAngleY(actor);
|
|
if (sp8 < 0) {
|
|
i_this->field_0x672 = 0;
|
|
} else {
|
|
i_this->field_0x672 = -0x8000;
|
|
}
|
|
}
|
|
|
|
i_this->field_0x66c = 150.0f + TREG_F(17);
|
|
|
|
cXyz sp2C;
|
|
cXyz pos;
|
|
if (cM_rndF(1.0f) < 0.5f) {
|
|
cMtx_YrotS(*calc_mtx, actor->shape_angle.y);
|
|
sp2C.x = -200.0f + JREG_F(8);
|
|
sp2C.y = JREG_F(9);
|
|
sp2C.z = 0.0f;
|
|
MtxPosition(&sp2C, &pos);
|
|
pos += actor->current.pos;
|
|
fopAcM_createItem(&pos, fpcNm_ITEM_HEART, -1, -1, NULL, NULL, 0);
|
|
}
|
|
|
|
i_this->field_0x674 = 15;
|
|
|
|
if (actor->health <= 0) {
|
|
i_this->field_0xe38 = 1;
|
|
pos = actor->current.pos;
|
|
pos.y += 150.0f + JREG_F(7);
|
|
fopAcM_createDisappear(actor, &pos, 20, 0, actor->field_0x564);
|
|
|
|
cXyz scale(1.0f, 1.0f, 1.0f);
|
|
fopAcM_createItemForBoss(&pos, fpcNm_ITEM_KAKERA_HEART, fopAcM_GetRoomNo(actor), &actor->shape_angle, &scale, 0.0f, 0.0f, actor->field_0x564);
|
|
|
|
int swbit = (fopAcM_GetParam(actor) & 0xFF000000) >> 0x18;
|
|
if (swbit != 0xFF) {
|
|
dComIfGs_onSwitch(swbit, fopAcM_GetRoomNo(actor));
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
if (i_this->ccCyl[i].ChkTgHit()) {
|
|
i_this->invulnerability_timer = 10;
|
|
daObj::HitSeStart(&actor->current.pos, fopAcM_GetRoomNo(actor), &i_this->ccCyl[i], 11);
|
|
i_this->field_0x66c = 70.0f + TREG_F(18);
|
|
i_this->field_0x674 = 15;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static void normal(obj_rw_class* i_this) {
|
|
switch (i_this->mode) {
|
|
case 0:
|
|
i_this->mode = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void action(obj_rw_class* i_this) {
|
|
cXyz sp14;
|
|
cXyz sp8;
|
|
|
|
switch (i_this->action) {
|
|
case 0:
|
|
normal(i_this);
|
|
break;
|
|
}
|
|
|
|
damage_check(i_this);
|
|
|
|
cLib_addCalc0(&i_this->field_0x66c, 0.05f, 5.0f);
|
|
i_this->field_0x672 += 0xD00;
|
|
i_this->field_0x670 = i_this->field_0x66c * (20.0f + TREG_F(16)) * cM_ssin(i_this->field_0x672);
|
|
}
|
|
|
|
static u8 l_HIOInit;
|
|
|
|
static daOBJ_RW_HIO_c l_HIO;
|
|
|
|
static int daOBJ_RW_Execute(obj_rw_class* i_this) {
|
|
fopAc_ac_c* actor = &i_this->enemy;
|
|
cXyz sp1C;
|
|
cXyz sp10;
|
|
|
|
i_this->field_0x660++;
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
if (i_this->field_0x666[i] != 0) {
|
|
i_this->field_0x666[i]--;
|
|
}
|
|
}
|
|
|
|
if (i_this->invulnerability_timer != 0) {
|
|
i_this->invulnerability_timer--;
|
|
}
|
|
|
|
if (i_this->field_0x674 != 0) {
|
|
i_this->field_0x674--;
|
|
}
|
|
|
|
action(i_this);
|
|
|
|
s16 sp8 = (30.0f + TREG_F(14)) * (i_this->field_0x674 * cM_ssin(i_this->field_0x674 * 0x1700));
|
|
|
|
mDoMtx_stack_c::transS(actor->current.pos.x, actor->current.pos.y, actor->current.pos.z);
|
|
mDoMtx_stack_c::YrotM(actor->shape_angle.y);
|
|
mDoMtx_stack_c::XrotM(sp8);
|
|
mDoMtx_stack_c::scaleM(l_HIO.base_size, l_HIO.base_size, l_HIO.base_size);
|
|
i_this->model->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
|
|
cMtx_YrotS(*calc_mtx, actor->shape_angle.y);
|
|
|
|
sp1C.x = -130.0f + KREG_F(0);
|
|
sp1C.y = 200.0f + KREG_F(1);
|
|
sp1C.z = 0.0f;
|
|
MtxPosition(&sp1C, &sp10);
|
|
sp10 += actor->current.pos;
|
|
i_this->ccSph[0].SetC(sp10);
|
|
i_this->ccSph[0].SetR((100.0f + KREG_F(2)) * l_HIO.base_size);
|
|
|
|
sp1C.x = 80.0f + KREG_F(3);
|
|
sp1C.y = 220.0f + KREG_F(4);
|
|
sp1C.z = 0.0f;
|
|
MtxPosition(&sp1C, &sp10);
|
|
sp10 += actor->current.pos;
|
|
i_this->ccSph[1].SetR((100.0f + KREG_F(5)) * l_HIO.base_size);
|
|
i_this->ccSph[1].SetC(sp10);
|
|
|
|
if (i_this->field_0xe38 != 0) {
|
|
sp10.z -= 52000.0f;
|
|
i_this->ccSph[0].SetC(sp10);
|
|
i_this->ccSph[1].SetC(sp10);
|
|
fopAcM_OffStatus(actor, 0);
|
|
actor->attention_info.flags = 0;
|
|
}
|
|
|
|
dComIfG_Ccsp()->Set(&i_this->ccSph[0]);
|
|
dComIfG_Ccsp()->Set(&i_this->ccSph[1]);
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
static f32 pole_x[4] = {-340.0f, -240.0f, 330.0f, 290.0f};
|
|
static f32 pole_z[4] = {90.0f, -90.0f, 110.0f, -100.0f};
|
|
|
|
sp1C.x = pole_x[i];
|
|
sp1C.y = 0.0f;
|
|
sp1C.z = pole_z[i];
|
|
MtxPosition(&sp1C, &sp10);
|
|
sp10 += actor->current.pos;
|
|
i_this->ccCyl[i].SetC(sp10);
|
|
i_this->ccCyl[i].SetR((30.0f + KREG_F(12)) * l_HIO.base_size);
|
|
i_this->ccCyl[i].SetH((200.0f + KREG_F(18)) * l_HIO.base_size);
|
|
dComIfG_Ccsp()->Set(&i_this->ccCyl[i]);
|
|
}
|
|
|
|
actor->eyePos = actor->current.pos;
|
|
actor->eyePos.y += 200.0f + TREG_F(4);
|
|
actor->attention_info.position = actor->eyePos;
|
|
actor->attention_info.position.y += 150.0f + TREG_F(5);
|
|
i_this->sound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(actor)));
|
|
return 1;
|
|
}
|
|
|
|
static int daOBJ_RW_IsDelete(obj_rw_class* i_this) {
|
|
return 1;
|
|
}
|
|
|
|
static int daOBJ_RW_Delete(obj_rw_class* i_this) {
|
|
fopAc_ac_c* actor = &i_this->enemy;
|
|
fopAcM_GetID(actor);
|
|
dComIfG_resDelete(&i_this->phase, "Obj_rw");
|
|
|
|
if (i_this->HIOInit) {
|
|
l_HIOInit = FALSE;
|
|
mDoHIO_DELETE_CHILD(l_HIO.id);
|
|
}
|
|
|
|
if (actor->heap != NULL) {
|
|
i_this->sound.deleteObject();
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
static int useHeapInit(fopAc_ac_c* actor) {
|
|
obj_rw_class* i_this = (obj_rw_class*)actor;
|
|
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Obj_rw", 3);
|
|
JUT_ASSERT(603, modelData != NULL);
|
|
|
|
i_this->model = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
|
|
if (i_this->model == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
i_this->model->setUserArea((uintptr_t)i_this);
|
|
i_this->model->getModelData()->getJointNodePointer(1)->setCallBack(nodeCallBack);
|
|
return 1;
|
|
}
|
|
|
|
static int daOBJ_RW_Create(fopAc_ac_c* actor) {
|
|
obj_rw_class* i_this = (obj_rw_class*)actor;
|
|
fopAcM_ct(actor, obj_rw_class);
|
|
|
|
int phase_state = dComIfG_resLoad(&i_this->phase, "Obj_rw");
|
|
if (phase_state == cPhs_COMPLEATE_e) {
|
|
OS_REPORT("Obj_rw", fopAcM_GetParam(actor));
|
|
OS_REPORT("OBJ_RW//////////////OBJ_RW SET 1 !!\n");
|
|
|
|
if (!fopAcM_entrySolidHeap(actor, useHeapInit, 0xFD0)) {
|
|
OS_REPORT("//////////////OBJ_RW SET NON !!\n");
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
OS_REPORT("//////////////OBJ_RW SET 2 !!\n");
|
|
|
|
if (!l_HIOInit) {
|
|
i_this->HIOInit = TRUE;
|
|
l_HIOInit = TRUE;
|
|
l_HIO.id = mDoHIO_CREATE_CHILD("いのししまる焼き", &l_HIO);
|
|
}
|
|
|
|
fopAcM_SetMtx(actor, i_this->model->getBaseTRMtx());
|
|
fopAcM_SetMin(actor, -500.0f, -200.0f, -500.0f);
|
|
fopAcM_SetMax(actor, 500.0f, 500.0f, 500.0f);
|
|
|
|
actor->health = 200;
|
|
actor->field_0x560 = 200;
|
|
|
|
static dCcD_SrcSph cc_sph_src = {
|
|
{
|
|
{0x0, {{0x0, 0x0, 0x0}, {0xd8fbfdff, 0x3}, 0x75}}, // mObj
|
|
{dCcD_SE_HARD_BODY, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{{0.0f, 0.0f, 0.0f}, 40.0f} // mSph
|
|
} // mSphAttr
|
|
};
|
|
|
|
static dCcD_SrcCyl cc_cyl_src = {
|
|
{
|
|
{0x0, {{0x0, 0x0, 0x0}, {0xd8fbfdff, 0x3}, 0x75}}, // mObj
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x3}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{0.0f, 0.0f, 0.0f}, // mCenter
|
|
200.0f, // mRadius
|
|
250.0f // mHeight
|
|
} // mCyl
|
|
};
|
|
|
|
i_this->ccStts.Init(0xFF, 0, actor);
|
|
|
|
i_this->ccSph[0].Set(cc_sph_src);
|
|
i_this->ccSph[0].SetStts(&i_this->ccStts);
|
|
|
|
i_this->ccSph[1].Set(cc_sph_src);
|
|
i_this->ccSph[1].SetStts(&i_this->ccStts);
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
i_this->ccCyl[i].Set(cc_cyl_src);
|
|
i_this->ccCyl[i].SetStts( &i_this->ccStts);
|
|
}
|
|
|
|
i_this->sound.init(&actor->current.pos, &actor->eyePos, 3, 1);
|
|
i_this->atInfo.mpSound = &i_this->sound;
|
|
|
|
actor->field_0x564 = (fopAcM_GetParam(actor) & 0xFF0000) >> 0x10;
|
|
|
|
int swbit = (fopAcM_GetParam(actor) & 0xFF000000) >> 0x18;
|
|
if (swbit != 0xFF && dComIfGs_isSwitch(swbit, fopAcM_GetRoomNo(actor))) {
|
|
i_this->field_0xe38 = 1;
|
|
cXyz scale(1.0f, 1.0f, 1.0f);
|
|
fopAcM_createItemForBoss(&actor->current.pos, fpcNm_ITEM_KAKERA_HEART, fopAcM_GetRoomNo(actor), &actor->shape_angle, &scale, 0.0f, 0.0f, actor->field_0x564);
|
|
} else {
|
|
fopAcM_createChild(PROC_OBJ_MAKI, fopAcM_GetID(actor), 0xFFFFFF01, &actor->home.pos, fopAcM_GetRoomNo(actor), &actor->home.angle, NULL, -1, NULL);
|
|
fopAcM_OnStatus(actor, 0);
|
|
actor->attention_info.flags = fopAc_AttnFlag_BATTLE_e;
|
|
}
|
|
|
|
daOBJ_RW_Execute(i_this);
|
|
}
|
|
|
|
return phase_state;
|
|
}
|
|
|
|
static actor_method_class l_daOBJ_RW_Method = {
|
|
(process_method_func)daOBJ_RW_Create,
|
|
(process_method_func)daOBJ_RW_Delete,
|
|
(process_method_func)daOBJ_RW_Execute,
|
|
(process_method_func)daOBJ_RW_IsDelete,
|
|
(process_method_func)daOBJ_RW_Draw,
|
|
};
|
|
|
|
extern actor_process_profile_definition g_profile_OBJ_RW = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
7, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_OBJ_RW, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(obj_rw_class), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
711, // mPriority
|
|
&l_daOBJ_RW_Method, // sub_method
|
|
0x00040100, // mStatus
|
|
fopAc_ENEMY_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|