tp/src/d/actor/d_a_obj_toby.cpp

742 lines
30 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file d_a_obj_toby.cpp
*
*/
#include "d/dolzel_rel.h"
#include "d/actor/d_a_obj_toby.h"
#include "d/actor/d_a_e_hz.h"
#include "d/actor/d_a_player.h"
#include "d/d_bg_w.h"
#include "d/d_bomb.h"
#include "d/d_com_inf_game.h"
#include "Z2AudioLib/Z2Instances.h"
#ifdef DEBUG
#include "d/d_debug_viewer.h"
#endif
/* 80D156D4-80D15794 000000 00C0+00 1/1 0/0 0/0 .data r05yuka_image */
static s8 r05yuka_image[192] = {
0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/* 80D15794-80D15854 0000C0 00C0+00 1/1 0/0 0/0 .data r11yuka_image */
static s8 r11yuka_image[192] = {
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/* 80D1378C-80D137B0 0000EC 0024+00 1/1 0/0 0/0 .text __ct__16daObj_Toby_HIO_cFv */
daObj_Toby_HIO_c::daObj_Toby_HIO_c() {
field_0x4 = -1;
field_0x8 = 1.0f;
}
/* 80D137B0-80D13870 000110 00C0+00 1/0 0/0 0/0 .text daObj_Toby_Draw__FP14obj_toby_class
*/
static int daObj_Toby_Draw(obj_toby_class* i_this) {
fopAc_ac_c* a_this = (fopAc_ac_c*)&i_this->mBase;
g_env_light.settingTevStruct(0x10, &a_this->current.pos, &a_this->tevStr);
yuka_s* pYuka = i_this->mYukas;
int roomNo = fopAcM_GetRoomNo(a_this);
for (int i = 0; i < i_this->mYukaNum; i++, pYuka++) {
if (pYuka->field_0x34 != 0) {
if (pYuka->field_0x34 == 1) {
dComIfGp_entrySimpleModel(pYuka->mModel1, roomNo);
} else {
dComIfGp_entrySimpleModel(pYuka->mModel2, roomNo);
}
}
}
#ifdef DEBUG
if (mDoCPd_c::getHoldY(PAD_2)) {
GXColor local_104;
local_104.r = 100;
local_104.g = 255;
local_104.b = 255;
local_104.a = 255;
cXyz local_100;
cXyz acStack_f0[16];
local_100.x = 0.0f;
local_100.y = 0.0f;
local_100.z = i_this->field_0x575 * 100.0f;
for (int i = 0; i < 16; i++) {
cMtx_YrotS(*calc_mtx, i << 12);
MtxPosition(&local_100, acStack_f0 + i);
acStack_f0[i] += a_this->current.pos;
}
for (int i = 0; i < 16; i++) {
dDbVw_drawLineXlu(acStack_f0[i], acStack_f0[(i + 1) & 0xf], local_104, 1, 12);
}
}
#endif
return 1;
}
/* 80D13870-80D139FC 0001D0 018C+00 1/1 0/0 0/0 .text s_bomb_sub__FPvPv */
static void* s_bomb_sub(void* param_1, void* param_2) {
if (fopAcM_IsActor(param_1)) {
fopAc_ac_c* actor = (fopAc_ac_c*)param_1;
if (dBomb_c::checkBombActor(actor)) {
dBomb_c* bomb = (dBomb_c*)actor;
if (bomb->checkStateExplode()) {
cXyz acStack_28 = *(cXyz*)((u8*)param_2 + 8) - bomb->current.pos;
if (acStack_28.abs() < 350.0f) {
return param_1;
}
}
}
}
return NULL;
}
/* 80D13A38-80D13ABC 000398 0084+00 1/1 0/0 0/0 .text shot_b_sub__FPvPv */
static void* shot_b_sub(void* param_1, void* param_2) {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
if (fopAcM_IsActor(param_1)) {
if (fopAcM_GetName(param_1) == PROC_BOOMERANG && daPy_py_c::checkBoomerangCharge() &&
fopAcM_GetParam(param_1) == 1) {
return param_1;
}
if (fopAcM_GetName(param_1) == PROC_E_MK_BO && (((fopAc_ac_c*)param_1)->field_0x560 != 0))
{
return param_1;
}
}
return NULL;
}
/* 80D158F4-80D158F8 -00001 0004+00 2/2 0/0 0/0 .bss None */
/* 80D158F4 0001+00 data_80D158F4 @1009 */
/* 80D158F5 0003+00 data_80D158F5 None */
static u8 l_HIOInit;
/* 80D15904-80D15910 000054 000C+00 2/2 0/0 0/0 .bss l_HIO */
static daObj_Toby_HIO_c l_HIO;
/* 80D15910-80D15914 000060 0004+00 1/2 0/0 0/0 .bss hz_check_pos_x */
static f32 hz_check_pos_x;
/* 80D15914-80D15918 000064 0004+00 1/2 0/0 0/0 .bss hz_check_pos_z */
static f32 hz_check_pos_z;
/* 80D13ABC-80D13B58 00041C 009C+00 1/1 0/0 0/0 .text s_hz_sub__FPvPv */
static void* s_hz_sub(void* param_1, void* param_2) {
if (fopAcM_IsActor(param_1)) {
if (fopAcM_GetName(param_1) == PROC_E_HZ) {
daE_HZ_c* hz = (daE_HZ_c*)param_1;
if (hz->isWait() == true) {
f32 xDiff = hz_check_pos_x - hz->current.pos.x;
f32 zDiff = hz_check_pos_z - hz->current.pos.z;
if (xDiff * xDiff + zDiff * zDiff < 1600.0f) {
return param_1;
}
}
}
}
return NULL;
}
/* 80D13B58-80D1417C 0004B8 0624+00 1/1 0/0 0/0 .text yuka_ground__FP14obj_toby_classP6yuka_s */
static void yuka_ground(obj_toby_class* i_this, yuka_s* pYuka) {
fopAc_ac_c* a_this = (fopAc_ac_c*)&i_this->mBase;
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
if (i_this->field_0x577 == 1) {
fopAc_ac_c* bomb = (fopAc_ac_c*)fpcM_Search(s_bomb_sub, pYuka);
if (bomb != 0) {
cXyz local_78 = pYuka->mPos - bomb->current.pos;
pYuka->mAngle.y = cM_atan2s(local_78.x, local_78.z);
pYuka->field_0x39 = 2;
}
cXyz cStack_84 = player->current.pos - pYuka->mPos;
if (cStack_84.abs() < 80.0f) {
player->onLeafSe();
}
} else {
hz_check_pos_x = pYuka->mPos.x;
hz_check_pos_z = pYuka->mPos.z;
if (fpcM_Search(s_hz_sub, i_this) != NULL) {
pYuka->field_0x34 = 0;
}
}
cXyz local_90;
f32 var_f31;
if (pYuka->field_0x3a == 0) {
if (i_this->field_0x577 == 1 && daPy_getPlayerActorClass()->checkWolfDig()) {
pYuka->field_0x3a = 20;
} else {
fopAc_ac_c* boomerang = (fopAc_ac_c*)fpcM_Search(shot_b_sub, i_this);
if (boomerang == NULL) {
return;
}
local_90 = boomerang->current.pos - pYuka->mPos;
var_f31 = 100.0f;
}
} else {
pYuka->field_0x3a--;
local_90 = daPy_getLinkPlayerActorClass()->getLeftHandPos();
local_90 -= pYuka->mPos;
f32 dVar12 = 50.0f;
if (JMAFastSqrt(local_90.x * local_90.x + local_90.z * local_90.z) < dVar12) {
if ((pYuka->field_0x3a & 3) == 0) {
pYuka->mAngle.y = cM_rndF(65536.0f);
}
if (pYuka->field_0x3a == 19) {
f32 scale = pYuka->mScale;
static cXyz sc(scale, scale, scale);
dComIfGp_particle_set(0x8272, &pYuka->mPos, &a_this->tevStr, &player->shape_angle, &sc);
Z2GetAudioMgr()->seStart(Z2SE_OBJ_PEEL_OFF_LEAVES, &pYuka->mPos, 0,
dComIfGp_getReverb(fopAcM_GetRoomNo(a_this)), 1.0f, 1.0f,
-1.0f, -1.0f, 0);
}
if (pYuka->field_0x3a == 0) {
pYuka->field_0x34 = 0;
}
}
return;
}
if (local_90.y > -50.0f && local_90.y < 400.0f &&
JMAFastSqrt(local_90.x * local_90.x + local_90.z * local_90.z) < var_f31)
{
if (i_this->field_0x577 == 1) {
if (i_this->mSwBit != 0xff) {
dComIfGs_onSwitch(i_this->mSwBit, fopAcM_GetRoomNo(a_this));
for (int i = 0; i < i_this->mYukaNum; i++) {
if (i_this->mYukas[i].field_0x34 != 0) {
i_this->mYukas[i].field_0x39 = 1;
}
}
i_this->field_0x6350 = 1;
} else {
pYuka->field_0x39 = 1;
}
} else {
pYuka->field_0x34 = 2;
pYuka->field_0x38 = cM_rndF(30.0f) + 60.0f;
pYuka->mAngleSpeed.y = -(cM_rndF(500.0f) + 4000.0f);
pYuka->mAngleSpeed.x = cM_rndFX(2000.0f);
pYuka->mAngleSpeed.z = cM_rndFX(2000.0f);
pYuka->mSpeed.x = cM_rndFX(2.0f);
pYuka->mSpeed.y = cM_rndF(10.0f);
pYuka->mSpeed.z = cM_rndFX(2.0f);
dComIfG_Bgsp().Release(pYuka->mBgW);
pYuka->mBgW = NULL;
Z2GetAudioMgr()->seStart(Z2SE_OBJ_PEEL_OFF_TILE, &pYuka->mPos, 0,
dComIfGp_getReverb(fopAcM_GetRoomNo(a_this)), 1.0f, 1.0f,
-1.0f, -1.0f, 0);
if (i_this->mSwBit != 0xff) {
dComIfGs_onSwitch(i_this->mSwBit, fopAcM_GetRoomNo(a_this));
}
}
}
}
/* 80D1417C-80D14264 000ADC 00E8+00 1/1 0/0 0/0 .text yuka_fly__FP14obj_toby_classP6yuka_s */
static void yuka_fly(obj_toby_class* i_this, yuka_s* pYuka) {
pYuka->mAngle += pYuka->mAngleSpeed;
pYuka->mPos += pYuka->mSpeed;
pYuka->mSpeed.y += 5.0f;
if (pYuka->mSpeed.y > 50.0f) {
pYuka->mSpeed.y = 50.0f;
}
if (pYuka->field_0x38 == 0) {
pYuka->field_0x34 = 0;
}
pYuka->mParticle = dComIfGp_particle_set(pYuka->mParticle, 0x8343, &pYuka->mPos, 0, 0);
}
/* 80D14264-80D14384 000BC4 0120+00 1/1 0/0 0/0 .text yuka_mtxset__FP14obj_toby_classP6yuka_s */
static void yuka_mtxset(obj_toby_class* i_this, yuka_s* pYuka) {
mDoMtx_stack_c::transS(pYuka->mPos.x, pYuka->mPos.y, pYuka->mPos.z);
mDoMtx_stack_c::YrotM(pYuka->mAngle.y);
mDoMtx_stack_c::XrotM(pYuka->mAngle.x);
mDoMtx_stack_c::ZrotM(pYuka->mAngle.z);
mDoMtx_stack_c::scaleM(pYuka->mScale, 1.0, pYuka->mScale);
if (i_this->field_0x577 == 0 && pYuka->field_0x34 == 1) {
pYuka->mModel1->setBaseTRMtx(mDoMtx_stack_c::get());
cXyz cStack_28 = dComIfGp_getPlayer(0)->current.pos - pYuka->mPos;
MTXCopy(mDoMtx_stack_c::get(), pYuka->mMtx);
pYuka->mBgW->Move();
} else {
pYuka->mModel2->setBaseTRMtx(mDoMtx_stack_c::get());
}
}
/* 80D14384-80D14584 000CE4 0200+00 1/1 0/0 0/0 .text yuka_control__FP14obj_toby_class */
static void yuka_control(obj_toby_class* i_this) {
fopAc_ac_c* a_this = (fopAc_ac_c*)i_this;
yuka_s* pYuka = i_this->mYukas;
for (int i = 0; i < i_this->mYukaNum; i++, pYuka++) {
if (pYuka->field_0x34 != 0) {
if (pYuka->field_0x38 != 0) {
pYuka->field_0x38--;
}
if (pYuka->field_0x34 == 1) {
yuka_ground(i_this, pYuka);
} else {
yuka_fly(i_this, pYuka);
}
yuka_mtxset(i_this, pYuka);
if (pYuka->field_0x39 != 0) {
pYuka->field_0x34 = 0;
f32 scale = pYuka->mScale;
static cXyz sc(scale, scale, scale);
if (pYuka->field_0x39 == 1) {
dComIfGp_particle_set(0x8254, &pYuka->mPos, &a_this->tevStr, &pYuka->mAngle,
&sc);
} else {
dComIfGp_particle_set(0x8255, &pYuka->mPos, &a_this->tevStr, &pYuka->mAngle,
&sc);
}
Z2GetAudioMgr()->seStart(Z2SE_OBJ_PEEL_OFF_LEAVES, &pYuka->mPos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(a_this)), 1.0f, 1.0f, -1.0f, -1.0f,
0);
}
}
}
}
/* 80D14584-80D14810 000EE4 028C+00 1/1 0/0 0/0 .text demo_camera__FP14obj_toby_class */
static void demo_camera(obj_toby_class* i_this) {
fopAc_ac_c* a_this = (fopAc_ac_c*)i_this;
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
cXyz acStack_2c;
cXyz cStack_38;
cXyz cStack_44;
cXyz cStack_50;
switch (i_this->field_0x6350) {
case 0:
break;
case 1:
if (!a_this->eventInfo.checkCommandDemoAccrpt()) {
fopAcM_orderPotentialEvent(a_this, 2, 0xffff, 0);
a_this->eventInfo.onCondition(dEvtCnd_CANDEMO_e);
return;
}
camera->mCamera.Stop();
i_this->field_0x6350 = 2;
i_this->field_0x6352 = 0;
i_this->field_0x636c = 55.0f;
camera->mCamera.SetTrimSize(3);
// fallthrough
case 2:
i_this->field_0x6360 = a_this->current.pos;
i_this->field_0x6360.y += 50.0f;
i_this->field_0x6354 = a_this->current.pos;
i_this->field_0x6354.x += 800.0f;
i_this->field_0x6354.y += 200.0f;
i_this->field_0x6354.z += 600.0f;
cLib_addCalc2(&i_this->field_0x636c, 30.0f, 0.1f, 0.5f);
if (i_this->field_0x6352 == 40) {
mDoAud_seStart(Z2SE_READ_RIDDLE_A, 0, 0, 0);
}
if (i_this->field_0x6352 == 110) {
camera->mCamera.Reset(i_this->field_0x6360, i_this->field_0x6354);
camera->mCamera.Start();
camera->mCamera.SetTrimSize(0);
dComIfGp_event_reset();
i_this->field_0x6350 = 0;
}
break;
}
if (i_this->field_0x6350 != 0) {
cXyz cStack_5c(i_this->field_0x6360);
cXyz cStack_68(i_this->field_0x6354);
camera->mCamera.Set(cStack_5c, cStack_68, i_this->field_0x636c, 0);
i_this->field_0x6352 = i_this->field_0x6352 + 1;
}
}
/* 80D14810-80D14884 001170 0074+00 2/1 0/0 0/0 .text daObj_Toby_Execute__FP14obj_toby_class */
static int daObj_Toby_Execute(obj_toby_class* i_this) {
i_this->field_0x580++;
for (int i = 0; i < 2; i++) {
if (i_this->field_0x586[i] != 0) {
i_this->field_0x586[i]--;
}
}
yuka_control(i_this);
demo_camera(i_this);
return 1;
}
/* 80D14884-80D1488C 0011E4 0008+00 1/0 0/0 0/0 .text daObj_Toby_IsDelete__FP14obj_toby_class */
static int daObj_Toby_IsDelete(obj_toby_class* param_0) {
return 1;
}
/* 80D1488C-80D149DC 0011EC 0150+00 1/0 0/0 0/0 .text daObj_Toby_Delete__FP14obj_toby_class */
static int daObj_Toby_Delete(obj_toby_class* i_this) {
static int const l_bmdidx[2] = {4, 5};
fopAc_ac_c* a_this = (fopAc_ac_c*)i_this;
fopAcM_GetID(i_this);
if (i_this->field_0x6371 != 0) {
if (i_this->field_0x577 == 0) {
for (u32 i = 0; i < 2; i++) {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mArcName, l_bmdidx[i]);
dComIfGp_removeSimpleModel(modelData, fopAcM_GetRoomNo(a_this));
}
yuka_s* pYuka = i_this->mYukas;
for (int i = 0; i < i_this->mYukaNum; i++, pYuka++) {
if (pYuka->mBgW != NULL) {
dComIfG_Bgsp().Release(pYuka->mBgW);
}
}
} else if (i_this->field_0x577 == 1) {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mArcName, 6);
dComIfGp_removeSimpleModel(modelData, fopAcM_GetRoomNo(a_this));
}
i_this->field_0x6371 = 0;
}
dComIfG_resDelete(&i_this->mPhase, i_this->mArcName);
if (i_this->field_0x6370 != 0) {
l_HIOInit = 0;
mDoHIO_DELETE_CHILD(l_HIO.field_0x4);
}
return 1;
}
/* 80D149DC-80D14BD4 00133C 01F8+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */
// nonmatching - regalloc
static int useHeapInit(fopAc_ac_c* a_this) {
obj_toby_class* i_this = (obj_toby_class*)a_this;
J3DModelData* modelData;
J3DModelData* modelData2;
yuka_s* pYuka;
if (i_this->field_0x577 == 0) {
modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mArcName, 4);
JUT_ASSERT(868, modelData != 0);
modelData2 = (J3DModelData*)dComIfG_getObjectRes(i_this->mArcName, 5);
// !@bug assert on wrong variable. not really meaningful.
JUT_ASSERT(872, modelData != 0);
pYuka = i_this->mYukas;
for (int i = 0; i < i_this->mYukaNum; i++, pYuka++) {
i_this->mYukas[i].mModel1 = mDoExt_J3DModel__create(modelData, 0x20000, 0x11000084);
if (i_this->mYukas[i].mModel1 == NULL) {
return 0;
}
i_this->mYukas[i].mModel2 = mDoExt_J3DModel__create(modelData2, 0x20000, 0x11000084);
if (i_this->mYukas[i].mModel2 == NULL) {
return 0;
}
pYuka->mBgW = new dBgW();
if (pYuka->mBgW == NULL) {
return 0;
}
if (pYuka->mBgW->Set((cBgD_t*)dComIfG_getObjectRes(i_this->mArcName, 9), 1, &pYuka->mMtx) == 1) {
return 0;
}
}
} else if (i_this->field_0x577 == 1) {
a_this->field_0x567 = 1;
modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mArcName, 6);
JUT_ASSERT(907, modelData != 0);
for (int i = 0; i < i_this->mYukaNum; i++) {
i_this->mYukas[i].mModel1 = mDoExt_J3DModel__create(modelData, 0x20000, 0x11000084);
if (i_this->mYukas[i].mModel1 == NULL) {
return 0;
}
i_this->mYukas[i].mModel2 = i_this->mYukas[i].mModel1;
}
}
return 1;
}
/* 80D14BD4-80D14CFC 001534 0128+00 1/1 0/0 0/0 .text set_pos_check__FP14obj_toby_classi
*/
static int set_pos_check(obj_toby_class* i_this, int param_2) {
fopAc_ac_c* a_this = (fopAc_ac_c*)i_this;
for (int i = 0; i < param_2; i++) {
f32 fVar5 = i_this->mYukas[i].mPos.x - i_this->mYukas[param_2].mPos.x;
f32 fVar6 = i_this->mYukas[i].mPos.z - i_this->mYukas[param_2].mPos.z;
f32 dVar10 = JMAFastSqrt(fVar5 * fVar5 + fVar6 * fVar6);
if (dVar10 < i_this->field_0x57c * 0.6f) {
return 0;
}
if (dVar10 < i_this->field_0x57c * 1.0f) {
i_this->mYukas[param_2].mPos.y = i_this->mYukas[i].mPos.y + 0.1f;
if (i_this->mYukas[param_2].mPos.y > a_this->current.pos.y + 8.0f) {
i_this->mYukas[param_2].mPos.y =
(a_this->current.pos.y + 2.5f) + cM_rndF(4.0f);
}
}
}
return 1;
}
/* 80D14CFC-80D154F4 00165C 07F8+00 1/0 0/0 0/0 .text daObj_Toby_Create__FP10fopAc_ac_c
*/
static int daObj_Toby_Create(fopAc_ac_c* a_this) {
static u32 const l_bmdidx[2] = {4, 5};
fopAcM_SetupActor(a_this, obj_toby_class);
obj_toby_class* i_this = (obj_toby_class*)a_this;
if (strcmp(dComIfGp_getStartStageName(), "D_MN07") == 0) {
i_this->mArcName = "Obj_Tob7";
} else {
i_this->mArcName = "Obj_Toby";
}
int rv = dComIfG_resLoad(&i_this->mPhase, i_this->mArcName);
if (rv == cPhs_COMPLEATE_e) {
OS_REPORT("OBJ_TOBY PARAM %x\n", fopAcM_GetParam(a_this));
i_this->field_0x574 = fopAcM_GetParam(a_this) & 0xff;
i_this->field_0x575 = (fopAcM_GetParam(a_this) & 0xff00) >> 8;
i_this->field_0x576 = (fopAcM_GetParam(a_this) >> 16) & 0xf;
if (i_this->field_0x576 == 15) {
i_this->field_0x576 = 0;
}
i_this->field_0x577 = (fopAcM_GetParam(a_this) >> 20) & 0xf;
if (i_this->field_0x577 == 15) {
i_this->field_0x577 = 0;
}
i_this->mSwBit = (fopAcM_GetParam(a_this) & 0xff000000) >> 24;
cXyz cStack_38(a_this->home.pos);
if (i_this->field_0x577 == 3) {
i_this->mYukaNum = 0;
s8* local_64;
if (fopAcM_GetRoomNo(a_this) == 5) {
local_64 = r05yuka_image;
} else {
local_64 = r11yuka_image;
}
for (int i = 0; i < 192; i++) {
if (local_64[i] != 0) {
i_this->mYukaNum++;
}
}
i_this->field_0x577 = 0;
OS_REPORT("OBJ_TOBY//////////////OBJ_TOBY SET 1 !!\n");
if (!fopAcM_entrySolidHeap(a_this, useHeapInit, 0x8004b000)) {
OS_REPORT("//////////////OBJ_TOBY SET NON !!\n");
return cPhs_ERROR_e;
}
OS_REPORT("//////////////OBJ_TOBY SET 2 !!\n");
yuka_s* pYuka = i_this->mYukas;
for (int i = 0; i < i_this->mYukaNum; i++, pYuka++)
{
if (pYuka->mBgW != NULL) {
if (dComIfG_Bgsp().Regist(pYuka->mBgW, a_this) != 0) {
return cPhs_ERROR_e;
}
}
}
a_this->home.pos.y += 15.0f;
int yukaIndex = 0;
cXyz local_44;
local_44.y = 0.0f;
for (int i = 0; (int)i < 192; i ++) {
if (local_64[i] != 0) {
local_44.x = (i & 0xf) * 150.0f;
local_44.z = ((i >> 4) & 0xf) * 150.0f;
i_this->mYukas[yukaIndex].field_0x34 = 1;
i_this->mYukas[yukaIndex].mPos = a_this->home.pos + local_44;
i_this->mYukas[yukaIndex].field_0x36 = cM_rndF(65536.0f);
i_this->mYukas[yukaIndex].mScale = 1.0f;
yukaIndex++;
}
}
} else {
if (i_this->field_0x577 == 0) {
i_this->mYukaNum = i_this->field_0x574 * i_this->field_0x575;
} else if (i_this->field_0x576 == 1) {
i_this->mYukaNum = i_this->field_0x575 * 1.5f;
} else {
i_this->mYukaNum = i_this->field_0x575 * 3;
}
if (i_this->field_0x576 == 1) {
i_this->mYukaNum <<= 2;
}
if (i_this->mYukaNum > 200) {
i_this->mYukaNum = 200;
}
OS_REPORT("OBJ_TOBY//////////////OBJ_TOBY SET 1 !!\n");
if (!fopAcM_entrySolidHeap(a_this, useHeapInit, 0x8004b000)) {
OS_REPORT("//////////////OBJ_TOBY SET NON !!\n");
return cPhs_ERROR_e;
}
OS_REPORT("//////////////OBJ_TOBY SET 2 !!\n");
if (!l_HIOInit) {
i_this->field_0x6370 = 1;
l_HIOInit = 1;
l_HIO.field_0x4 = mDoHIO_CREATE_CHILD("飛び床", &l_HIO);
}
if (i_this->field_0x577 == 0) {
yuka_s* pYuka = i_this->mYukas;
for (int i = 0; i < i_this->mYukaNum; i++, pYuka++)
{
if (pYuka->mBgW != NULL) {
if (dComIfG_Bgsp().Regist(pYuka->mBgW, a_this) != 0) {
return cPhs_ERROR_e;
}
}
}
int yukaIndex = 0;
int local_90;
if (i_this->field_0x576 == 1) {
i_this->field_0x57c = 75.0f;
a_this->home.pos.x -= 32.5f;
a_this->home.pos.z -= 32.5f;
local_90 = 2;
} else {
i_this->field_0x57c = 150.0f;
local_90 = 1;
}
a_this->home.pos.y += 15.0f;
for (int i = 0; i < i_this->field_0x574 * local_90; i++) {
for (int j = 0; j < i_this->field_0x575 * local_90; j++) {
i_this->mYukas[yukaIndex].field_0x34 = 1;
i_this->mYukas[yukaIndex].mPos.x = a_this->home.pos.x + i * i_this->field_0x57c;
i_this->mYukas[yukaIndex].mPos.y = a_this->home.pos.y;
i_this->mYukas[yukaIndex].mPos.z = a_this->home.pos.z + j * i_this->field_0x57c;
i_this->mYukas[yukaIndex].field_0x36 = cM_rndF(65536.0f);
if (i_this->field_0x576 == 1) {
i_this->mYukas[yukaIndex].mScale = 0.5f;
} else {
i_this->mYukas[yukaIndex].mScale = 1.0f;
}
yukaIndex++;
}
}
} else {
OS_REPORT("//////////////OBJ_TOBY SET MAX %d\n", i_this->mYukaNum);
if (i_this->field_0x576 == 1) {
i_this->field_0x57c = 155.0f;
} else {
i_this->field_0x57c = 250.0f;
}
cXyz cStack_50(0.0f, 0.2f, 0.0f);
int local_9c = 0;
for (int i = 0; i < i_this->mYukaNum; i++) {
cMtx_YrotS(*calc_mtx, cM_rndF(65536.0f));
MtxPosition(&cStack_50, &i_this->mYukas[i].mPos);
i_this->mYukas[i].mPos += a_this->current.pos;
if (set_pos_check(i_this, i)) {
i_this->mYukas[i].field_0x34 = 1;
i_this->mYukas[i].field_0x36 = cM_rndF(65536.0f);
if (i_this->field_0x576 == 1) {
i_this->mYukas[i].mScale = 0.5f;
} else {
i_this->mYukas[i].mScale = 1.0f;
}
i_this->mYukas[i].mAngle.y = cM_rndF(65536.0f);
i_this->mYukas[i].mScale *= cM_rndF(0.15f) + 1.0f;
} else {
i--;
local_9c++;
if (local_9c > 1000) {
// Designated area of leaves is too narrow to place
OS_REPORT(" 葉っぱの指定範囲が狭すぎて置けません!!!!\n");
return cPhs_ERROR_e;
}
}
cStack_50.z = cM_rndF(i_this->field_0x575 * 100.0f);
}
OS_REPORT("//////////////OBJ_TOBY SET 4 !!\n");
}
}
i_this->field_0x580 = fopAcM_GetID(a_this);
daObj_Toby_Execute(i_this);
if (i_this->field_0x577 == 0) {
for (u32 i = 0; i < 2; i++) {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mArcName, l_bmdidx[i]);
JUT_ASSERT(1341, modelData != 0);
if (dComIfGp_addSimpleModel(modelData, fopAcM_GetRoomNo(a_this), 1) == -1) {
// Skipping floor: simple model registration failed
OS_REPORT("\x1B" "[43;30m飛び床シンプルモデル登録失敗しました。\n" "\x1B" "[m");
}
i_this->field_0x6371 = 1;
}
} else if (i_this->field_0x577 == 1) {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mArcName, 6);
JUT_ASSERT(1351, modelData != 0);
if (dComIfGp_addSimpleModel(modelData, fopAcM_GetRoomNo(a_this), 1) == -1) {
//Skipping leaves: simple model registration failed.
OS_REPORT("\x1B" "[43;30m飛び葉シンプルモデル登録失敗しました。\n" "\x1B" "[m");
}
i_this->field_0x6371 = 1;
}
}
return rv;
}
AUDIO_INSTANCES;
/* 80D15854-80D15874 -00001 0020+00 1/0 0/0 0/0 .data l_daObj_Toby_Method */
static actor_method_class l_daObj_Toby_Method = {
(process_method_func)daObj_Toby_Create,
(process_method_func)daObj_Toby_Delete,
(process_method_func)daObj_Toby_Execute,
(process_method_func)daObj_Toby_IsDelete,
(process_method_func)daObj_Toby_Draw,
};
/* 80D15874-80D158A4 -00001 0030+00 0/0 0/0 1/0 .data g_profile_OBJ_TOBY */
extern actor_process_profile_definition g_profile_OBJ_TOBY = {
fpcLy_CURRENT_e, // mLayerID
3, // mListID
fpcPi_CURRENT_e, // mListPrio
PROC_OBJ_TOBY, // mProcName
&g_fpcLf_Method.base, // sub_method
sizeof(obj_toby_class), // mSize
0, // mSizeOther
0, // mParameters
&g_fopAc_Method.base, // sub_method
58, // mPriority
&l_daObj_Toby_Method, // sub_method
0x00044000, // mStatus
fopAc_ACTOR_e, // mActorType
fopAc_CULLBOX_CUSTOM_e, // cullType
};
/* 80D156B8-80D156B8 0000D0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */