Files
tww/src/d/actor/d_a_kui.cpp
T
2025-05-21 14:44:25 -04:00

567 lines
19 KiB
C++

//
// Generated by dtk
// Translation Unit: d_a_kui.cpp
//
#include "d/actor/d_a_kui.h"
#include "d/actor/d_a_player.h"
#include "d/actor/d_a_btd.h"
#include "d/actor/d_a_dr2.h"
#include "d/d_bg_s_movebg_actor.h"
#include "d/d_com_inf_game.h"
#include "d/d_kankyo_rain.h"
#include "d/d_procname.h"
#include "d/d_priority.h"
#include "d/d_s_play.h"
#include "d/res/res_kui.h"
#include "f_op/f_op_camera.h"
#include "f_op/f_op_actor_mng.h"
#include "f_pc/f_pc_executor.h"
#include "JSystem/JUtility/JUTReport.h"
class J3DModelData;
/* 00000078-000000C4 .text s_a_i_sub__FPvPv */
static void* s_a_i_sub(void* search, void*) {
if (fopAcM_IsActor(search) && fopAcM_GetName(search) == PROC_DR2) {
return search;
}
return NULL;
}
/* 000000C4-000000F0 .text search_dragontail__FP9kui_class */
static dr2_class* search_dragontail(kui_class* i_this) {
return (dr2_class*)fpcM_Search(&s_a_i_sub, i_this);
}
/* 000000F0-0000013C .text b_a_i_sub__FPvPv */
static void* b_a_i_sub(void* search, void*) {
if (fopAcM_IsActor(search) && fopAcM_GetName(search) == PROC_BTD) {
return search;
}
return NULL;
}
/* 0000013C-00000168 .text search_btd__FP9kui_class */
static btd_class* search_btd(kui_class* i_this) {
return (btd_class*)fpcM_Search(&b_a_i_sub, i_this);
}
/* 00000168-0000037C .text setEffectMtx__FP10fopAc_ac_cP12J3DModelDataf */
static void setEffectMtx(fopAc_ac_c* a_this, J3DModelData* modelData, float scale) {
static Mtx mtx_adj = {
0.5f, 0.0f, 0.0f, 0.5f,
0.0f, -0.5f, 0.0f, 0.5f,
0.0f, 0.0f, 1.0f, 0.0f,
};
cXyz& eyePos = a_this->eyePos;
camera_class* camera = dCam_getCamera();
cXyz look_dir = eyePos - camera->mLookat.mEye;
cXyz light_dir;
dKyr_get_vectle_calc(&a_this->tevStr.mLightPosWorld, &eyePos, &light_dir);
cXyz refl;
C_VECHalfAngle(&look_dir, &light_dir, &refl);
Mtx reflMtx;
C_MTXLookAt(reflMtx, &cXyz::Zero, &cXyz::BaseY, &refl);
mDoMtx_stack_c::scaleS(scale, scale, 1.0f);
mDoMtx_stack_c::concat(mtx_adj);
mDoMtx_stack_c::concat(reflMtx);
MtxP mtx = mDoMtx_stack_c::get();
mtx[0][3] = 0.0f;
mtx[1][3] = 0.0f;
mtx[2][3] = 0.0f;
Mtx now_copy;
PSMTXCopy(mDoMtx_stack_c::get(), now_copy);
for (u16 i = 0; i < modelData->getMaterialNum(); i++) {
J3DMaterial* mat = modelData->getMaterialNodePointer(i);
for (u32 j = 0; j < 8; j++) {
J3DTexMtx* texMtx = mat->getTexMtx(j);
if (texMtx != NULL) {
switch (texMtx->getTexMtxInfo().mInfo) {
case 10:
case 11:
texMtx->getTexMtxInfo().setEffectMtx(now_copy);
break;
}
}
}
}
}
/* 0000037C-00000540 .text daKui_Draw__FP9kui_class */
static BOOL daKui_Draw(kui_class* i_this) {
if (i_this->type == 3) {
u32 light_type = 0;
if (REG0_S(0) != 0) {
light_type = 1;
}
i_this->eyePos = i_this->current.pos;
i_this->eyePos.y += REG0_F(10);
g_env_light.settingTevStruct(light_type, &i_this->eyePos, &i_this->tevStr);
g_env_light.setLightTevColorType(i_this->mpModel2, &i_this->tevStr);
g_env_light.setLightTevColorType(i_this->mpModel, &i_this->tevStr);
setEffectMtx(i_this, i_this->mpModel2->getModelData(), REG0_F(11) + 1.0f);
setEffectMtx(i_this, i_this->mpModel->getModelData(), REG0_F(12) + 1.0f);
mDoExt_modelUpdateDL(i_this->mpModel2);
mDoExt_modelUpdateDL(i_this->mpModel);
} else if (i_this->type != 1) {
g_env_light.settingTevStruct(TEV_TYPE_ACTOR, &i_this->current.pos, &i_this->tevStr);
g_env_light.setLightTevColorType(i_this->mpModel2, &i_this->tevStr);
dComIfGd_setListBG();
mDoExt_modelUpdateDL(i_this->mpModel2);
dComIfGd_setList();
if (i_this->mpModel) {
g_env_light.setLightTevColorType(i_this->mpModel, &i_this->tevStr);
mDoExt_modelUpdateDL(i_this->mpModel);
}
}
return TRUE;
}
/* 00000540-00000920 .text demo_camera__FP9kui_class */
static void demo_camera(kui_class* i_this) {
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
s8 bVar2 = true;
switch ((s8)i_this->field_0x2E8) {
case 0:
break;
case 1:
if (!i_this->eventInfo.checkCommandDemoAccrpt()) {
fopAcM_orderPotentialEvent(i_this, dEvtFlag_STAFF_ALL_e, 0xFFFF, 0);
i_this->eventInfo.onCondition(dEvtCnd_UNK2_e);
bVar2 = false;
break;
}
i_this->field_0x2E8 = i_this->field_0x2E8 + 1;
camera->mCamera.Stop();
camera->mCamera.SetTrimSize(2);
i_this->field_0x2EA = 0;
// fallthrough
case 2:
i_this->current.pos.y = i_this->home.pos.y + i_this->field_0x30C;
s32 uVar3 = (s32) i_this->field_0x2EA;
if (uVar3 < 20) {
f32 sin_result = cM_ssin((uVar3 & 0x1F) * 0x800);
i_this->field_0x30C = sin_result * 5.0f;
} else if (uVar3 <= 27) {
if (uVar3 == 27) {
fopAcM_seStartCurrent(i_this, JA_SE_OBJ_ROPE_SW_ON, 0);
dComIfGp_getVibration().StartShock(3, -33, cXyz(0.0f, 1.0f, 0.0f));
}
cLib_addCalc2(&i_this->field_0x30C, -70.0f, 1.0f, 10.0f);
} else if (uVar3 < 42) {
f32 sin_result = cM_ssin(uVar3 * 0x3A00);
i_this->field_0x30C = sin_result * 5.0f + (-70.0f);
}
i_this->field_0x2F8 = i_this->home.pos;
i_this->field_0x2F8.y += REG8_F(0) + 200.0f;
cMtx_YrotS(*calc_mtx, i_this->current.angle.y);
cXyz vec(REG8_F(1) + 800.f, REG8_F(2), REG8_F(3) + 100.0f);
cXyz posVec;
MtxPosition(&vec, &posVec);
i_this->field_0x2EC = i_this->home.pos + posVec;
if (i_this->field_0x2EA == 70) {
i_this->field_0x2E8 = 0;
camera->mCamera.Reset(i_this->field_0x2F8, i_this->field_0x2EC);
camera->mCamera.Start();
camera->mCamera.SetTrimSize(0);
dComIfGp_event_reset();
dComIfGs_onSwitch(i_this->mSwitchNo, fopAcM_GetRoomNo(i_this));
mDoAud_seStart(JA_SE_READ_RIDDLE_1);
}
break;
}
if ((i_this->field_0x2E8 != 0) && bVar2) {
camera->mCamera.Set(i_this->field_0x2F8, i_this->field_0x2EC);
JUTReport(0x19a, 0x1ae, "K SUB COUNT %d", i_this->field_0x2EA);
i_this->field_0x2EA++;
}
}
/* 00000920-000012E4 .text daKui_Execute__FP9kui_class */
static BOOL daKui_Execute(kui_class* i_this) {
fopAc_ac_c* actor = i_this;
static s16 bure_xa_d[2] = {0x1000, 0xF000};
cXyz temp2;
cXyz temp;
daPy_py_c* player;
s16 target_x_angle;
Mtx local_mtx;
player = (daPy_py_c*)dComIfGp_getPlayer(0);
if (i_this->field_0x2A2 != 0) {
dr2_class* dragon_tail = search_dragontail(i_this);
btd_class* btd = search_btd(i_this);
if (dragon_tail != NULL && btd != NULL) {
if ((dragon_tail->field_0x4BA == 0 || dragon_tail->field_0x4BA >= 10) && btd->field_0x2e4 < 10) {
actor->current.pos = dragon_tail->field_0x3B0;
actor->current.angle = dragon_tail->current.angle;
} else {
actor->current.pos.set(0.0f, -10000.0f, 0.0f);
}
} else {
actor->current.pos.set(0.0f, -10000.0f, 0.0f);
}
}
if (i_this->type == 3) {
if (actor->health == 3) {
temp2 = player->getLeftHandPos() - actor->home.pos;
cMtx_YrotS(*calc_mtx, -player->shape_angle.y);
MtxPosition(&temp2, &temp);
temp.z *= REG0_F(1) + 1.0f;
if (REG0_S(0) == 0) {
target_x_angle = -cM_atan2s(temp.z, -temp.y);
} else {
target_x_angle = (s32) cM_atan2s(temp.z, -temp.y);
}
s16 unk = std::fabsf((REG0_F(2) + 3000.0f) * cM_ssin(actor->shape_angle.y));
s8 unk_flag = 0;
if (target_x_angle > unk) {
target_x_angle = unk;
unk_flag = 1;
} else if (target_x_angle < (s16)-unk) {
target_x_angle = -unk;
unk_flag = 2;
}
if (unk_flag != 0 && unk > 2000) {
if (i_this->field_0x2DC[unk_flag] == 0) {
i_this->field_0x2DC[unk_flag] = 0x50;
i_this->field_0x2DC[0] = REG0_S(3) + 40;
dComIfGp_getVibration().StartShock(REG0_S(2) + 5, -0x21, cXyz(0.0f, 1.0f, 0.0f));
fopAcM_seStartCurrent(actor, JA_SE_OBJ_ST_CHIME, 0);
i_this->field_0x2E4 = *(s16*) (bure_xa_d + unk_flag - 1);
i_this->field_0x2E4 *= (s16) (REG17_S(4) + 1);
i_this->field_0x2E6 = REG17_S(5) + 0x400;
}
}
if (REG0_S(1) == 0) {
actor->shape_angle.y = -(actor->current.angle.y - player->shape_angle.y);
} else {
actor->shape_angle.y = actor->current.angle.y - player->shape_angle.y;
}
}
else {
target_x_angle = 0;
}
cLib_addCalcAngleS2(&actor->current.angle.x, target_x_angle, 4, REG0_S(1) + 0x200);
if (i_this->field_0x2DC[1] != 0) {
i_this->field_0x2DC[1]--;
}
if (i_this->field_0x2DC[2] != 0) {
i_this->field_0x2DC[2]--;
}
s16 x = 0;
s16 z = 0;
f32 unk_f = 1.0f;
if (i_this->field_0x2DC[0] != 0) {
i_this->field_0x2DC[0]--;
s32 iVar10 = (s32) i_this->field_0x2DC[0];
f32 fVar1 = iVar10 * (REG0_F(16) + 40.0f);
x = (s16) (fVar1 * cM_ssin(iVar10 * (REG0_S(4) + 0x1900)));
z = (s16) (fVar1 * cM_scos(iVar10 * (REG0_S(5) + 0x2100)) * 0.25f);
if ((iVar10 & 1) != 0) {
unk_f = (iVar10 * (REG0_F(17) + 0.001f)) + 1.0f;
}
if (i_this->field_0x2DC[0] == 0 && actor->health == 3 && REG0_S(3) == 0) {
dComIfGs_onSwitch(i_this->mSwitchNo, fopAcM_GetRoomNo(actor));
}
}
cLib_addCalcAngleS2(&i_this->field_0x2E2, i_this->field_0x2E4, 4, i_this->field_0x2E6);
cLib_addCalcAngleS2(&i_this->field_0x2E4, 0, 1, REG17_S(6) + 0x80);
cLib_addCalcAngleS2(&i_this->field_0x2E6, REG17_S(7) + 0x100, 1, REG17_S(8) + 0x40);
MtxTrans(actor->home.pos.x, actor->home.pos.y, actor->home.pos.z, FALSE);
mDoMtx_YrotM(*calc_mtx, actor->current.angle.y);
MtxPush();
mDoMtx_YrotM(*calc_mtx, actor->shape_angle.y);
mDoMtx_XrotM(*calc_mtx, x + i_this->field_0x2E2);
mDoMtx_ZrotM(*calc_mtx, z);
mDoMtx_YrotM(*calc_mtx, -actor->shape_angle.y);
MtxScale(unk_f, unk_f, unk_f, TRUE);
i_this->mpModel->setBaseTRMtx(*calc_mtx);
MtxPull();
mDoMtx_YrotM(*calc_mtx, actor->shape_angle.y + REG0_S(5));
mDoMtx_XrotM(*calc_mtx, actor->current.angle.x + REG0_S(6));
mDoMtx_YrotM(*calc_mtx, -(actor->shape_angle.y + REG0_S(5) + 0x4000));
MtxScale(unk_f, 1.0, unk_f, TRUE);
i_this->mpModel2->setBaseTRMtx(*calc_mtx);
MtxTrans(0.0, REG0_F(6) + -850.0f, 0.0, TRUE);
temp2.setall(0.0f);
MtxPosition(&temp2, &actor->current.pos);
MtxTrans(actor->current.pos.x, actor->current.pos.y, actor->current.pos.z, FALSE);
mDoMtx_YrotM(*calc_mtx, actor->current.angle.y);
MtxScale(actor->scale.x, actor->scale.y, actor->scale.z, TRUE);
cMtx_copy(*calc_mtx, i_this->field_0x2A8);
i_this->field_0x2D8->Move();
} else {
MtxTrans(actor->current.pos.x, actor->current.pos.y, actor->current.pos.z, FALSE);
mDoMtx_YrotM(*calc_mtx, actor->current.angle.y);
if (i_this->type == 2 || i_this->type == 4) {
i_this->mpModel->setBaseTRMtx(*calc_mtx);
}
i_this->mpModel2->setBaseScale(actor->scale);
i_this->mpModel2->setBaseTRMtx(*calc_mtx);
if (i_this->field_0x2A2) {
cMtx_scale(local_mtx, 4.0f, 4.0f, 4.0f);
} else {
cMtx_scale(local_mtx, actor->scale.x, actor->scale.y, actor->scale.z);
}
cMtx_concat(*calc_mtx, local_mtx, i_this->field_0x2A8);
i_this->field_0x2D8->Move();
}
if (i_this->type == 2 || i_this->type == 4) {
BOOL is_switch = dComIfGs_isSwitch(i_this->mSwitchNo, dComIfGp_roomControl_getStayNo());
if (!is_switch) {
if (actor->health == 3 && i_this->field_0x308 == 0) {
i_this->field_0x308 = 1000;
}
} else {
actor->current.pos.y = actor->home.pos.y - 70.0f;
}
if (i_this->field_0x308 != 0) {
i_this->field_0x308--;
s16 finished = REG8_S(3) + 970;
if (i_this->field_0x308 == finished) {
if (i_this->type == 2) {
i_this->field_0x2E8 = 1;
} else {
fopAcM_seStartCurrent(actor, JA_SE_OBJ_ROPE_SW_ON, 0);
dComIfGs_onSwitch(i_this->mSwitchNo, fopAcM_GetRoomNo(actor));
mDoAud_seStart(JA_SE_READ_RIDDLE_1);
}
}
}
demo_camera(i_this);
}
actor->eyePos = actor->current.pos;
return TRUE;
}
/* 000012E4-000012EC .text daKui_IsDelete__FP9kui_class */
static BOOL daKui_IsDelete(kui_class*) {
return TRUE;
}
/* 000012EC-00001340 .text daKui_Delete__FP9kui_class */
static BOOL daKui_Delete(kui_class* i_this) {
dComIfG_resDelete(&i_this->mPhs, "Kui");
dComIfG_Bgsp()->Release(i_this->field_0x2D8);
return TRUE;
}
/* 00001340-00001664 .text daKui_CreateHeap__FP10fopAc_ac_c */
static BOOL daKui_CreateHeap(fopAc_ac_c* a_this) {
kui_class* i_this = (kui_class*)a_this;
J3DModelData* modelData;
if (i_this->type == 3) {
// Bell body
modelData = (J3DModelData*)dComIfG_getObjectRes("Kui", KUI_BDL_HKANE1);
JUT_ASSERT(0x353, modelData != NULL);
i_this->mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203);
if (!i_this->mpModel) {
return FALSE;
}
// Bell handle
modelData = (J3DModelData*)dComIfG_getObjectRes("Kui", KUI_BDL_HKANE2);
JUT_ASSERT(0x35F, modelData != NULL);
i_this->mpModel2 = mDoExt_J3DModel__create(modelData, 0, 0x11020203);
if (!i_this->mpModel2) {
return FALSE;
}
} else {
// Rope
modelData = (J3DModelData*)dComIfG_getObjectRes("Kui", KUI_BDL_OBI_ROPETAG);
JUT_ASSERT(0x36B, modelData != NULL);
i_this->mpModel2 = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000002);
if (!i_this->mpModel2) {
return FALSE;
}
if (i_this->type == 2 || i_this->type == 4) {
// Rope swing attachment
modelData = (J3DModelData*)dComIfG_getObjectRes("Kui", KUI_BDL_MROPESW);
JUT_ASSERT(0x377, modelData != NULL);
i_this->mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000002);
if (!i_this->mpModel) {
return FALSE;
}
}
}
dBgW* bgw = new dBgW();
i_this->field_0x2D8 = bgw;
if (!i_this->field_0x2D8) {
return FALSE;
}
cBgD_t* pData = (cBgD_t*)dComIfG_getObjectRes("Kui", KUI_DZB_OBI_ROPETAG);
if (i_this->field_0x2D8->Set(pData, cBgW::MOVE_BG_e, &i_this->field_0x2A8) == true) {
return FALSE;
}
i_this->field_0x2D8->SetCrrFunc(dBgS_MoveBGProc_Typical);
return TRUE;
}
/* 00001664-000018C8 .text daKui_Create__FP10fopAc_ac_c */
static cPhs_State daKui_Create(fopAc_ac_c* a_this) {
kui_class* i_this;
cPhs_State result;
fopAcM_SetupActor(a_this, kui_class);
i_this = (kui_class*) a_this;
result = dComIfG_resLoad(&i_this->mPhs, "Kui");
if (result == cPhs_COMPLEATE_e) {
if (fopAcM_GetParam(a_this) == -1) {
return cPhs_ERROR_e;
}
i_this->type = fopAcM_GetParam(a_this) & 0xF;
i_this->field_0x2A2 = fopAcM_GetParam(a_this) & 0xF0;
i_this->field_0x2A1 = fopAcM_GetParam(a_this) >> 8;
i_this->mSwitchNo = fopAcM_GetParam(a_this) >> 0x18;
if (i_this->mSwitchNo == 0xFF) {
i_this->mSwitchNo = 0;
}
if (i_this->type == 3) {
i_this->field_0x2A1 = 4;
}
switch (i_this->field_0x2A1) {
case 0:
i_this->scale.x = 0.5f;
i_this->scale.y = 0.5f;
break;
case 1:
i_this->scale.x = 2.0f;
i_this->scale.y = 2.0f;
break;
case 2:
i_this->scale.z = 2.0f;
break;
case 3:
i_this->scale.x = 0.5f;
i_this->scale.y = 0.5f;
i_this->scale.z = 2.0f;
break;
case 4:
i_this->scale.setall(2.0f);
break;
case 5:
i_this->scale.x = 4.0f;
i_this->scale.y = REG0_F(2) + 2.0f;
i_this->scale.z = 4.0f;
break;
case 0xff:
default:
break;
}
if (!fopAcM_entrySolidHeap(i_this, &daKui_CreateHeap, 0x29f4)) {
return cPhs_ERROR_e;
}
if (dComIfG_Bgsp()->Regist(i_this->field_0x2D8, i_this)) {
return cPhs_ERROR_e;
}
fopAcM_SetMtx(i_this, i_this->mpModel2->getBaseTRMtx());
if (i_this->type >= 2) {
fopAcM_SetMin(i_this, -200.0f, -1000.0f, -200.0f);
fopAcM_SetMax(i_this, 200.0f, 2000.0f, 200.0f);
} else {
fopAcM_SetMin(i_this, -200.0f, -200.0f, -200.0f);
fopAcM_SetMax(i_this, 200.0f, 200.0f, 200.0f);
}
}
return result;
}
static actor_method_class l_daKui_Method = {
(process_method_func)daKui_Create,
(process_method_func)daKui_Delete,
(process_method_func)daKui_Execute,
(process_method_func)daKui_IsDelete,
(process_method_func)daKui_Draw,
};
actor_process_profile_definition g_profile_KUI = {
/* LayerID */ fpcLy_CURRENT_e,
/* ListID */ 0x0007,
/* ListPrio */ fpcPi_CURRENT_e,
/* ProcName */ PROC_KUI,
/* Proc SubMtd */ &g_fpcLf_Method.base,
/* Size */ sizeof(kui_class),
/* SizeOther */ 0,
/* Parameters */ 0,
/* Leaf SubMtd */ &g_fopAc_Method.base,
/* Priority */ PRIO_KUI,
/* Actor SubMtd */ &l_daKui_Method,
/* Status */ fopAcStts_CULL_e | fopAcStts_UNK4000_e | fopAcStts_UNK40000_e,
/* Group */ fopAc_ACTOR_e,
/* CullType */ fopAc_CULLBOX_CUSTOM_e,
};