tp/src/d/actor/d_a_obj_gm.cpp

772 lines
26 KiB
C++

/**
* @file d_a_obj_gm.cpp
*
*/
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_obj_gm.h"
#include "d/d_cc_d.h"
#include "d/actor/d_a_obj_so.h"
#include "d/d_a_obj.h"
#include "d/d_s_play.h"
enum OBJ_GM_RES_File_ID {
/* BMDR */
/* 0x3 */ BMDR_K_KUMO_HASI00 = 0x3,
/* 0x4 */ BMDR_K_KUMO_IWA00,
/* 0x5 */ BMDR_K_KUMO_IWA01,
/* 0x6 */ BMDR_K_KUMO_TUBO00,
/* 0x7 */ BMDR_K_KUMO_TUBO01,
};
class daObj_Gm_HIO_c : public JORReflexible {
public:
/* 80BFB14C */ daObj_Gm_HIO_c();
/* 80BFD284 */ virtual ~daObj_Gm_HIO_c() {}
void genMessage(JORMContext*);
/* 0x4 */ s8 id;
};
/* 80BFD3E8-80BFD404 000020 001C+00 7/8 0/0 0/0 .data obj_size */
static f32 obj_size[7] = {
30.0f, 50.0f, 50.0f, 140.0f, 100.0f, 70.0f, 200.0f,
};
/* 80BFD404-80BFD420 00003C 001C+00 0/1 0/0 0/0 .data weg */
static f32 weg[7] = {
60.0f, 70.0f, 80.0f, 150.0f, 100.0f, 60.0f, 200.0f,
};
/* 80BFD420-80BFD430 000058 000E+02 0/1 0/0 0/0 .data tim */
static s16 tim[7] = {
1500,
1000,
1200,
700,
800,
1000,
700,
};
/* 80BFD430-80BFD44C 000068 001C+00 2/2 0/0 0/0 .data spin_sp */
static f32 spin_sp[7] = {
200.0f, 100.0f, 200.0f, 66.7f, 80.0f, 0.0f, 0.0f,
};
/* 80BFD44C-80BFD45C 000084 000E+02 1/1 0/0 0/0 .data neg */
static s16 neg[7] = {
300,
200,
250,
120,
150,
250,
150,
};
/* 80BFD45C-80BFD478 000094 001C+00 1/1 0/0 0/0 .data obj_size_maji */
static f32 obj_size_maji[7] = {
0.666f, 0.8f, 0.7f, 1.2f, 1.0f, 0.7f, 1.2f,
};
/* 80BFD478-80BFD494 0000B0 001C+00 1/1 0/0 0/0 .data gm_obj_bmd */
static int gm_obj_bmd[7] = {
BMDR_K_KUMO_TUBO00, BMDR_K_KUMO_TUBO01, BMDR_K_KUMO_IWA01, BMDR_K_KUMO_IWA00, BMDR_K_KUMO_HASI00, BMDR_K_KUMO_TUBO00, BMDR_K_KUMO_TUBO00,
};
/* 80BFB14C-80BFB164 0000EC 0018+00 1/1 0/0 0/0 .text __ct__14daObj_Gm_HIO_cFv */
daObj_Gm_HIO_c::daObj_Gm_HIO_c() {
id = -1;
}
/* 80BFB164-80BFB218 000104 00B4+00 1/0 0/0 0/0 .text daObj_Gm_Draw__FP12obj_gm_class */
static int daObj_Gm_Draw(obj_gm_class* i_this) {
fopAc_ac_c* a_this = (fopAc_ac_c*)&i_this->actor;
if (i_this->mType < 5) {
g_env_light.settingTevStruct(16, &a_this->current.pos, &a_this->tevStr);
g_env_light.setLightTevColorType_MAJI(i_this->mModel, &a_this->tevStr);
mDoExt_modelUpdateDL(i_this->mModel);
if (i_this->mAction == 2) {
dComIfGd_setSimpleShadow(&a_this->current.pos, i_this->mBgc.GetGroundH(), obj_size[i_this->mType], i_this->mBgc.m_gnd,
0, 1.0f, dDlst_shadowControl_c::getSimpleTex());
}
}
return 1;
}
/* 80BFB218-80BFB3D4 0001B8 01BC+00 1/1 0/0 0/0 .text wall_angle_get__FP12obj_gm_class */
static s16 wall_angle_get(obj_gm_class* i_this) {
fopAc_ac_c* a_this = (fopAc_ac_c*)&i_this->actor;
dBgS_LinChk lin_chk;
cXyz spac, spb8, spa0[2];
cMtx_YrotS(*calc_mtx, i_this->field_0x720);
spac.x = 0.0f;
spac.y = 0.0f;
spac.z = -50.0f;
MtxPosition(&spac, &spb8);
spb8 += a_this->current.pos;
spac.x = 5.0f;
spac.y = 0.0f;
spac.z = obj_size[i_this->mType] + 100.0f;
for (int i = 0; i < 2; i++) {
MtxPosition(&spac, &spa0[i]);
spac.x *= -1.0f;
spa0[i] += spb8;
lin_chk.Set(&spb8, &spa0[i], a_this);
if (dComIfG_Bgsp().LineCross(&lin_chk)) {
spa0[i] = lin_chk.GetCross();
} else {
OS_REPORT("OBJ GM WALL CHECK NON ??\n");
return 35;
}
}
spac = spa0[1] - spa0[0];
return cM_atan2s(spac.x, spac.z) + 0x4000;
}
/* 80BFB410-80BFB508 0003B0 00F8+00 3/3 0/0 0/0 .text ito_pos_set__FP12obj_gm_class */
static void ito_pos_set(obj_gm_class* i_this) {
cXyz pos;
pos.x = 0.0f;
pos.z = (JREG_F(9) + 15.0f) * obj_size_maji[i_this->mType];
MtxPush();
for (int i = 0; i < 6; i++) {
cMtx_YrotM(*calc_mtx, 0x2AAA);
pos.y = obj_size[i_this->mType] * 0.7f;
MtxPosition(&pos, &i_this->field_0x684[i]);
pos.y = -obj_size[i_this->mType] * 0.7f;
MtxPosition(&pos, &i_this->field_0x6cc[i]);
}
MtxPull();
}
/* 80BFB508-80BFBA14 0004A8 050C+00 1/1 0/0 0/0 .text bg_fix__FP12obj_gm_class */
static void bg_fix(obj_gm_class* i_this) {
// NONMATCHING - incorrect instruction generated at line 258
fopAc_ac_c* a_this = (fopAc_ac_c*)&i_this->actor;
cXyz sp28, sp34;
if (i_this->field_0x630 > 0.1f) {
i_this->field_0x634 = i_this->field_0x630 * cM_ssin(i_this->field_0x640 * tim[i_this->mType]);
i_this->field_0x638 = i_this->field_0x630 * cM_ssin(i_this->field_0x640 * (tim[i_this->mType] + 100));
cLib_addCalc0(&i_this->field_0x630, 0.05f, 0.1f);
i_this->field_0x640++;
} else {
i_this->field_0x640 = 0;
}
sp28.set(0.0f, 0.0f, weg[i_this->mType]);
cMtx_XrotS(*calc_mtx, a_this->current.angle.x);
MtxPosition(&sp28, &sp34);
MtxTrans(a_this->current.pos.x, a_this->current.pos.y + sp34.y, a_this->current.pos.z, 0);
cMtx_YrotM(*calc_mtx, a_this->current.angle.y);
cMtx_XrotM(*calc_mtx, a_this->current.angle.x);
MtxTrans(i_this->field_0x634, 0.0f, i_this->field_0x638, 1);
cMtx_YrotM(*calc_mtx, i_this->field_0x64c[0]);
MtxPush();
cMtx_YrotM(*calc_mtx, a_this->shape_angle.y);
cMtx_XrotM(*calc_mtx, a_this->shape_angle.x);
i_this->mModel->setBaseTRMtx(*calc_mtx);
if (i_this->mType == 5) {
if (i_this->field_0x650 != NULL) {
((daTbox_c*)(i_this->field_0x650))->setDrawMtx(*calc_mtx);
}
} else if (i_this->mType == 6 && i_this->field_0x650 != NULL) {
obj_so_class* so_p = (obj_so_class*)(i_this->field_0x650);
so_p->field_0x1b60 = 1;
MTXCopy(*calc_mtx, so_p->mMtx);
}
MtxPull();
sp28.set(0.0f, 0.0f, 0.0f);
MtxPosition(&sp28, &i_this->field_0x714);
sp34 = i_this->field_0x714;
if (i_this->field_0x948 != 0) {
sp34.y -= 12300.0f;
}
if (i_this->mType < 6) {
i_this->mSph.SetC(sp34);
i_this->mSph.SetR((JREG_F(3) + 1.0f) * obj_size[i_this->mType]);
dComIfG_Ccsp()->Set(&i_this->mSph);
}
a_this->eyePos = i_this->field_0x714;
a_this->eyePos.y += 40.0f;
a_this->attention_info.position = a_this->eyePos;
sp28.set(0.0f, obj_size[i_this->mType] * 0.7f, 0.0f);
MtxPosition(&sp28, &i_this->field_0x654[0]);
sp28.set(0.0f, -obj_size[i_this->mType] * 0.7f, 0.0f);
MtxPosition(&sp28, &i_this->field_0x654[1]);
ito_pos_set(i_this);
if (i_this->mSph.ChkTgHit()) {
i_this->mAtInfo.mpCollider = i_this->mSph.GetTgHitObj();
at_power_check(&i_this->mAtInfo);
if (i_this->mType == 5) {
if (i_this->mAtInfo.mpCollider->ChkAtType(AT_TYPE_HOOKSHOT)) {
a_this->field_0x567 = 1;
return;
}
} else {
if (i_this->mAtInfo.mpCollider->ChkAtType(AT_TYPE_SLINGSHOT) || i_this->mAtInfo.mpCollider->ChkAtType(AT_TYPE_HOOKSHOT)) {
i_this->mAtInfo.mAttackPower = 1;
}
if (i_this->mAtInfo.mAttackPower != 0 && i_this->mType <= 1) {
i_this->field_0x72c = 1;
} else {
i_this->field_0x948 = 15;
i_this->field_0x630 = TREG_F(4) + 20.0f;
i_this->field_0x648 = TREG_F(6) + 10000.0f;
}
}
}
if ((i_this->field_0xae4 & 4) != 0) {
i_this->field_0xae4 &= -5;
i_this->field_0x630 = TREG_F(14) + 10.0f;
i_this->field_0x648 = TREG_F(16) + 5000.0f;
}
i_this->mSph.OffAtSetBit();
if (i_this->mActionMode == 0) {
i_this->mActionMode = 1;
i_this->field_0x66c[0] = i_this->field_0x654[0];
i_this->field_0x66c[1] = i_this->field_0x654[1];
}
if ((i_this->field_0xae4 & 1) != 0) {
i_this->field_0xae4 &= ~1;
i_this->mAction = 1;
i_this->mActionMode = 0;
}
if ((i_this->field_0xae4 & 2) != 0) {
if (i_this->mType >= 5) {
fopAcM_delete(a_this);
} else {
i_this->field_0xae4 &= ~2;
i_this->mAction = 2;
i_this->mActionMode = 0;
if (i_this->mType != 0) {
i_this->mSph.OnAtSetBit();
}
i_this->field_0x728 = 1.0f;
}
}
}
/* 80BFBA14-80BFC168 0009B4 0754+00 1/1 0/0 0/0 .text swing__FP12obj_gm_class */
static void swing(obj_gm_class* i_this) {
fopAc_ac_c* a_this = (fopAc_ac_c*)&i_this->actor;
cXyz sp40, sp4c;
if (i_this->mSph.ChkTgHit()) {
if (i_this->mType <= 1) {
i_this->field_0x72c = 1;
return;
}
if (i_this->field_0x63c < 0x100 && i_this->field_0x63c > -0x100) {
i_this->field_0x640 = 0;
i_this->field_0x63c = (KREG_F(15) + 10.0f) * spin_sp[i_this->mType];
i_this->field_0x644 = fopAcM_searchPlayerAngleY(a_this);
} else if (i_this->field_0x63e < 0x100 && i_this->field_0x63e > -0x100) {
s16 angle = i_this->field_0x644 - fopAcM_searchPlayerAngleY(a_this);
i_this->field_0x642 = 0;
i_this->field_0x63e = i_this->field_0x63c * cM_ssin(angle);
}
}
if (i_this->field_0x63c > 0x1000 || i_this->field_0x63c < -0x1000) {
if (i_this->mType != 0) {
i_this->mSph.OnAtSetBit();
}
} else {
i_this->mSph.OffAtSetBit();
}
switch (i_this->mActionMode) {
case 0:
sp40 = i_this->field_0x614[0] - i_this->field_0x714;
i_this->field_0x62c = sp40.abs();
i_this->mActionMode = 1;
i_this->field_0x640 = 0x4000;
i_this->field_0x63c = a_this->current.angle.x;
i_this->field_0x644 = a_this->current.angle.y;
a_this->current.angle.y = 0;
// fallthrough
case 1:
i_this->field_0x648 = TREG_F(6) + 10000.0f;
a_this->current.angle.x = i_this->field_0x63c * cM_ssin(i_this->field_0x640);
a_this->current.angle.z = i_this->field_0x63e * cM_ssin(i_this->field_0x642);
sp40.x = i_this->field_0x62c;
if (sp40.x > 1500.0f) {
sp40.x = 1500.0f;
}
s16 sVar2 = 2000.0f - sp40.x;
i_this->field_0x640 += sVar2;
i_this->field_0x642 += sVar2;
cLib_addCalcAngleS2(&i_this->field_0x63c, 0, 32, YREG_S(3) + 3);
cLib_addCalcAngleS2(&i_this->field_0x63e, 0, 32, YREG_S(3) + 3);
MtxTrans(i_this->field_0x614[0].x, i_this->field_0x614[0].y, i_this->field_0x614[0].z, 0);
cMtx_YrotM(*calc_mtx, i_this->field_0x644);
cMtx_YrotM(*calc_mtx, a_this->current.angle.y);
cMtx_XrotM(*calc_mtx, a_this->current.angle.x);
cMtx_ZrotM(*calc_mtx, a_this->current.angle.z);
cMtx_YrotM(*calc_mtx, -i_this->field_0x644);
MtxTrans(0.0f, -i_this->field_0x62c, 0.0f, 1);
cMtx_YrotM(*calc_mtx, i_this->field_0x64c[0]);
MtxPush();
cMtx_YrotM(*calc_mtx, a_this->shape_angle.y);
cMtx_XrotM(*calc_mtx, a_this->shape_angle.x);
i_this->mModel->setBaseTRMtx(*calc_mtx);
MtxPull();
sp40.set(0.0f, 0.0f, 0.0f);
sp4c = a_this->current.pos;
MtxPosition(&sp40, &a_this->current.pos);
a_this->speed = a_this->current.pos - sp4c;
if (i_this->mType < 5) {
i_this->mSph.SetC(a_this->current.pos);
dComIfG_Ccsp()->Set(&i_this->mSph);
}
sp40.set(0.0f, obj_size[i_this->mType], 0.0f);
MtxPosition(&sp40, &i_this->field_0x654[0]);
ito_pos_set(i_this);
a_this->eyePos = a_this->current.pos;
a_this->eyePos.y += 40.0f;
a_this->attention_info.position = a_this->eyePos;
a_this->current.pos.y -= obj_size[i_this->mType];
a_this->old.pos.y -= obj_size[i_this->mType];
i_this->mBgc.CrrPos(dComIfG_Bgsp());
a_this->current.pos.y += obj_size[i_this->mType];
a_this->old.pos.y += obj_size[i_this->mType];
if (i_this->mBgc.ChkGroundHit() || i_this->mBgc.ChkWallHit()) {
if (i_this->mType <= 1) {
i_this->field_0x72c = 1;
} else {
i_this->field_0xae4 |= 2;
fopAcM_effSmokeSet1(&i_this->field_0xae8, &i_this->field_0xaec, &a_this->current.pos, NULL, (TREG_F(18) + 0.025f) * obj_size[i_this->mType],
&a_this->tevStr, 1);
}
}
break;
}
if ((i_this->field_0xae4 & 2) != 0) {
if (i_this->mType >= 5) {
fopAcM_delete(a_this);
} else {
i_this->field_0xae4 &= ~2;
i_this->mAction = 2;
i_this->mActionMode = 0;
if (i_this->mType != 0) {
i_this->mSph.OnAtSetBit();
}
i_this->field_0x720 = cM_atan2s(a_this->speed.x, a_this->speed.z);
a_this->speedF = JMAFastSqrt(a_this->speed.x * a_this->speed.x + a_this->speed.z * a_this->speed.z);
i_this->field_0x728 = 1.0f;
}
}
}
/* 80BFC168-80BFC664 001108 04FC+00 1/1 0/0 0/0 .text drop__FP12obj_gm_class */
static void drop(obj_gm_class* i_this) {
fopAc_ac_c* a_this = (fopAc_ac_c*)&i_this->actor;
cXyz sp38, sp44;
cMtx_YrotS(*calc_mtx, i_this->field_0x720);
sp38.x = 0.0f;
sp38.y = 0.0f;
sp38.z = a_this->speedF * i_this->field_0x728;
MtxPosition(&sp38, &sp44);
a_this->current.pos.x += sp44.x;
a_this->current.pos.z += sp44.z;
a_this->current.pos.y += a_this->speed.y;
a_this->speed.y -= 5.0f;
a_this->current.pos.y -= obj_size[i_this->mType];
a_this->old.pos.y -= obj_size[i_this->mType];
f32 speedY = a_this->speed.y;
i_this->mBgc.CrrPos(dComIfG_Bgsp());
a_this->current.pos.y += obj_size[i_this->mType];
a_this->old.pos.y += obj_size[i_this->mType];
if (i_this->mBgc.ChkGroundHit()) {
if (i_this->mType <= 1) {
i_this->field_0x72c = 1;
} else {
if (speedY < -50.0f) {
a_this->speed.y = speedY * -0.3f;
}
if (i_this->mType != 4) {
cLib_addCalc0(&a_this->speedF, 1.0f, TREG_F(17) + 1.0f);
} else {
i_this->field_0x72c = 1;
}
if (i_this->field_0x726 == 0) {
i_this->field_0x726 = 1;
fopAcM_effSmokeSet1(&i_this->field_0xae8, &i_this->field_0xaec, &a_this->current.pos, NULL, (TREG_F(18) + 0.025f) * obj_size[i_this->mType], &a_this->tevStr, 1);
if (i_this->mType >= 3) {
i_this->mSound.startCreatureSound(Z2SE_EN_AI_HAMMER_HIT, 0, -1);
dComIfGp_getVibration().StartShock(YREG_S(2) + 5, 15, cXyz(0.0f, 1.0f, 0.0f));
}
}
}
} else {
i_this->mSph.OffAtSetBit();
}
if (i_this->mTimers[0] == 0 && i_this->mBgc.ChkWallHit()) {
i_this->mTimers[0] = 10;
s16 wallAngle = wall_angle_get(i_this);
if (a_this->speedF > 5.0f && wallAngle != 35) {
i_this->field_0x720 += (s16)(0x8000 - ((s16)(i_this->field_0x720 - wallAngle) << 1));
i_this->field_0x722 *= -1;
i_this->mTimers[0] = 10;
a_this->speedF *= AREG_F(4) + 0.35f;
} else {
a_this->speedF *= AREG_F(5) + 0.9f;
}
}
if (i_this->field_0x726 != 0) {
i_this->field_0x722 += (int)(a_this->speedF * i_this->field_0x728 * spin_sp[i_this->mType]);
}
MtxTrans(a_this->current.pos.x, a_this->current.pos.y, a_this->current.pos.z, 0);
cMtx_YrotM(*calc_mtx, i_this->field_0x720);
cMtx_XrotM(*calc_mtx, i_this->field_0x722);
cMtx_YrotM(*calc_mtx, -i_this->field_0x720);
cMtx_YrotM(*calc_mtx, a_this->current.angle.y);
cMtx_XrotM(*calc_mtx, a_this->current.angle.x);
cMtx_YrotM(*calc_mtx, i_this->field_0x64c[0]);
sp38.set(0.0f, obj_size[i_this->mType], 0.0f);
MtxPosition(&sp38, &i_this->field_0x654[0]);
sp38.set(0.0f, -obj_size[i_this->mType], 0.0f);
MtxPosition(&sp38, &i_this->field_0x654[1]);
ito_pos_set(i_this);
cMtx_YrotM(*calc_mtx, a_this->shape_angle.y);
cMtx_XrotM(*calc_mtx, a_this->shape_angle.x);
i_this->mModel->setBaseTRMtx(*calc_mtx);
i_this->mSph.SetC(a_this->current.pos);
dComIfG_Ccsp()->Set(&i_this->mSph);
a_this->eyePos = a_this->current.pos;
a_this->eyePos.y += 40.0f;
a_this->attention_info.position = a_this->eyePos;
}
/* 80BFC664-80BFC7D0 001604 016C+00 1/1 0/0 0/0 .text action__FP12obj_gm_class */
static void action(obj_gm_class* i_this) {
fopAc_ac_c* a_this = (fopAc_ac_c*)&i_this->actor;
s8 bVar1 = 1;
switch (i_this->mAction) {
case 0:
bg_fix(i_this);
break;
case 1:
swing(i_this);
break;
case 2:
drop(i_this);
bVar1 = 0;
break;
}
if (bVar1) {
s16 target = i_this->field_0x648 * cM_ssin(i_this->field_0x608 * neg[i_this->mType]);
cLib_addCalc2(&i_this->field_0x648, NREG_F(8) + 2000.0f, 0.05f, TREG_F(5) + 10.0f);
cLib_addCalcAngleS2(&i_this->field_0x64c[0], target, 16, 200);
}
if (i_this->mSph.ChkTgHit()) {
if (i_this->mType >= 2) {
i_this->field_0x948 = 15;
def_se_set(&i_this->mSound, i_this->mSph.GetTgHitObj(), 35, NULL);
}
fopAc_ac_c* actor_p = dCc_GetAc(i_this->mSph.GetTgHitObj()->GetAc());
if (actor_p != NULL && fopAcM_GetName(actor_p) == PROC_OBJ_GM) {
i_this->field_0xae4 |= 2;
}
}
fopAcM_OffStatus(a_this, 0);
a_this->attention_info.flags = 0;
}
/* 80BFC7D0-80BFC85C 001770 008C+00 1/1 0/0 0/0 .text s_tbox_sub__FPvPv */
static void* s_tbox_sub(void* i_actor, void* i_data) {
if (fopAcM_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_TBOX) {
f32 fVar1 = ((fopAc_ac_c*)i_actor)->current.pos.x - ((fopAc_ac_c*)i_data)->current.pos.x;
f32 fVar2 = ((fopAc_ac_c*)i_actor)->current.pos.z - ((fopAc_ac_c*)i_data)->current.pos.z;
if (fVar1 * fVar1 + fVar2 * fVar2 < 40000.0f) {
return i_actor;
}
}
return NULL;
}
/* 80BFC85C-80BFC8A8 0017FC 004C+00 1/1 0/0 0/0 .text s_so_sub__FPvPv */
static void* s_so_sub(void* i_actor, void* i_data) {
if (fopAcM_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_OBJ_SO) {
return i_actor;
}
return NULL;
}
/* 80BFC8A8-80BFCAF8 001848 0250+00 2/1 0/0 0/0 .text daObj_Gm_Execute__FP12obj_gm_class */
static int daObj_Gm_Execute(obj_gm_class* i_this) {
fopAc_ac_c* a_this = (fopAc_ac_c*)&i_this->actor;
if (i_this->field_0x650 == NULL) {
if (i_this->mType == 5) {
i_this->field_0x650 = fpcM_Search(s_tbox_sub, i_this);
} else if (i_this->mType == 6) {
i_this->field_0x650 = fpcM_Search(s_so_sub, i_this);
}
}
i_this->field_0x608++;
if (i_this->field_0x948 != 0) {
i_this->field_0x948--;
}
for (int i = 0; i < 2; i++) {
if (i_this->mTimers[i] != 0) {
i_this->mTimers[i]--;
}
}
action(i_this);
i_this->mSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(a_this)));
if (i_this->field_0x72c != 0) {
if (i_this->mSwBit != 0) {
dComIfGs_onSwitch(i_this->mSwBit, fopAcM_GetRoomNo(a_this));
}
if (i_this->mType == 0) {
daObj::make_eff_break_gm_kotubo(a_this);
i_this->mSound.startCreatureSound(JA_SE_OBJ_BREAK_CHINA_S, 0, -1);
if ((fopAcM_GetParam(a_this) & 0xFF) == 32) {
fopAcM_createItemForMidBoss(&a_this->current.pos, fpcNm_ITEM_SMALL_KEY, fopAcM_GetRoomNo(a_this), NULL, NULL, 0, fopAcM_GetParam(a_this) >> 24);
}
} else if (i_this->mType == 1) {
daObj::make_eff_break_gm_ootubo(a_this);
i_this->mSound.startCreatureSound(JA_SE_OBJ_BREAK_CHINA_L, 0, -1);
} else {
fopAcM_createDisappear(a_this, &a_this->current.pos, obj_size[i_this->mType] * 0.2f, 0, a_this->field_0x564);
}
fopAcM_createItemFromTable(&a_this->current.pos, a_this->field_0x565, -1, fopAcM_GetRoomNo(a_this), &a_this->current.angle, 0, NULL, NULL, NULL, false);
fopAcM_delete(a_this);
}
return 1;
}
/* 80BFCAF8-80BFCB00 001A98 0008+00 1/0 0/0 0/0 .text daObj_Gm_IsDelete__FP12obj_gm_class */
static int daObj_Gm_IsDelete(obj_gm_class* i_this) {
return 1;
}
/* 80BFD598-80BFD59C 000008 0004+00 2/2 0/0 0/0 .bss None */
static bool l_initHIO;
/* 80BFCB00-80BFCB74 001AA0 0074+00 1/0 0/0 0/0 .text daObj_Gm_Delete__FP12obj_gm_class */
static int daObj_Gm_Delete(obj_gm_class* i_this) {
fopAc_ac_c* a_this = (fopAc_ac_c*)&i_this->actor;
fopAcM_GetID(a_this);
dComIfG_resDelete(&i_this->mPhase, "OBJ_GM");
if (i_this->mIsFirstSpawn) {
l_initHIO = false;
}
if (a_this->heap != NULL) {
i_this->mSound.deleteObject();
}
return 1;
}
/* 80BFCB74-80BFCBF0 001B14 007C+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */
static int useHeapInit(fopAc_ac_c* a_this) {
obj_gm_class* i_this = (obj_gm_class*)a_this;
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("OBJ_GM", gm_obj_bmd[i_this->mType]);
JUT_ASSERT(1141, modelData != NULL);
i_this->mModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
if (i_this->mModel == NULL) {
return 0;
}
return 1;
}
/* 80BFD5A8-80BFD5B0 000018 0008+00 2/2 0/0 0/0 .bss l_HIO */
static daObj_Gm_HIO_c l_HIO;
/* 80BFCBF0-80BFD06C 001B90 047C+00 1/0 0/0 0/0 .text daObj_Gm_Create__FP10fopAc_ac_c */
static cPhs__Step daObj_Gm_Create(fopAc_ac_c* a_this) {
fopAcM_ct(a_this, obj_gm_class);
obj_gm_class* i_this = (obj_gm_class*)a_this;
cPhs__Step phase = (cPhs__Step)dComIfG_resLoad(&i_this->mPhase, "OBJ_GM");
if (phase == cPhs_COMPLEATE_e) {
OS_REPORT("OBJ_GM PARAM %x\n", fopAcM_GetParam(a_this));
a_this->field_0x565 = fopAcM_GetParam(a_this);
i_this->mType = (fopAcM_GetParam(a_this) >> 8) & 15;
if (i_this->mType == 15) {
i_this->mType = 0;
}
i_this->field_0x571 = (fopAcM_GetParam(a_this) & 0xF000) >> 12;
i_this->mSwBit = a_this->current.angle.z;
a_this->shape_angle.z = 0;
a_this->current.angle.z = 0;
if (i_this->mSwBit != 0) {
if (dComIfGs_isSwitch(i_this->mSwBit, fopAcM_GetRoomNo(a_this))) {
OS_REPORT("OBJ_GM 破壊後なので再セットしません\n");
return cPhs_ERROR_e;
}
}
OS_REPORT("OBJ_GM//////////////OBJ_GM SET 1 !!\n");
if (!fopAcM_entrySolidHeap(a_this, useHeapInit, 0x1000)) {
OS_REPORT("//////////////OBJ_GM SET NON !!\n");
return cPhs_ERROR_e;
}
OS_REPORT("//////////////OBJ_GM SET 2 !!\n");
if (!l_initHIO) {
i_this->mIsFirstSpawn = true;
l_initHIO = true;
l_HIO.id = -1;
}
fopAcM_SetMtx(a_this, i_this->mModel->getBaseTRMtx());
fopAcM_SetMin(a_this, -300.0f, -300.0f, -300.0f);
fopAcM_SetMax(a_this, 300.0f, 300.0f, 300.0f);
a_this->attention_info.flags = fopAc_AttnFlag_BATTLE_e;
i_this->mStts.Init(0xFF, 0, a_this);
static dCcD_SrcSph cc_sph_src = {
{
{0x0, {{AT_TYPE_CSTATUE_SWING, 0x2, 0x1f}, {0xd8fbfdff, 0x3}, 0x75}}, // mObj
{dCcD_SE_NONE, 0x0, 0x2, 0x0, 0x0}, // mGObjAt
{dCcD_SE_METAL, 0x2, 0x0, 0x0, 0x3}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{{0.0f, 0.0f, 0.0f}, 40.0f} // mSph
} // mSphAttr
};
i_this->mSph.Set(cc_sph_src);
i_this->mSph.SetStts(&i_this->mStts);
i_this->mSound.init(&a_this->current.pos, &a_this->current.pos, 3, 1);
if (i_this->mType < 5) {
a_this->shape_angle.y = cM_rndF(65536.0f);
a_this->shape_angle.x = cM_rndFX(10000.0f);
}
i_this->mBgc.Set(fopAcM_GetPosition_p(a_this), fopAcM_GetOldPosition_p(a_this), a_this, 1, &i_this->mAcchCir, fopAcM_GetSpeed_p(a_this), NULL, NULL);
i_this->mAcchCir.SetWall(50.0f, obj_size[i_this->mType]);
i_this->field_0x608 = cM_rndF(65536.0f);
daObj_Gm_Execute(i_this);
fopAcM_createChild(PROC_OBJ_ITO, fopAcM_GetID(a_this), i_this->mType << 1, &a_this->current.pos,
fopAcM_GetRoomNo(a_this), &a_this->current.angle, NULL, -1, NULL);
if (i_this->field_0x571 == 1) {
fopAcM_createChild(PROC_OBJ_ITO, fopAcM_GetID(a_this), (i_this->mType << 1) | 1, &a_this->current.pos,
fopAcM_GetRoomNo(a_this), &a_this->current.angle, NULL, -1, NULL);
} else {
a_this->current.angle.x = 0;
}
}
return phase;
}
/* 80BFD4D4-80BFD4F4 -00001 0020+00 1/0 0/0 0/0 .data l_daObj_Gm_Method */
static actor_method_class l_daObj_Gm_Method = {
(process_method_func)daObj_Gm_Create,
(process_method_func)daObj_Gm_Delete,
(process_method_func)daObj_Gm_Execute,
(process_method_func)daObj_Gm_IsDelete,
(process_method_func)daObj_Gm_Draw,
};
/* 80BFD4F4-80BFD524 -00001 0030+00 0/0 0/0 1/0 .data g_profile_OBJ_GM */
extern actor_process_profile_definition g_profile_OBJ_GM = {
fpcLy_CURRENT_e, // mLayerID
3, // mListID
fpcPi_CURRENT_e, // mListPrio
PROC_OBJ_GM, // mProcName
&g_fpcLf_Method.base, // sub_method
sizeof(obj_gm_class), // mSize
0, // mSizeOther
0, // mParameters
&g_fopAc_Method.base, // sub_method
57, // mPriority
&l_daObj_Gm_Method, // sub_method
0x00044100, // mStatus
fopAc_ACTOR_e, // mActorType
fopAc_CULLBOX_CUSTOM_e, // cullType
};