mirror of https://github.com/zeldaret/tp.git
742 lines
30 KiB
C++
742 lines
30 KiB
C++
/**
|
||
* @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 */
|