Files
dusklight/src/d/actor/d_a_obj_carry.cpp
T

4322 lines
123 KiB
C++

/**
* @file d_a_obj_carry.cpp
* @brief Actor - Various carriable objects
*/
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_obj_carry.h"
#include "d/actor/d_a_player.h"
#include <cmath>
#include "d/d_com_inf_game.h"
#include "SSystem/SComponent/c_math.h"
#include "d/actor/d_a_obj_swBallA.h"
#include "d/actor/d_a_obj_swBallB.h"
#include "d/actor/d_a_tag_setBall.h"
#include "d/actor/d_a_mirror.h"
#include "d/actor/d_a_obj_burnbox.h"
#include "d/d_tresure.h"
#include "d/d_s_play.h"
#include "d/d_lib.h"
#include "d/d_debug_viewer.h"
#include "f_op/f_op_kankyo_mng.h"
static const cM3dGCylS l_cyl_info[] = {
{ 0.0f, 0.0f, 0.0f, 30.0f, 100.0f },
{ 0.0f, 0.0f, 0.0f, 50.0f, 100.0f },
{ 0.0f, 0.0f, 0.0f, 37.0f, 100.0f },
{ 0.0f, 0.0f, 0.0f, 40.0f, 100.0f },
{ 0.0f, 0.0f, 0.0f, 50.0f, 100.0f },
{ 0.0f, 0.0f, 0.0f, 30.0f, 100.0f },
{ 0.0f, 0.0f, 0.0f, 24.0f, 100.0f },
{ 0.0f, 0.0f, 0.0f, 30.0f, 100.0f },
{ 0.0f, 0.0f, 0.0f, 40.0f, 80.0f },
{ 0.0f, 0.0f, 0.0f, 40.0f, 80.0f },
{ 0.0f, 0.0f, 0.0f, 50.0f, 100.0f },
{ 0.0f, 0.0f, 0.0f, 40.0f, 80.0f },
{ 0.0f, 0.0f, 0.0f, 30.0f, 100.0f },
{ 0.0f, 0.0f, 0.0f, 50.0f, 100.0f },
};
const daObjCarry_dt_t daObjCarry_c::mData[] = {
// TYPE_TSUBO
{
27.0f,
36.0f,
30.0f,
80.0f,
0.6f,
0.6f,
-6.0f,
4.0f,
0.4f,
25.0f,
0.0f,
28.0f,
1.0f,
42,
0,
200,
2,
0.0f,
28.0f,
0.0f,
48.0f,
30.0f,
30.0f,
48.0f,
250.0f,
0.0f,
JA_SE_OBJ_BREAK_CHINA_S,
JA_SE_OBJ_PUT_POT_S,
Z2SE_OBJ_PUT_WATER_S,
JA_SE_OBJ_FALL_MAGMA_S,
Z2SE_OBJ_FALL_WATER_S,
0xD,
40.0f,
0x50,
0x2D,
0x2D,
10.0f,
0.1f,
1.0f,
1.0f,
0xA00,
},
// TYPE_OOTSUBO
{
22.0f,
43.0f,
30.0f,
80.0f,
0.6f,
0.6f,
-6.5f,
3.0f,
0.4f,
35.0f,
0.0f,
50.0f,
1.0f,
42,
4,
200,
3,
0.0f,
48.0f,
0.0f,
68.0f,
50.0f,
50.0f,
50.0f,
250.0f,
0.0f,
JA_SE_OBJ_BREAK_CHINA_L,
JA_SE_OBJ_PUT_POT_L,
Z2SE_OBJ_PUT_WATER_M,
JA_SE_OBJ_FALL_MAGMA_M,
Z2SE_OBJ_FALL_WATER_M,
0xD,
50.0f,
0x50,
0x14,
0x14,
10.0f,
0.1f,
1.5f,
1.5f,
0xA00,
},
// TYPE_KIBAKO
{
27.0f,
36.0f,
30.0f,
80.0f,
0.6f,
0.6f,
-6.0f,
8.0f,
0.4f,
30.0f,
0.0f,
37.5f,
0.5f,
42,
1,
200,
2,
0.0f,
28.0f,
0.0f,
50.0f,
37.5f,
30.0f,
50.0f,
500.0f,
0.0f,
Z2SE_OBJ_BREAK_WOOD_S,
Z2SE_OBJ_PUT_WBOX_S,
Z2SE_OBJ_PUT_WATER_S,
JA_SE_OBJ_FALL_MAGMA_S,
Z2SE_OBJ_FALL_WATER_S,
0xB,
87.0f,
0x59,
0x2D,
0x2D,
10.0f,
0.1f,
1.5f,
1.0f,
0xA00,
},
// TYPE_IRON_BALL
{
25.0f,
30.0f,
30.0f,
80.0f,
0.1f,
0.55f,
-6.0f,
2.5f,
0.4f,
0.0f,
35.0f,
0.0f,
1.0f,
42,
8,
200,
3,
0.0f,
0.0f,
0.0f,
40.0f,
0.0f,
30.0f,
40.0f,
1000000.0f,
50.0f,
Z2SE_OBJ_BREAK_WOOD_S,
Z2SE_OBJ_IRONBALL_HIT,
Z2SE_OBJ_PUT_WATER_M,
JA_SE_OBJ_FALL_MAGMA_S,
Z2SE_OBJ_FALL_WATER_S,
0xB,
40.0f,
0x2,
0x8C,
0x8C,
50.0f,
0.1f,
1.5f,
1.5f,
0x1000,
},
// TYPE_TARU
{
22.0f,
43.0f,
30.0f,
80.0f,
0.6f,
0.6f,
-6.5f,
10.0f,
0.4f,
40.0f,
0.0f,
50.0f,
1.0f,
42,
4,
200,
3,
0.0f,
48.0f,
0.0f,
68.0f,
50.0f,
50.0f,
50.0f,
500.0f,
0.0f,
Z2SE_OBJ_BREAK_BARREL,
Z2SE_OBJ_PUT_WBOX_S,
Z2SE_OBJ_PUT_WATER_M,
JA_SE_OBJ_FALL_MAGMA_M,
Z2SE_OBJ_FALL_WATER_M,
0xD,
50.0f,
0x59,
0x28,
0x28,
10.0f,
0.1f,
2.0f,
1.5f,
0xA00,
},
// TYPE_DOKURO
{
27.0f,
36.0f,
30.0f,
80.0f,
0.6f,
0.6f,
-6.0f,
4.0f,
0.4f,
10.0f,
0.0f,
28.0f,
1.0f,
42,
0,
200,
2,
0.0f,
28.0f,
0.0f,
48.0f,
30.0f,
30.0f,
48.0f,
250.0f,
0.0f,
Z2SE_OBJ_SKULL_BREAK,
Z2SE_OBJ_SKULL_PUT,
Z2SE_OBJ_PUT_WATER_S,
JA_SE_OBJ_FALL_MAGMA_S,
Z2SE_OBJ_FALL_WATER_S,
0xD,
40.0f,
0x59,
0x32,
0x32,
10.0f,
0.1f,
1.0f,
1.0f,
0xA00,
},
// TYPE_BOKKURI
{
0.0f,
100.0f,
30.0f,
80.0f,
0.6f,
0.3f,
-6.5f,
8.0f,
0.4f,
30.0f,
0.0f,
50.0f,
0.6f,
42,
0,
200,
2,
0.0f,
48.0f,
0.0f,
60.0f,
45.0f,
30.0f,
60.0f,
250.0f,
0.0f,
Z2SE_OBJ_BOKKURI_BURST,
Z2SE_OBJ_BOKKURI_PUT,
Z2SE_OBJ_PUT_WATER_S,
JA_SE_OBJ_FALL_MAGMA_M,
Z2SE_OBJ_FALL_WATER_M,
0xD,
45.0f,
0x50,
0x1E,
0x1E,
10.0f,
0.15f,
1.5f,
1.5f,
0xA00,
},
// TYPE_TSUBO_2
{
27.0f,
36.0f,
30.0f,
80.0f,
0.6f,
0.6f,
-6.0f,
4.0f,
0.4f,
25.0f,
0.0f,
28.0f,
1.0f,
42,
0,
200,
2,
0.0f,
28.0f,
0.0f,
48.0f,
30.0f,
30.0f,
48.0f,
250.0f,
0.0f,
JA_SE_OBJ_BREAK_CHINA_S,
JA_SE_OBJ_PUT_POT_S,
Z2SE_OBJ_PUT_WATER_S,
JA_SE_OBJ_FALL_MAGMA_S,
Z2SE_OBJ_FALL_WATER_S,
0xD,
40.0f,
0x50,
0x2D,
0x2D,
10.0f,
0.1f,
1.0f,
1.0f,
0xA00,
},
// TYPE_BALL_S
{
27.0f,
36.0f,
30.0f,
80.0f,
0.7f,
0.7f,
-6.0f,
2.5f,
0.4f,
0.0f,
40.0f,
0.0f,
1.0f,
45,
0,
200,
3,
0.0f,
0.0f,
0.0f,
60.0f,
40.0f,
50.0f,
60.0f,
1000000.0f,
50.0f,
Z2SE_OBJ_BREAK_WOOD_S,
Z2SE_OBJ_L8_L_BALL_BOUND,
Z2SE_OBJ_PUT_WATER_M,
JA_SE_OBJ_FALL_MAGMA_S,
Z2SE_OBJ_FALL_WATER_S,
0xB,
40.0f,
0x2,
0x4B,
0x6E,
10.0f,
0.015f,
1.5f,
1.5f,
0x1000,
},
// TYPE_BALL_S_2
{
27.0f,
36.0f,
30.0f,
80.0f,
0.7f,
0.7f,
-6.0f,
2.5f,
0.4f,
0.0f,
40.0f,
0.0f,
1.0f,
45,
0,
200,
3,
0.0f,
0.0f,
0.0f,
100.0f,
40.0f,
50.0f,
40.0f,
1000000.0f,
50.0f,
Z2SE_OBJ_BREAK_WOOD_S,
Z2SE_OBJ_L8_L_BALL_BOUND,
Z2SE_OBJ_PUT_WATER_M,
JA_SE_OBJ_FALL_MAGMA_S,
Z2SE_OBJ_FALL_WATER_S,
0xB,
40.0f,
0x2,
0x4B,
0x6E,
10.0f,
0.015f,
2.0f,
2.0f,
0x1000,
},
// TYPE_AOTSUBO
{
22.0f,
43.0f,
30.0f,
80.0f,
0.6f,
0.6f,
-6.5f,
3.0f,
0.4f,
35.0f,
0.0f,
50.0f,
1.0f,
42,
4,
200,
3,
0.0f,
48.0f,
0.0f,
68.0f,
50.0f,
50.0f,
68.0f,
250.0f,
0.0f,
JA_SE_OBJ_BREAK_CHINA_L,
JA_SE_OBJ_PUT_POT_L,
Z2SE_OBJ_PUT_WATER_M,
JA_SE_OBJ_FALL_MAGMA_M,
Z2SE_OBJ_FALL_WATER_M,
0xD,
50.0f,
0x50,
0x14,
0x14,
10.0f,
0.1f,
1.5f,
1.5f,
0xA00,
},
// TYPE_LV8_BALL
{
27.0f,
36.0f,
30.0f,
80.0f,
0.7f,
0.7f,
-6.0f,
2.5f,
0.4f,
0.0f,
40.0f,
0.0f,
1.0f,
45,
0,
200,
3,
0.0f,
0.0f,
0.0f,
60.0f,
40.0f,
50.0f,
60.0f,
1000000.0f,
50.0f,
Z2SE_OBJ_BREAK_WOOD_S,
Z2SE_OBJ_L8_L_BALL_BOUND,
Z2SE_OBJ_PUT_WATER_M,
JA_SE_OBJ_FALL_MAGMA_S,
Z2SE_OBJ_FALL_WATER_S,
0xB,
40.0f,
0x2,
0x4B,
0x6E,
10.0f,
0.015f,
1.5f,
1.5f,
0x1000,
},
// TYPE_TSUBO_S
{
27.0f,
36.0f,
30.0f,
80.0f,
0.6f,
0.6f,
-6.0f,
4.0f,
0.4f,
25.0f,
0.0f,
28.0f,
1.0f,
42,
0,
200,
2,
0.0f,
28.0f,
0.0f,
48.0f,
30.0f,
30.0f,
48.0f,
250.0f,
0.0f,
JA_SE_OBJ_BREAK_CHINA_S,
JA_SE_OBJ_PUT_POT_S,
Z2SE_OBJ_PUT_WATER_S,
JA_SE_OBJ_FALL_MAGMA_S,
Z2SE_OBJ_FALL_WATER_S,
0xD,
40.0f,
0x50,
0x2D,
0x2D,
10.0f,
0.1f,
1.0f,
1.0f,
0xA00,
},
// TYPE_TSUBO_B
{
22.0f,
43.0f,
30.0f,
80.0f,
0.6f,
0.6f,
-6.5f,
3.0f,
0.4f,
35.0f,
0.0f,
50.0f,
1.0f,
42,
4,
200,
3,
0.0f,
48.0f,
0.0f,
68.0f,
50.0f,
50.0f,
50.0f,
250.0f,
0.0f,
JA_SE_OBJ_BREAK_CHINA_L,
JA_SE_OBJ_PUT_POT_L,
Z2SE_OBJ_PUT_WATER_M,
JA_SE_OBJ_FALL_MAGMA_M,
Z2SE_OBJ_FALL_WATER_M,
0xD,
50.0f,
0x50,
0x14,
0x14,
10.0f,
0.1f,
1.5f,
1.5f,
0xA00,
},
};
const static dCcD_SrcCyl l_cyl_src = {
{
{0x0, {{AT_TYPE_THROW_OBJ, 0x2, 0x1f}, {0xd8fbfdff, 0x1f}, 0x79}}, // mObj
{dCcD_SE_THROW_OBJ, 0x1, 0x0, 0x0, 0x1}, // mGObjAt
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x6}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{
{0.0f, 0.0f, 0.0f}, // mCenter
10.0f, // mRadius
50.0f // mHeight
} // mCyl
} // mCylAttr
};
const static dCcD_SrcSph l_light_at_sph_src = {
{
{0x0, {{AT_TYPE_LANTERN_SWING, 0x0, 0x11}, {0x0, 0x10}, 0x0}}, // mObj
{dCcD_SE_NONE, 0x0, 0x0, dCcD_MTRL_LIGHT, 0x0}, // mGObjAt
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{{0.0f, 0.0f, 0.0f}, 500.0f} // mSph
} // mSphAttr
};
const static dCcD_SrcCps l_atCpsSrc = {
{
{0x0, {{AT_TYPE_IRON_BALL, 0x64, 0x1f}, {0x0, 0x10}, 0x0}}, // mObj
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x1}, // mGObjAt
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x6}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{{0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, 40.0f}, // mCps
} // mCpsAttr
};
const static dCcD_SrcCyl l_tg_cyl = {
{
{0x0, {{0x0, 0x0, 0x1e}, {0x200, 0x11}, 0x0}}, // mObj
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x1}, // mGObjAt
{dCcD_SE_WOLF_KICK, 0x0, 0x0, 0x0, 0x4}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{
{0.0f, 0.0f, 0.0f}, // mCenter
40.0f, // mRadius
60.0f // mHeight
} // mCyl
} // mCylAttr
};
static const GXColor l_light_color = {0xFF, 0xFF, 0xFF, 0xFF};
static char* l_arcName[] = {
"J_tubo_00", "J_tubo_01", "Kkiba_00", "Y_ironbal", "J_taru00", "J_doku00", "Obj_bkl",
"K_tubo02", "Obj_ballS", "Obj_ballS", "D_aotubo0", "Obj_tama", "O_tuboS", "O_tuboB",
};
static char* l_bmdName[] = {
"J_tubo_00.bmd", "J_tubo_01.bmd", "J_hako_00.bmd", "Yironball.bmd",
"J_taru_00.bmd", "J_doku_00.bmd", "K_hb00.bmd", "K_tubo02.bmd",
"LV8_OBJ_HikariS.bmd", "LV8_OBJ_HikariS.bmd", "D_aotubo00.bmd", "LV8_tama.bmd",
"O_tuboS_LV8.bmd", "O_tuboB_LV8.bmd",
};
static Vec kibako_jv_offset[] = {
{0.0f, 0.0f, 0.0f},
{0.0f, 150.0f, 0.0f},
};
static Vec taru_jv_offset[] = {
{0.0f, 0.0f, 0.0f},
{0.0f, 100.0f, 0.0f},
};
// box joint col data
static dJntColData_c kibako_jc_data = {1, 1, 0, 45.0f, kibako_jv_offset};
static dJntColData_c taru_jc_data = {1, 1, 0, 45.0f, taru_jv_offset};
static f32 bound(cXyz* param_0, const cBgS_PolyInfo& param_1, f32 param_2) {
cM3dGPla plane;
bool var_r29 = dComIfG_Bgsp().GetTriPla(param_1, &plane);
if (var_r29) {
cXyz pos;
f32 abs = param_0->absXZ();
VECReflect(param_0, &plane.mNormal, &pos);
*param_0 = (pos * abs) * param_2;
return param_0->absXZ();
} else {
return 0.0f;
}
}
static void TgHitCallBackBase(fopAc_ac_c* i_tgActor, dCcD_GObjInf* i_tgObjInf,
fopAc_ac_c* i_atActor, dCcD_GObjInf* i_atObjInf) {}
static void TgHitCallBackBokkuri(fopAc_ac_c* i_tgActor, dCcD_GObjInf* i_tgObjInf,
fopAc_ac_c* i_atActor, dCcD_GObjInf* i_atObjInf) {
daObjCarry_c* objCarry = (daObjCarry_c*)i_tgActor;
if (objCarry != NULL && i_atActor != NULL && i_atObjInf->ChkAtType(AT_TYPE_SHIELD_ATTACK) &&
fopAcM_IsActor(i_atActor) && fopAcM_GetName(i_atActor) == PROC_ALINK)
{
objCarry->field_0xd5c = 6000.0f + cM_rndF(2000.0f);
objCarry->field_0xd60 = 4000.0f + cM_rndF(1500.0f);
objCarry->field_0xd68 = 4000;
}
}
static void CoHitCallBackBase(fopAc_ac_c* i_coActorA, dCcD_GObjInf* i_coObjInfA,
fopAc_ac_c* i_coActorB, dCcD_GObjInf* i_coObjInfB) {}
static void CoHitCallBackBokkuri(fopAc_ac_c* i_coActorA, dCcD_GObjInf* i_coObjInfA,
fopAc_ac_c* i_coActorB, dCcD_GObjInf* i_coObjInfB) {
daObjCarry_c* objCarry = (daObjCarry_c*)i_coActorA;
if (objCarry != NULL && i_coActorB != NULL) {
cXyz* cc_move_p = objCarry->mStts.GetCCMoveP();
if (cc_move_p != NULL) {
if (std::fabs(cc_move_p->x) > 0.5f && std::fabs(cc_move_p->z) > 0.5f) {
objCarry->field_0xd5c = 800.0f + cM_rndF(400.0f);
objCarry->field_0xd60 = 500.0f + cM_rndF(300.0f);
if (objCarry->field_0xdb0 != 0) {
objCarry->field_0xd5c *= 0.5f;
objCarry->field_0xd60 *= 0.5f;
}
}
}
}
}
static void* s_swA_sub(void* i_actor, void* i_data) {
daObjSwBallA_c* swball = (daObjSwBallA_c*)i_actor;
daObjCarry_c* objCarry = (daObjCarry_c*)i_data;
if (fopAcM_IsActor(swball) && fopAcM_GetName(swball) == PROC_Obj_SwBallA && swball != NULL &&
objCarry != NULL)
{
if (swball->getSwbit() == objCarry->getSwbit2()) {
return i_actor;
}
}
return NULL;
}
static int l_sw_id;
static void* s_sw_sub(void* i_actor, void* i_data) {
daObjSwBallB_c* swball = (daObjSwBallB_c*)i_actor;
if (fopAcM_IsActor(swball) && fopAcM_GetName(swball) == PROC_Obj_SwBallB && swball != NULL &&
swball->getID() == l_sw_id)
{
return i_actor;
}
return NULL;
}
static void* s_setA_sub(void* i_actor, void* i_data) {
daTagSetBall_c* tagball = (daTagSetBall_c*)i_actor;
if (fopAcM_IsActor(tagball) && fopAcM_GetName(tagball) == PROC_Tag_SetBall && tagball &&
i_data != NULL && tagball->getType() == 0xF)
{
return i_actor;
}
return NULL;
}
static void* s_setB_sub(void* i_actor, void* i_data) {
daTagSetBall_c* tagball = (daTagSetBall_c*)i_actor;
if (fopAcM_IsActor(tagball) && fopAcM_GetName(tagball) == PROC_Tag_SetBall && tagball &&
i_data != NULL && tagball->getType() == 0)
{
return i_actor;
}
return NULL;
}
static int CheckCreateHeap(fopAc_ac_c* i_this) {
return ((daObjCarry_c*)i_this)->CreateHeap();
}
const daObjCarry_dt_t& daObjCarry_c::data() {
return mData[mType];
}
char* daObjCarry_c::getArcName() {
return l_arcName[mType];
}
char* daObjCarry_c::getBmdName() {
return l_bmdName[mType];
}
BOOL daObjCarry_c::checkFlag(u8 i_flag) {
return cLib_checkBit<u8>(data().m_flags, i_flag);
}
void daObjCarry_c::initBaseMtx() {
mRotAxis = cXyz::Zero;
mRotation = 0;
field_0xd3c = ZeroQuat;
field_0xd4c = field_0xd3c;
setBaseMtx();
}
void daObjCarry_c::setBaseMtx() {
Mtx rot_mtx;
if (mRotAxis.isZero()) {
mDoMtx_identity(rot_mtx);
} else {
MTXRotAxisRad(rot_mtx, &mRotAxis, cM_s2rad(mRotation));
}
if (mType == TYPE_BOKKURI) {
mDoMtx_stack_c::transS(current.pos.x, current.pos.y + data().field_0x28, current.pos.z);
mDoMtx_stack_c::transM(0.0f, scale.x * data().field_0x2c, 0.0f);
mDoMtx_stack_c::concat(rot_mtx);
mDoMtx_stack_c::transM(0.0f, scale.x * -data().field_0x2c, 0.0f);
mDoMtx_stack_c::ZXYrotM(shape_angle.x + field_0xd64, shape_angle.y + field_0xd6a, shape_angle.z + field_0xd66);
mDoMtx_stack_c::transM(0.0f, scale.x * 35.0f * field_0xd84, field_0xd84 * -25.0f);
mDoMtx_stack_c::XrotM(field_0xd84 * 16384.0f);
} else if (mType == TYPE_KIBAKO || mType == TYPE_TARU || mType == TYPE_DOKURO) {
mDoMtx_stack_c::transS(current.pos.x, current.pos.y + data().field_0x28, current.pos.z);
mDoMtx_stack_c::transM(0.0f, data().field_0x2c, 0.0f);
mDoMtx_stack_c::concat(rot_mtx);
mDoMtx_stack_c::transM(0.0f, -data().field_0x2c, 0.0f);
mDoMtx_stack_c::ZXYrotM(shape_angle);
} else {
mDoMtx_quatMultiply(&field_0xd4c, &field_0xd3c, &field_0xd4c);
mDoMtx_stack_c::transS(current.pos.x, data().field_0x28 + current.pos.y + field_0xddc, current.pos.z);
mDoMtx_stack_c::transM(0.0f, data().field_0x2c, 0.0f);
mDoMtx_stack_c::quatM(&field_0xd4c);
mDoMtx_stack_c::transM(0.0, -data().field_0x2c, 0.0);
mDoMtx_stack_c::ZXYrotM(shape_angle);
field_0xd3c = field_0xd4c;
}
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
mpModel->setBaseScale(scale);
}
int daObjCarry_c::preInit() {
fopAcM_ct(this, daObjCarry_c);
if (!mInitParams) {
mItemNo = home.angle.x;
field_0xd18 = home.angle.z;
home.angle.z = 0;
home.angle.x = 0;
current.angle.z = 0;
current.angle.x = 0;
shape_angle.z = 0;
shape_angle.x = 0;
mOnMoveBG = checkOnMoveBg();
mInitParams = true;
}
mType = getType_private();
return 1;
}
daObjCarry_c::daObjCarry_c() {}
BOOL daObjCarry_c::checkBreakWolfAttack() {
if (mType == TYPE_TSUBO ||
mType == TYPE_TSUBO_2 ||
mType == TYPE_OOTSUBO ||
mType == TYPE_KIBAKO ||
mType == TYPE_DOKURO ||
mType == TYPE_AOTSUBO ||
mType == TYPE_TSUBO_S ||
mType == TYPE_TSUBO_B)
{
return TRUE;
}
return FALSE;
}
BOOL daObjCarry_c::checkCarryBoomerang() {
if (mType == TYPE_TSUBO ||
mType == TYPE_TSUBO_2 ||
mType == TYPE_OOTSUBO ||
mType == TYPE_KIBAKO ||
mType == TYPE_DOKURO ||
mType == TYPE_BOKKURI ||
mType == TYPE_AOTSUBO ||
mType == TYPE_TSUBO_S ||
mType == TYPE_TSUBO_B)
{
return TRUE;
}
return FALSE;
}
BOOL daObjCarry_c::checkCarryHookshot() {
if (mType == TYPE_BALL_S ||
mType == TYPE_BALL_S_2 ||
mType == TYPE_LV8_BALL)
{
return TRUE;
}
return FALSE;
}
BOOL daObjCarry_c::checkCarryWolf() {
if (mType == TYPE_TSUBO ||
mType == TYPE_DOKURO ||
mType == TYPE_TSUBO_2 ||
mType == TYPE_TSUBO_S)
{
return TRUE;
}
return FALSE;
}
BOOL daObjCarry_c::checkCarryOneHand() {
if (mType == TYPE_TSUBO ||
mType == TYPE_DOKURO ||
mType == TYPE_TSUBO_2 ||
mType == TYPE_BOKKURI ||
mType == TYPE_TSUBO_S)
{
return TRUE;
}
return FALSE;
}
int daObjCarry_c::Create() {
scale.set(data().scale, data().scale, data().scale);
fopAcM_SetMtx(this, mpModel->getBaseTRMtx());
mAcchCir.SetWall(data().m_height, data().m_radius);
mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), &current.angle, &shape_angle);
mAcch.SetWtrChkMode(2);
mAcch.ClrRoofNone();
mAcch.SetRoofCrrHeight(80.0f);
mStts.Init(data().m_colliderWeight, 0xFF, this);
mCyl.Set(l_cyl_src);
mCyl.SetStts(&mStts);
mCyl.cM3dGCyl::Set(l_cyl_info[mType]);
mCyl.SetAtAtp(data().m_cyl_atp);
setTgHitCallBack();
setCoHitCallBack();
if (mType != TYPE_BOKKURI) {
if (mType == TYPE_BALL_S) {
mLightAtSph.Set(l_light_at_sph_src);
mLightAtSph.SetStts(&mStts);
} else if (mType == TYPE_BALL_S_2) {
mLightAtSph.Set(l_light_at_sph_src);
mLightAtSph.SetStts(&mStts);
} else if (prm_chk_type_ironball()) {
mAtCps.Set(l_atCpsSrc);
mAtCps.SetStts(&mStts);
} else if (mType == TYPE_TSUBO || mType == TYPE_OOTSUBO || mType == TYPE_TSUBO_2 || mType == TYPE_AOTSUBO) {
mTgCyl.Set(l_tg_cyl);
mTgCyl.SetStts(&mStts);
}
}
fopAcM_SetCullSize(this, fopAc_CULLSPHERE_CUSTOM_e);
fopAcM_setCullSizeSphere(this, data().m_cullsph_min_x, data().m_cullsph_min_y, data().m_cullsph_min_z, mpModel->getModelData()->getJointNodePointer(0)->getRadius() * data().scale);
cLib_onBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
attention_info.distances[fopAc_attn_CARRY_e] = data().m_carry_attn_dist;
if (checkFlag(4)) {
fopAcM_OnCarryType(this, fopAcM_CARRY_TYPE_1);
} else if (checkFlag(8)) {
fopAcM_OnCarryType(this, fopAcM_CARRY_HEAVY);
}
field_0xcec = current.pos.y;
fopAcM_SetGravity(this, data().m_gravity);
field_0xd70 = cM_rndF(100.0f);
field_0xd04 = field_0xd70;
if (checkBreakWolfAttack()) {
mCyl.SetTgType(mCyl.GetTgType() | 0x20000000);
}
u32 tg_type = mCyl.GetTgType();
if (!checkCarryBoomerang()) {
mCyl.SetTgType(tg_type & ~0x10000);
}
if (checkCarryHookshot()) {
fopAcM_OnStatus(this, 0x80000);
mCyl.SetTgType(mCyl.GetTgType() | 0x4000);
}
if (checkCarryWolf()) {
fopAcM_OnCarryType(this, fopAcM_CARRY_LIGHT);
}
if (checkCarryOneHand()) {
fopAcM_OnCarryType(this, fopAcM_CARRY_SIDE);
}
if (mType == TYPE_TSUBO || mType == TYPE_OOTSUBO || mType == TYPE_TSUBO_2 || mType == TYPE_AOTSUBO) {
mCyl.SetTgType(mCyl.GetTgType() | 0x2000000);
}
if (mType != TYPE_TSUBO && mType != TYPE_TSUBO_2 && mType != TYPE_TSUBO_S && mType != TYPE_OOTSUBO && mType != TYPE_AOTSUBO && mType != TYPE_TSUBO_B) {
mCyl.OnTgNoSlingHitInfSet();
}
if (!CreateInitCall()) {
return 0;
}
field_0xdaf = 1;
if (mMode == MODE_DB_DROP) {
field_0xcf3 = 0;
field_0xdb1 = 0;
} else {
field_0xcf3 = 10;
field_0xdb1 = 1;
}
cXyz gnd_chk_pos(current.pos);
gnd_chk_pos.y += 10.0f;
if (fopAcM_gc_c::gndCheck(&gnd_chk_pos)) {
if (std::fabs(fopAcM_gc_c::getGroundY() - current.pos.y) < 30.0f) {
home.pos.y = fopAcM_gc_c::getGroundY();
current.pos.y = home.pos.y;
old.pos.y = home.pos.y;
} else {
// "Lift OBJ: not grounded on BG. \n"
OS_REPORT("\x1B[43;30m持ち上げOBJ:BGに接地して配置されていません。\n");
OS_REPORT("type<%d>pos<%.2f,%.2f,%.2f>\n", mType, home.pos.x, home.pos.y, home.pos.z);
// "BG Height: %.2f\n"
OS_REPORT("BG高さ:%.2f\n\x1b[m", fopAcM_gc_c::getGroundY());
}
}
mAcch.CrrPos(dComIfG_Bgsp());
initBaseMtx();
return 1;
}
int daObjCarry_c::CreateInit_tsubo() {
if (!checkCrashRoll()) {
mCanCrashRoll = true;
}
mode_init_wait();
if (strcmp(dComIfGp_getStartStageName(), "D_MN05A") == 0) {
field_0xe25 = 1;
}
return 1;
}
int daObjCarry_c::CreateInit_ootubo() {
mode_init_wait();
return 1;
}
int daObjCarry_c::CreateInit_kibako() {
if (!mJntCol.init(this, &kibako_jc_data, mpModel, 1)) {
return 0;
}
mode_init_wait();
return 1;
}
int daObjCarry_c::CreateInit_ironball() {
if (chkSaveFlag()) {
u8 l_saveID = getSaveID();
current.pos = getPos(l_saveID);
old.pos = current.pos;
attention_info.position = current.pos;
eyePos = current.pos;
fopAcM_SetRoomNo(this, getRoomNo(l_saveID));
tevStr.room_no = fopAcM_GetRoomNo(this);
if (chkSttsFlag(l_saveID, 1)) {
mDraw = true;
}
}
mAcch.SetLink();
mAcch.ClrObj();
mode_init_wait();
mCyl.SetAtType(mCyl.GetAtType() | AT_TYPE_IRON_BALL);
mCyl.SetAtSe(6);
return 1;
}
int daObjCarry_c::CreateInit_taru() {
if (!mJntCol.init(this, &taru_jc_data, mpModel, 1)) {
return 0;
}
mode_init_wait();
return 1;
}
int daObjCarry_c::CreateInit_dokuro() {
mode_init_wait();
return fopAcM_isSwitch(this, getSwbit()) == FALSE ? TRUE : FALSE;
}
int daObjCarry_c::CreateInit_bokkuri() {
mCyl.SetTgHitMark(CcG_Tg_UNK_MARK_0);
mCyl.OnTgNoHitMark();
field_0xd76 = 0;
field_0xd79 = 3;
field_0xd7a = 100;
mSound.init(&current.pos, 1);
switch (getSetType()) {
case 0:
mode_init_wait();
break;
case 1:
field_0xd76 = 255;
speedF = 15.0f;
speed.y = 20.0f;
scale.set(1.0f, 1.0f, 1.0f);
mode_init_dbDrop(1);
break;
case 2:
fopAcM_OnCarryType(this, fopAcM_CARRY_TYPE_1);
field_0xdb0 = 1;
field_0xd7a = 0;
mode_init_wait();
break;
case 3:
fopAcM_OnCarryType(this, fopAcM_CARRY_TYPE_1);
field_0xd76 = 255;
field_0xd7a = 0;
mode_init_growth();
break;
default:
mode_init_wait();
}
return 1;
}
int daObjCarry_c::CreateInit_LightBall() {
mSound.init(&current.pos, 1);
if (dComIfGp_roomControl_getStayNo()) {
fopAcM_OnStatus(this, 0x2000000);
}
mDalkmistInf.mPos = current.pos;
mDalkmistInf.field_0xc = 750.0f;
dKy_dalkmist_inf_set(&mDalkmistInf);
field_0xe0c = 1;
fopAcM_OnStatus(this, 0x20000);
mCyl.SetTgSe(9);
mCyl.SetTgHitMark(CcG_Tg_UNK_MARK_2);
mCyl.OffTgNoHitMark();
mCyl.OnTgShieldHit();
mCyl.SetAtSe(1);
mode_init_wait();
return 1;
}
int daObjCarry_c::CreateInit_Lv8Ball() {
mSound.init(&current.pos, 1);
mCyl.SetTgSe(9);
mCyl.SetTgHitMark(CcG_Tg_UNK_MARK_2);
mCyl.OffTgNoHitMark();
mCyl.OnTgShieldHit();
if (fopAcM_isSwitch(this, getSwbit())) {
mode_init_fit();
} else {
mode_init_wait();
}
return 1;
}
int daObjCarry_c::CreateHeap() {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(getArcName(), getBmdName());
JUT_ASSERT(2813, modelData != NULL);
u32 mdl_flags = prm_chk_type_ironball() ? J3DMdlFlag_None : J3DMdlFlag_DifferedDLBuffer;
mpModel = mDoExt_J3DModel__create(modelData, mdl_flags, 0x11000084);
if (mpModel == 0) {
return 0;
}
return 1;
}
int daObjCarry_c::create() {
preInit();
if (!(DEBUG && prm_chk_type_lightball() &&
strcmp(dComIfGp_getStartStageName(), "T_ENE02") == 0)) {
int create_phase;
create_phase = cPhs_NEXT_e;
switch (mType) {
case TYPE_BALL_S:
create_phase = checkCreate_LightBallA();
break;
case TYPE_BALL_S_2:
create_phase = checkCreate_LightBallB();
break;
case TYPE_LV8_BALL:
create_phase = checkCreate_Lv8Ball();
break;
}
if (create_phase != cPhs_NEXT_e) {
return create_phase;
}
}
int phase_state = dComIfG_resLoad(&mPhaseReq, getArcName());
if (phase_state == cPhs_COMPLEATE_e) {
if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, data().m_heapSize)) {
return cPhs_ERROR_e;
}
if (!Create()) {
return cPhs_ERROR_e;
}
}
return phase_state;
}
int daObjCarry_c::checkCreate_LightBallA() {
fopAc_ac_c* var_r29 = NULL;
if (daPy_py_c::checkCarryStartLightBallA()) {
/* Palace of Twilight - Palace of Twilight use 1 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0311);
/* Palace of Twilight - Palace of Twilight use 3 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0313);
/* Palace of Twilight - Palace of Twilight use 5 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0315);
/* Palace of Twilight - Palace of Twilight use 7 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0317);
/* Palace of Twilight - Palace of Twilight use 9 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0319);
if (dComIfGp_roomControl_getStayNo() == 51) {
/* Palace of Twilight - Palace of Twilight use 5 */
dComIfGs_onEventBit(dSv_event_flag_c::F_0315);
} else if (dComIfGp_roomControl_getStayNo() == 52) {
/* Palace of Twilight - Palace of Twilight use 9 */
dComIfGs_onEventBit(dSv_event_flag_c::F_0319);
} else if (dComIfGp_roomControl_getStayNo() == 0) {
/* Palace of Twilight - Palace of Twilight use 1 */
dComIfGs_onEventBit(dSv_event_flag_c::F_0311);
} else if (dComIfGp_roomControl_getStayNo() == 1 || dComIfGp_roomControl_getStayNo() == 2) {
/* Palace of Twilight - Palace of Twilight use 3 */
dComIfGs_onEventBit(dSv_event_flag_c::F_0313);
} else {
/* Palace of Twilight - Palace of Twilight use 7 */
dComIfGs_onEventBit(dSv_event_flag_c::F_0317);
}
fopAcM_setCarryNow(this, 1);
if (dComIfGp_roomControl_getStayNo() == 0) {
var_r29 = (fopAc_ac_c*)fpcM_Search(s_setA_sub, this);
if (var_r29 == NULL) {
return cPhs_INIT_e;
}
}
/* Palace of Twilight - Palace of Twilight use 1 */
} else if (!dComIfGs_isEventBit(dSv_event_flag_c::F_0311)
/* Palace of Twilight - Palace of Twilight use 3 */
&& !dComIfGs_isEventBit(dSv_event_flag_c::F_0313)
/* Palace of Twilight - Palace of Twilight use 5 */
&& !dComIfGs_isEventBit(dSv_event_flag_c::F_0315)
/* Palace of Twilight - Palace of Twilight use 7 */
&& !dComIfGs_isEventBit(dSv_event_flag_c::F_0317)
/* Palace of Twilight - Palace of Twilight use 9 */
&& !dComIfGs_isEventBit(dSv_event_flag_c::F_0319))
{
if (dComIfGp_roomControl_getStayNo() != 51) {
/* Palace of Twilight - Palace of Twilight use 1 */
if (!dComIfGs_isEventBit(dSv_event_flag_c::F_0311)) {
resetIconPosForLightBallA();
}
// "Light Ball A: delete since ball and Link aren't in same place<0>\n"
OS_REPORT("\x1B[33m光球A:玉とリンクの位置が違うので消します<0>\n\x1B[m");
return cPhs_ERROR_e;
}
/* Palace of Twilight - Palace of Twilight use 1 */
} else if ((dComIfGs_isEventBit(dSv_event_flag_c::F_0311)
&& dComIfGp_roomControl_getStayNo()) ||
/* Palace of Twilight - Palace of Twilight use 3 */
(dComIfGs_isEventBit(dSv_event_flag_c::F_0313)
&& dComIfGp_roomControl_getStayNo() != 1 && dComIfGp_roomControl_getStayNo() != 2) ||
/* Palace of Twilight - Palace of Twilight use 5 */
(dComIfGs_isEventBit(dSv_event_flag_c::F_0315)
&& dComIfGp_roomControl_getStayNo() != 51) ||
/* Palace of Twilight - Palace of Twilight use 9 */
(dComIfGs_isEventBit(dSv_event_flag_c::F_0319)
&& dComIfGp_roomControl_getStayNo() != 52) ||
/* Palace of Twilight - Palace of Twilight use 7 */
(dComIfGs_isEventBit(dSv_event_flag_c::F_0317)
&& dComIfGp_roomControl_getStayNo() != 4 && dComIfGp_roomControl_getStayNo() != 5))
{
/* Palace of Twilight - Palace of Twilight use 1 */
if (!dComIfGs_isEventBit(dSv_event_flag_c::F_0311)) {
resetIconPosForLightBallA();
} else {
setIconPosForLightBallAAtR00();
}
// "Light Ball A: delete since ball and Link aren't in same place<1>\n"
OS_REPORT("\x1B[33m光球A:玉とリンクの位置が違うので消します<1>\n\x1B[m");
return cPhs_ERROR_e;
} else {
if (dComIfGp_roomControl_getStayNo() == 0) {
if (fopAcM_isSwitch(this, 63)) {
return cPhs_ERROR_e;
}
l_sw_id = -1;
for (int i = 0; i < 6; i++) {
static const u16 l_event_bitA[] = {
dSv_event_flag_c::F_0551, /* Palace of Twilight - Palace of Twilight control use 1 */
dSv_event_flag_c::F_0552, /* Palace of Twilight - Palace of Twilight control use 2 */
dSv_event_flag_c::F_0553, /* Palace of Twilight - Palace of Twilight control use 3 */
dSv_event_flag_c::F_0554, /* Palace of Twilight - Palace of Twilight control use 4 */
dSv_event_flag_c::F_0555, /* Palace of Twilight - Palace of Twilight control use 5 */
dSv_event_flag_c::F_0556, /* Palace of Twilight - Palace of Twilight control use 6 */
};
if (dComIfGs_isEventBit(l_event_bitA[i])) {
l_sw_id = i;
break;
}
}
if (l_sw_id != -1) {
var_r29 = (fopAc_ac_c*)fpcM_Search(s_sw_sub, this);
// "Light Ball A: Set to Switch OBJ<%d> position!\n"
OS_REPORT("光球A:スイッチOBJ<%d>の位置へセットします!\n", l_sw_id);
} else {
var_r29 = (fopAc_ac_c*)fpcM_Search(s_setA_sub, this);
// "Light Ball A: Set to Reset Tag position!\n"
OS_REPORT("光球A:再セットタグの位置へセットします!\n");
}
if (var_r29 == NULL) {
return cPhs_INIT_e;
}
} else if (dComIfGp_roomControl_getStayNo() != 51) {
return cPhs_ERROR_e;
}
fopAcM_SetRoomNo(this, dComIfGp_roomControl_getStayNo());
tevStr.room_no = fopAcM_GetRoomNo(this);
}
if (var_r29 != NULL) {
home.pos = var_r29->home.pos;
current.pos = home.pos;
old.pos = home.pos;
eyePos = home.pos;
attention_info.position = home.pos;
}
return cPhs_NEXT_e;
}
BOOL daObjCarry_c::checkCreate_LightBallB() {
fopAc_ac_c* var_r29 = NULL;
if (daPy_py_c::checkCarryStartLightBallB()) {
/* Palace of Twilight - Palace of Twilight use 2 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0312);
/* Palace of Twilight - Palace of Twilight use 4 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0314);
/* Palace of Twilight - Palace of Twilight use 6 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0316);
/* Palace of Twilight - Palace of Twilight use 8 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0318);
/* Palace of Twilight - Palace of Twilight use 10 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0320);
if (dComIfGp_roomControl_getStayNo() == 51) {
/* Palace of Twilight - Palace of Twilight use 6 */
dComIfGs_onEventBit(dSv_event_flag_c::F_0316);
} else if (dComIfGp_roomControl_getStayNo() == 52) {
/* Palace of Twilight - Palace of Twilight use 10 */
dComIfGs_onEventBit(dSv_event_flag_c::F_0320);
} else if (dComIfGp_roomControl_getStayNo() == 0) {
/* Palace of Twilight - Palace of Twilight use 2 */
dComIfGs_onEventBit(dSv_event_flag_c::F_0312);
} else if (dComIfGp_roomControl_getStayNo() == 1 || dComIfGp_roomControl_getStayNo() == 2) {
/* Palace of Twilight - Palace of Twilight use 4 */
dComIfGs_onEventBit(dSv_event_flag_c::F_0314);
} else {
/* Palace of Twilight - Palace of Twilight use 8 */
dComIfGs_onEventBit(dSv_event_flag_c::F_0318);
}
fopAcM_setCarryNow(this, 1);
if (dComIfGp_roomControl_getStayNo() == 0) {
var_r29 = (fopAc_ac_c*)fpcM_Search(s_setB_sub, this);
if (var_r29 == NULL) {
return cPhs_INIT_e;
}
}
/* Palace of Twilight - Palace of Twilight use 2 */
} else if (!dComIfGs_isEventBit(dSv_event_flag_c::F_0312)
/* Palace of Twilight - Palace of Twilight use 4 */
&& !dComIfGs_isEventBit(dSv_event_flag_c::F_0314)
/* Palace of Twilight - Palace of Twilight use 6 */
&& !dComIfGs_isEventBit(dSv_event_flag_c::F_0316)
/* Palace of Twilight - Palace of Twilight use 8 */
&& !dComIfGs_isEventBit(dSv_event_flag_c::F_0318)
/* Palace of Twilight - Palace of Twilight use 10 */
&& !dComIfGs_isEventBit(dSv_event_flag_c::F_0320))
{
if (dComIfGp_roomControl_getStayNo() != 52) {
/* Castle Town - Showed reciept to town doctor */
if (!dComIfGs_isEventBit(dSv_event_flag_c::F_0321)) {
resetIconPosForLightBallB();
}
// "Light Ball B: delete since ball and Link aren't in same place<2>\n"
OS_REPORT("\x1B[33m光球B:玉とリンクの位置が違うので消します<2>\n\x1B[m");
return cPhs_ERROR_e;
}
/* Palace of Twilight - Palace of Twilight use 2 */
} else if ((dComIfGs_isEventBit(dSv_event_flag_c::F_0312)
&& dComIfGp_roomControl_getStayNo()) ||
/* Palace of Twilight - Palace of Twilight use 4 */
(dComIfGs_isEventBit(dSv_event_flag_c::F_0314)
&& dComIfGp_roomControl_getStayNo() != 1 && dComIfGp_roomControl_getStayNo() != 2) ||
/* Palace of Twilight - Palace of Twilight use 6 */
(dComIfGs_isEventBit(dSv_event_flag_c::F_0316)
&& dComIfGp_roomControl_getStayNo() != 51) ||
/* Palace of Twilight - Palace of Twilight use 10 */
(dComIfGs_isEventBit(dSv_event_flag_c::F_0320)
&& dComIfGp_roomControl_getStayNo() != 52) ||
/* Palace of Twilight - Palace of Twilight use 8 */
(dComIfGs_isEventBit(dSv_event_flag_c::F_0318)
&& dComIfGp_roomControl_getStayNo() != 4 && dComIfGp_roomControl_getStayNo() != 5))
{
/* Palace of Twilight - Palace of Twilight use 2 */
if (!dComIfGs_isEventBit(dSv_event_flag_c::F_0312)) {
resetIconPosForLightBallB();
} else {
setIconPosForLightBallBAtR00();
}
// "Light Ball B: delete since ball and Link aren't in same place<3>\n"
OS_REPORT("\x1B[33m光球B:玉とリンクの位置が違うので消します<3>\n\x1B[m");
return cPhs_ERROR_e;
} else {
if (dComIfGp_roomControl_getStayNo() == 0) {
if (fopAcM_isSwitch(this, 63)) {
return cPhs_ERROR_e;
}
l_sw_id = -1;
for (int i = 0; i < 6; i++) {
static const u16 l_event_bitB[] = {
dSv_event_flag_c::F_0557, /* Palace of Twilight - Palace of Twilight control use 7 */
dSv_event_flag_c::F_0558, /* Palace of Twilight - Palace of Twilight control use 8 */
dSv_event_flag_c::F_0559, /* Palace of Twilight - Palace of Twilight control use 9 */
dSv_event_flag_c::F_0560, /* Palace of Twilight - Palace of Twilight control use 10 */
dSv_event_flag_c::F_0561, /* Palace of Twilight - Palace of Twilight control use 11 */
dSv_event_flag_c::F_0562, /* Palace of Twilight - Palace of Twilight control use 12 */
};
if (dComIfGs_isEventBit(l_event_bitB[i])) {
l_sw_id = i;
break;
}
}
if (l_sw_id != -1) {
var_r29 = (fopAc_ac_c*)fpcM_Search(s_sw_sub, this);
// "Light Ball B: Set to Switch OBJ<%d> position!\n"
OS_REPORT("光球B:スイッチOBJ<%d>の位置へセットします!\n", l_sw_id);
} else {
var_r29 = (fopAc_ac_c*)fpcM_Search(s_setB_sub, this);
// "Light Ball B: Set to Reset Tag position!\n"
OS_REPORT("光球B:再セットタグの位置へセットします!\n");
}
if (var_r29 == NULL) {
return cPhs_INIT_e;
}
} else if (dComIfGp_roomControl_getStayNo() != 52) {
return cPhs_ERROR_e;
}
fopAcM_SetRoomNo(this, dComIfGp_roomControl_getStayNo());
tevStr.room_no = fopAcM_GetRoomNo(this);
}
if (var_r29 != NULL) {
home.pos = var_r29->home.pos;
current.pos = home.pos;
old.pos = home.pos;
eyePos = home.pos;
attention_info.position = home.pos;
}
return cPhs_NEXT_e;
}
BOOL daObjCarry_c::checkCreate_Lv8Ball() {
if (!fopAcM_isSwitch(this, getSwbit())) {
return cPhs_NEXT_e;
}
fopAc_ac_c* var_r29 = (fopAc_ac_c*)fpcM_Search(s_swA_sub, this);
if (var_r29 == NULL) {
return cPhs_INIT_e;
}
current.pos = var_r29->home.pos;
old.pos = current.pos;
attention_info.position = current.pos;
eyePos = current.pos;
return cPhs_NEXT_e;
}
void daObjCarry_c::resetIconPosForLightBallA() {
cXyz pos(0.0f, 100.0f, -3930.0f);
dTres_c::setIconPositionOfCarryLight(getTrboxBit(), &pos, 51);
}
void daObjCarry_c::setIconPosForLightBallAAtR00() {
cXyz pos;
if (fopAcM_isSwitch(this, 61)) {
pos.set(0.0f, -210.0f, 11000.0f);
} else if (fopAcM_isSwitch(this, 62)) {
pos.set(500.0f, -210.0f, 11000.0f);
} else {
pos.set(-4700.0f, -590.0f, 11600.0f);
}
dTres_c::setIconPositionOfCarryLight(getTrboxBit(), &pos, 0);
}
void daObjCarry_c::setIconPosForLightBallBAtR00() {
cXyz pos;
if (fopAcM_isSwitch(this, 61)) {
pos.set(0.0f, -210.0f, 11000.0f);
} else if (fopAcM_isSwitch(this, 62)) {
pos.set(500.0f, -210.0f, 11000.0f);
} else {
pos.set(5100.0f, -590.0f, 11600.0f);
}
dTres_c::setIconPositionOfCarryLight(getTrboxBit(), &pos, 0);
}
void daObjCarry_c::resetIconPosForLightBallB() {
cXyz pos(0.0f, 100.0f, -3930.0f);
dTres_c::setIconPositionOfCarryLight(getTrboxBit(), &pos, 52);
}
int daObjCarry_c::execute() {
mRecover = 0;
if (prm_chk_type_ironball()) {
dTres_c::setCarryIron(getTrboxBit(), &current.pos);
} else if (prm_chk_type_lightball()) {
dTres_c::setIconPositionOfCarryLight(getTrboxBit(), &current.pos, fopAcM_GetRoomNo(this));
fopAcM_seStartLevel(this, Z2SE_OBJ_L8_L_BALL, 0);
if (mAcch.ChkGroundHit() && !mAcch.ChkGroundLanding()) {
cLib_chaseF(&field_0xe20, 1.0f, 0.05f + KREG_F(1));
} else {
cLib_chaseF(&field_0xe20, 2.0f, 0.05f + KREG_F(1));
}
GXColor color = COMPOUND_LITERAL(GXColor){0x5F, 0x5F, 0x5F, 0xFF};
int var_r27 = dKy_BossLight_set(&current.pos, &color, field_0xe20 + KREG_F(0), 0);
if (!var_r27) {
OS_REPORT_ERROR("光球:ライト登録できませんでした\n");
}
}
if ((prm_chk_type_ironball() && getRoomNo() != 0x3F) || (prm_chk_type_lightball() && getRoomNo() != 0x3F)) {
if (fopAcM_GetRoomNo(this) == -1) {
cXyz gnd_chk_pos(current.pos);
gnd_chk_pos.y += 30.0f;
if (fopAcM_gc_c::gndCheck(&gnd_chk_pos)) {
fopAcM_SetRoomNo(this, fopAcM_gc_c::getRoomId());
tevStr.room_no = fopAcM_GetRoomNo(this);
}
}
int room_no = fopAcM_GetRoomNo(this);
if (room_no == -1) {
room_no = getRoomNo();
}
if (!dComIfGp_roomControl_checkRoomDisp(room_no)) {
if (prm_chk_type_lightball()) {
fopAcM_delete(this);
}
return 1;
}
f32 reset_dist = 10000.0f;
if (prm_chk_type_ironball()) {
reset_dist = 4000.0f;
}
if (home.pos.y - current.pos.y > reset_dist) {
mReset = true;
}
}
if (mType == TYPE_DOKURO && getSwbit() != 0xFF && !fopAcM_isSwitch(this, getSwbit())) {
cLib_offBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
return 1;
}
if (mDeleteTimer != 0) {
if (--mDeleteTimer == 0) {
fopAcM_delete(this);
}
return 1;
}
if (mCtrl != 0) {
if (field_0xdb9 == 0) {
mode_init_wait();
}
cLib_offBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
calc_rot_call();
setBaseMtx();
field_0xdb9 = mCtrl;
field_0xdec = current.pos;
return 1;
}
if (field_0xdb9 != 0) {
if (field_0xdea != 0) {
speed.x = (speedF * cM_ssin(current.angle.y)) + (field_0xde4 * cM_ssin(field_0xde8));
speed.y += field_0xde0;
speed.z = (speedF * cM_scos(current.angle.y)) + (field_0xde4 * cM_scos(field_0xde8));
speedF = std::sqrt((speed.x * speed.x) + (speed.z * speed.z));
current.angle.y = cM_atan2s(speed.x, speed.z);
field_0xde4 = 0.0f;
field_0xde0 = 0.0f;
field_0xde8 = 0;
if (speedF > data().m_throwInitSpeedXZ && speed.y > data().m_throwInitSpeedY) {
mode_init_drop(0);
} else {
mode_init_walk(0);
}
if (mpCannonActor != NULL && fopAcM_IsActor(mpCannonActor) && fopAcM_GetProfName(mpCannonActor) == PROC_Obj_Ytaihou) {
mStts.ClrCcMove();
mCyl.SetAtAtp(100);
mAcch.SetIronBall();
// "Fired from cannon! speedF<%f> speed.y<%f>\n"
OS_REPORT("大砲から発射されました!speedF<%f>speed.y<%f>\n", speedF, speed.y);
mpCannonActor = NULL;
mCannon = true;
}
field_0xdea = 0;
} else if (mType == TYPE_LV8_BALL || (prm_chk_type_lightball() && dComIfGp_roomControl_getStayNo() == 0)) {
mode_init_fit();
} else {
mode_init_wait();
}
} else if (field_0xdec != current.pos && !fopAcM_checkCarryNow(this) && mMode != MODE_CARRY && !fopAcM_checkHookCarryNow(this) && mMode != MODE_HOOK_CARRY && mMode != MODE_WAIT && mMode != MODE_FIT) {
mode_init_wait();
}
if (mReset) {
mReset = false;
current.pos = home.pos;
current.pos.y -= 10.0f;
eyePos = current.pos;
old.pos = current.pos;
field_0xdec = current.pos;
speed.y = 0.0f;
if (prm_chk_type_lightball()) {
fopAcM_seStart(this, Z2SE_OBJ_L8_L_BALL_REVIVE, 0);
scale.setall(0.0f);
mode_init_resetLightBall();
} else {
if (prm_chk_type_ironball()) {
if (fopAcM_GetRoomNo(this) != getRoomNo()) {
fopAcM_SetRoomNo(this, getRoomNo());
tevStr.room_no = fopAcM_GetRoomNo(this);
}
}
mode_init_wait();
}
}
field_0xd1c = speed;
field_0xd04++;
cc_damage_proc_call();
mode_proc_call();
bg_check();
calc_rot_call();
obj_execute_proc_call();
mStts.Move();
if (field_0xdae == 0) {
mCyl.SetC(current.pos);
dComIfG_Ccsp()->Set(&mCyl);
if (mCyl.ChkCoSPrm(1) && mMode == MODE_DROP) {
mAcchCir.SetWall(0.5f * data().m_height, 0.5f * data().m_radius);
} else {
mAcchCir.SetWall(data().m_height, data().m_radius);
}
} else {
mAcchCir.SetWall(data().m_height, data().m_radius);
}
if (mMode == MODE_WAIT || mMode == MODE_WALK || mMode == MODE_SINK || mMode == MODE_DROP) {
dComIfG_Ccsp()->SetMass(&mCyl, 3);
}
attention_info.position.x = current.pos.x;
attention_info.position.y = current.pos.y + data().field_0x48;
attention_info.position.z = current.pos.z;
eyePos = attention_info.position;
field_0xda9 = fopAcM_checkCarryNow(this) != 0;
field_0xdac = mCyl.ChkCoHit() != 0;
field_0xdad = mAcch.ChkWaterIn() != 0;
if (field_0xdaa != 0) {
fopAcM_SetModel(this, mpModel);
} else {
fopAcM_SetModel(this, NULL);
}
field_0xdb9 = mCtrl;
setBaseMtx();
if (mType == TYPE_KIBAKO || mType == TYPE_TARU) {
mpModel->calc();
}
field_0xdaf = 0;
if (cLib_calcTimer<s8>(&field_0xe24) == 0) {
mAcch.OffLineCheck();
}
field_0xdec = current.pos;
if (fopAcM_checkCarryNow(this)) {
fopAcM_OffStatus(this, 0x400);
} else {
fopAcM_OnStatus(this, 0x400);
}
return 1;
}
BOOL daObjCarry_c::checkCulling() {
BOOL is_cull = FALSE;
if ((prm_chk_type_ironball() && getRoomNo() != 0x3F) || (prm_chk_type_lightball() && getRoomNo() != 0x3F)) {
int room_no = fopAcM_GetRoomNo(this);
if (room_no == -1) {
room_no = getRoomNo();
}
if (!dComIfGp_roomControl_checkRoomDisp(room_no)) {
return TRUE;
}
}
if (daPy_py_c::wolfGrabSubjectNoDraw(this)) {
is_cull = TRUE;
}
if (mDraw) {
is_cull = TRUE;
}
if (mType == TYPE_DOKURO && getSwbit() != 0xFF && !fopAcM_isSwitch(this, getSwbit())) {
is_cull = TRUE;
}
#if DEBUG
if (KREG_S(2) == 10000) {
is_cull = FALSE;
}
#endif
return is_cull;
}
int daObjCarry_c::draw() {
if (checkCulling()) {
return 1;
}
g_env_light.settingTevStruct(8, &current.pos, &tevStr);
g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr);
if (mType == TYPE_BOKKURI) {
J3DModelData* modelData = mpModel->getModelData();
for (u16 i = 0; i < modelData->getMaterialNum(); i++) {
J3DMaterial* material = modelData->getMaterialNodePointer(i);
J3DGXColor* tev_color = material->getTevKColor(1);
tev_color->a = field_0xd76;
}
} else if (prm_chk_type_lightball() && dComIfGp_roomControl_getStayNo() == 0) {
J3DModelData* modelData = mpModel->getModelData();
JUTNameTab* nametab = modelData->getMaterialName();
for (u16 i = 0; i < modelData->getMaterialNum(); i++) {
J3DMaterial* material = modelData->getMaterialNodePointer(i);
J3DGXColor* tev_kcolor = material->getTevKColor(1);
J3DGXColorS10* tev_color = material->getTevColor(1);
if (strcmp(nametab->getName(i), "cc_ball") == 0) {
tev_color->r = 0x82;
tev_color->g = 0xC8;
tev_color->b = 0xFA;
tev_color->a = 0xFF;
tev_kcolor->r = 0x00;
tev_kcolor->g = 0x3C;
tev_kcolor->b = 0x8C;
tev_kcolor->a = 0xFF;
} else if (strcmp(nametab->getName(i), "aa_hikari") == 0) {
tev_kcolor->r = 0x8C;
tev_kcolor->g = 0xD2;
tev_kcolor->b = 0xFF;
tev_kcolor->a = 0xFF;
}
}
}
mDoExt_modelUpdateDL(mpModel);
if (mType == TYPE_IRON_BALL) {
daMirror_c::entry(mpModel);
}
if (fopAcM_GetModel(this) == NULL) {
f32 temp_f31 = scale.x * data().field_0x74;
if (checkFlag(1)) {
dComIfGd_setSimpleShadow(&current.pos, mAcch.GetGroundH(), temp_f31, mAcch.m_gnd, shape_angle.y, 1.0f, NULL);
} else {
dComIfGd_setSimpleShadow(&current.pos, KREG_F(0) + mAcch.GetGroundH(), temp_f31, mAcch.m_gnd, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex());
}
}
debugDraw();
return 1;
}
void daObjCarry_c::debugDraw() {
#if DEBUG
if (KREG_S(8) == 10000 && !mRotAxis.isZero()) {
cXyz start(current.pos);
start.y += 35.0f;
cXyz end = current.pos + (mRotAxis.norm() * 100.0f);
end.y += 35.0f;
GXColor color = {0xFF, 0xFF, 0xFF, 0xFF};
dDbVw_drawLineOpa(start, end, color, TRUE, 12);
}
if (KREG_S(8) == 20000) {
cXyz start(daPy_getPlayerActorClass()->current.pos);
cXyz end(home.pos);
GXColor color = {0xFF, 0xFF, 0xFF, 0xFF};
dDbVw_drawLineOpa(start, end, color, TRUE, 12);
}
if (KREG_S(8) == 20001) {
cXyz start(daPy_getPlayerActorClass()->current.pos);
cXyz end(home.pos);
GXColor color = {0xFF, 0x00, 0x00, 0xFF};
dDbVw_drawLineOpa(start, end, color, TRUE, 12);
}
if (KREG_S(7) == 4000) {
GXColor color = {0xFF, 0x00, 0x00, 0xFF};
cXyz sp80(0.0f, 0.0f, 100.0f);
mDoMtx_stack_c::YrotS(current.angle.y);
mDoMtx_stack_c::multVec(&sp80, &sp80);
sp80 += current.pos;
dDbVw_drawArrowOpa(current.pos, sp80, color, TRUE, 12);
color = (GXColor){0x00, 0x00, 0xFF, 0xFF};
sp80.set(0.0f, 0.0f, 100.0f);
mDoMtx_stack_c::YrotS(shape_angle.y);
mDoMtx_stack_c::multVec(&sp80, &sp80);
sp80 += current.pos;
dDbVw_drawArrowOpa(current.pos, sp80, color, TRUE, 12);
}
if (KREG_S(7) == 5000) {
GXColor color = {0x00, 0x00, 0xFF, 0xFF};
cXyz sp74(current.pos);
cXyz sp68;
int sp28;
if (fopAcM_getWaterStream(&current.pos, mAcch.m_gnd, &sp68, &sp28, 0)) {
cXyz sp5C = sp68 * 100.0f;
sp5C += current.pos;
dDbVw_drawArrowOpa(current.pos, sp5C, color, TRUE, 12);
}
}
if (mType == TYPE_KIBAKO || mType == TYPE_TARU) {
// mJntCol.debugDraw();
}
#endif
}
int daObjCarry_c::_delete() {
daPy_py_c* player = daPy_getPlayerActorClass();
fopAcM_offActor(this, fopAcM_GetSetId(this));
if (mType == TYPE_BOKKURI || mType == TYPE_LV8_BALL || prm_chk_type_lightball()) {
mSound.deleteObject();
}
if ((mType == TYPE_BALL_S || mType == TYPE_BALL_S_2) && field_0xe0c != 0) {
dKy_dalkmist_inf_cut(&mDalkmistInf);
field_0xe0c = 0;
}
if (mType == TYPE_BALL_S) {
/* Palace of Twilight - Palace of Twilight use 1 */
if (!dComIfGs_isEventBit(dSv_event_flag_c::F_0311)
|| (player != NULL && player->getGrabActorID() != fopAcM_GetID(this))) {
/* Palace of Twilight - Palace of Twilight use 3 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0313);
/* Palace of Twilight - Palace of Twilight use 5 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0315);
/* Palace of Twilight - Palace of Twilight use 7 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0317);
/* Palace of Twilight - Palace of Twilight use 9 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0319);
/* Palace of Twilight - Palace of Twilight use 1 */
if (!dComIfGs_isEventBit(dSv_event_flag_c::F_0311)) {
cXyz pos(0.0f, 100.0f, -3930.0f);
dTres_c::setIconPositionOfCarryLight(getTrboxBit(), &pos, 51);
}
}
if (fopAcM_isSwitch(this, 90)
/* Palace of Twilight - Palace of Twilight use 1 */
&& !dComIfGs_isEventBit(dSv_event_flag_c::F_0311)
&& player != NULL) {
if (player->getGrabActorID() != fopAcM_GetID(this)) {
fopAcM_onSwitch(this, 170);
// "Midna Hint Switch set!\n"
OSReport_Error("ミドナヒント用スイッチ立てました!\n");
}
}
/* Palace of Twilight - Palace of Twilight use 2 */
} else if (mType == TYPE_BALL_S_2 && (!dComIfGs_isEventBit(dSv_event_flag_c::F_0312)
|| (player != NULL && player->getGrabActorID() != fopAcM_GetID(this)))) {
/* Palace of Twilight - Palace of Twilight use 4 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0314);
/* Palace of Twilight - Palace of Twilight use 6 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0316);
/* Palace of Twilight - Palace of Twilight use 8 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0318);
/* Palace of Twilight - Palace of Twilight use 10 */
dComIfGs_offEventBit(dSv_event_flag_c::F_0320);
/* Palace of Twilight - Palace of Twilight use 2 */
if (!dComIfGs_isEventBit(dSv_event_flag_c::F_0312)) {
cXyz pos(0.0f, 100.0f, -3930.0f);
dTres_c::setIconPositionOfCarryLight(getTrboxBit(), &pos, 52);
}
}
if (prm_chk_type_ironball()) {
if (-G_CM3D_F_INF != mAcch.GetGroundH()) {
savePos(getSaveID(), current.pos);
setRoomNo(getSaveID(), fopAcM_GetRoomNo(this));
} else {
int room_no = fopAcM_GetRoomNo(this);
if (room_no == -1) {
room_no = getRoomNo();
}
if (!dComIfGp_roomControl_checkRoomDisp(room_no)) {
savePos(getSaveID(), current.pos);
setRoomNo(getSaveID(), room_no);
}
}
if (!isDraw()) {
onSttsFlag(getSaveID(), 1);
} else {
offSttsFlag(getSaveID(), 1);
}
}
dComIfG_resDelete(&mPhaseReq, getArcName());
return 1;
}
void daObjCarry_c::crr_pos() {
if (field_0xd14 != 0) {
mAcch.ClrRoofHit();
mAcch.ClrWallHit();
mAcch.ClrGroundLanding();
mAcch.ClrGroundHit();
mAcch.ClrWaterHit();
mAcch.ClrWaterIn();
return;
}
bool var_r29 = false;
cXyz sp20(current.pos);
if (mMode == MODE_CARRY || field_0xdb0 == 1) {
var_r29 = true;
}
mAcch.CrrPos(dComIfG_Bgsp());
if (field_0xe25 != 0) {
cXyz sp14(current.pos.x, current.pos.y - 5000.0f, current.pos.z);
mAcch.m_wtr.Set(sp14, 5000.0f + current.pos.y);
if (dComIfG_Bgsp().WaterChk(&mAcch.m_wtr)) {
mAcch.SetWaterHit();
if (mAcch.m_wtr.GetHeight() > current.pos.y) {
mAcch.SetWaterIn();
}
}
}
field_0xd08 = current.pos - sp20;
if (dComIfG_Bgsp().ChkMoveBG_NoDABg(mAcch.m_gnd) && mOnMoveBG) {
var_r29 = false;
mOnMoveBG = false;
}
if (mType == TYPE_IRON_BALL) {
if (mAcch.ChkGroundHit()) {
switch (dComIfG_Bgsp().GetPolyAtt0(mAcch.m_gnd)) {
case 13:
field_0xddc = -20.0f;
break;
}
} else {
cLib_chaseF(&field_0xddc, 0.0f, 1.0f);
}
}
if (var_r29) {
if (field_0xdb0 != 0) {
current.pos.x = sp20.x;
current.pos.z = sp20.z;
} else {
current.pos = sp20;
}
}
}
int daObjCarry_c::check_sink(f32* param_0) {
int var_r29 = 0;
f32 temp_f31 = mAcch.m_wtr.GetHeight();
*param_0 = 0.0f;
if (mAcch.ChkWaterHit()) {
if (temp_f31 > current.pos.y + (2.0f * data().field_0x2c)) {
var_r29 = 2;
*param_0 = 1.0f;
} else if (temp_f31 > current.pos.y) {
var_r29 = 1;
*param_0 = std::fabs(temp_f31 - current.pos.y) / (2.0f * data().field_0x2c);
}
}
return var_r29;
}
f32 daObjCarry_c::calc_gravity() {
f32 obj_gravity = fopAcM_GetGravity(this);
f32 sp8;
int temp_r3 = check_sink(&sp8);
switch (temp_r3) {
case 0:
obj_gravity = data().m_gravity;
break;
case 1:
case 2:
obj_gravity = data().m_gravity + (sp8 * data().m_Buoyancy);
break;
}
return obj_gravity;
}
BOOL daObjCarry_c::checkRollAngle() {
f32 roll_angle = data().m_rollAngle;
cXyz gnd_chk_pos(current.pos);
gnd_chk_pos.y += 50.0f;
cM3dGPla plane;
bool gnd_chk = fopAcM_gc_c::gndCheck(&gnd_chk_pos);
bool valid_plane = fopAcM_gc_c::getTriPla(&plane);
f32 ground_y = fopAcM_gc_c::getGroundY();
if (gnd_chk && ground_y != -G_CM3D_F_INF && valid_plane) {
f32 roll_threshold = cM_scos(cM_deg2s(roll_angle - 0.5f));
cXyz normal(plane.mNormal);
if (normal.y < roll_threshold) {
return TRUE;
}
}
return FALSE;
}
void daObjCarry_c::mode_proc_call() {
typedef int (daObjCarry_c::*mode_func)();
static mode_func l_mode_func[] = {
&daObjCarry_c::mode_proc_wait,
&daObjCarry_c::mode_proc_walk,
&daObjCarry_c::mode_proc_carry,
&daObjCarry_c::mode_proc_drop,
&daObjCarry_c::mode_proc_float,
&daObjCarry_c::mode_proc_sink,
&daObjCarry_c::mode_proc_yogan,
&daObjCarry_c::mode_proc_magne,
&daObjCarry_c::mode_proc_magneCarry,
&daObjCarry_c::mode_proc_boomCarry,
&daObjCarry_c::mode_proc_growth,
&daObjCarry_c::mode_proc_dbDrop,
&daObjCarry_c::mode_proc_hookCarry,
&daObjCarry_c::mode_proc_end,
&daObjCarry_c::mode_proc_fit,
&daObjCarry_c::mode_proc_controled,
&daObjCarry_c::mode_proc_resetLightBall,
};
if (field_0xdae == 0) {
if (field_0xcf2 != 0x11) {
if (field_0xcf2 == 3) {
mode_init_drop(0);
}
field_0xcf2 = 0x11;
}
if (!fopAcM_checkCarryNow(this) || mCarryHookOK) {
if (mCyl.ChkTgHit()) {
cCcD_Obj* tg_hit_obj = mCyl.GetTgHitObj();
if (tg_hit_obj != NULL && tg_hit_obj->ChkAtType(AT_TYPE_BOOMERANG)) {
mode_init_boomCarry();
}
} else if (fopAcM_checkHookCarryNow(this)) {
if (mMode != MODE_HOOK_CARRY) {
mode_init_hookCarry();
}
if (fopAcM_checkCarryNow(this)) {
mRecover = 1;
fopAcM_cancelCarryNow(this);
}
if (prm_chk_type_lightball() && fopAcM_searchPlayerDistance(this) < 250.0f) {
daPy_py_c* player = daPy_getPlayerActorClass();
if (player->setForceGrab(this, 0, 1)) {
mode_init_carry();
fopAcM_cancelHookCarryNow(this);
field_0xda9 = 1;
}
}
}
} else if (field_0xda9 == 0) {
mode_init_carry();
}
(this->*l_mode_func[mMode])();
crr_pos();
if (mMode == MODE_BOOM_CARRY) {
mBoomerangMove.bgCheckAfterOffset(&current.pos);
}
bg_damage_proc_call();
}
}
void daObjCarry_c::mode_init_wait() {
mAcch.ClrMoveBGOnly();
mAcch.ClrGrndNone();
mCyl.OffAtSPrmBit(1);
mCyl.OnTgSPrmBit(1);
mCyl.OnCoSPrmBit(0x10);
cLib_onBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
field_0xda8 = 0;
speedF = 0.0f;
gravity = data().m_gravity;
fopAcM_SetMaxFallSpeed(this, -100.0f);
mStts.SetWeight(data().m_colliderWeight);
if (prm_chk_type_ironball()) {
mAcch.ClrIronBall();
}
mMode = MODE_WAIT;
}
int daObjCarry_c::mode_proc_wait() {
bool do_crash_roll = false;
bool var_r26 = true;
bool is_roll_angle = checkRollAngle();
if (field_0xdb0 != 0) {
fopAcM_posMoveF(this, NULL);
} else {
if (mCanCrashRoll) {
daPy_py_c* player = dComIfGp_getLinkPlayer();
if (player->current.pos.absXZ(current.pos) < (500.0f + KREG_F(9)) && (player->checkFrontRollCrash() || player->checkWolfAttackReverse())) {
do_crash_roll = true;
mCanCrashRoll = false;
}
}
mAcch.ClrMoveBGOnly();
mAcch.ClrGrndNone();
}
fopAcM_posMoveF(this, mStts.GetCCMoveP());
if (mAcch.ChkGroundHit()) {
field_0xcec = current.pos.y;
}
if (is_roll_angle && var_r26) {
mode_init_walk(0);
return 1;
}
if (do_crash_roll) {
speedF = 30.0f + KREG_F(8);
mode_init_walk(0);
return 1;
}
if (0.0f != speedF) {
mode_init_walk(0);
return 1;
}
return 1;
}
void daObjCarry_c::mode_init_walk(u8 unused) {
mAcch.ClrMoveBGOnly();
mAcch.ClrGrndNone();
mCyl.OffAtSPrmBit(1);
mCyl.OnTgSPrmBit(1);
mCyl.OnCoSPrmBit(0x10);
field_0xda8 = 0;
mCanCrashRoll = false;
mStts.SetWeight(data().m_colliderWeight);
fopAcM_SetMaxFallSpeed(this, -100.0f);
gravity = data().m_gravity;
if (prm_chk_type_ironball()) {
mAcch.ClrIronBall();
}
mMode = MODE_WALK;
}
int daObjCarry_c::mode_proc_walk() {
bool gnd_hit = mAcch.ChkGroundHit() != 0;
bool gnd_landing = mAcch.ChkGroundLanding() != 0;
bool gnd_away = mAcch.ChkGroundAway() != 0;
if (gnd_hit) {
field_0xcec = current.pos.y;
cLib_onBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
if (0.0f == speedF && 0.0f == speed.y) {
mode_init_wait();
}
if (mType == TYPE_IRON_BALL) {
if (speedF > 25.0f) {
cLib_offBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
} else {
cLib_onBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
}
}
} else {
cLib_offBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
}
f32 var_f29 = data().m_rollAngle;
cXyz sp40(current.pos);
sp40.y += 50.0f;
f32 speed_scale = 1.0f - data().m_friction;
cM3dGPla plane;
bool gnd_check = fopAcM_gc_c::gndCheck(&sp40);
bool valid_plane = fopAcM_gc_c::getTriPla(&plane);
bool sp8 = false;
f32 var_f31 = data().m_slopeInfluence;
f32 temp_f25 = fopAcM_gc_c::getGroundY();
if (gnd_check && -G_CM3D_F_INF != temp_f25 && gnd_hit && !gnd_landing) {
bool var_r27 = 1;
if (fopAcM_gc_c::getPolyAtt0() == 3) {
var_r27 = 0;
}
if (mType == TYPE_IRON_BALL && fopAcM_gc_c::getPolyAtt0() == 13) {
var_f29 = 50.0f;
speed_scale = 0.8f;
var_f31 = 20.0f;
}
if (valid_plane && var_r27) {
f32 temp_f30 = cM_scos(cM_deg2s(var_f29 - 0.5f));
cXyz sp34(plane.mNormal);
if (sp34.y < temp_f30) {
cXyz sp28(sp34);
s16 temp_r26 = cM_atan2s(sp28.x, sp28.z);
var_f31 *= 1.0f - sp34.y;
if (var_f31 < 0.1f) {
var_f31 = 0.1f;
}
cXyz sp1C(speedF * cM_ssin(current.angle.y), 0.0f, speedF * cM_scos(current.angle.y));
cXyz sp10(var_f31 * cM_ssin(temp_r26), 0.0f, var_f31 * cM_scos(temp_r26));
sp1C += sp10;
speedF = std::sqrt((sp1C.x * sp1C.x) + (sp1C.z * sp1C.z));
if (!prm_chk_type_lightball()) {
f32 temp_f1 = std::sqrt((sp34.x * sp34.x) + (sp34.z * sp34.z));
if (0.0f != temp_f1) {
f32 temp_f26 = (0.9f + KREG_F(17)) * std::fabs((sp34.y / temp_f1) * data().m_gravity);
if (temp_f26 < speedF) {
speedF = temp_f26;
}
}
} else {
f32 temp_f24 = std::sqrt((sp34.x * sp34.x) + (sp34.z * sp34.z));
if (0.0f != temp_f30) {
speed.y = -speedF * (temp_f24 / temp_f30);
}
}
current.angle.y = cM_atan2s(sp1C.x, sp1C.z);
sp8 = 1;
}
}
}
speedF *= speed_scale;
if (mType != TYPE_IRON_BALL && mStts.GetCCMoveP()->abs2XZ() > 0.010000001f) {
speedF *= 0.9f;
}
fopAcM_posMoveF(this, mStts.GetCCMoveP());
return 1;
}
void daObjCarry_c::mode_init_carry() {
mAcch.ClrMoveBGOnly();
mAcch.ClrGrndNone();
mCyl.OffAtSPrmBit(1);
mCyl.OnTgSPrmBit(1);
mCyl.OffCoSPrmBit(0x10);
field_0xda8 = 0;
mCanCrashRoll = false;
mStts.SetWeight(data().m_colliderWeight);
fopAcM_SetMaxFallSpeed(this, -100.0f);
speedF = 0.0f;
current.angle.setall(0);
if (mMode == MODE_BOOM_CARRY) {
field_0xdaa = 1;
} else {
field_0xdaa = 0;
}
if (field_0xdb0 == 1) {
field_0xdb0 = 0;
field_0xd7a = 1;
fopAcM_OffCarryType(this, fopAcM_CARRY_TYPE_1);
mDoAud_seStart(Z2SE_OBJ_BOKKURI_PULLOUT, &current.pos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
}
field_0xd68 = 0;
if (prm_chk_type_ironball()) {
mAcch.ClrIronBall();
}
if (prm_chk_type_lightball()) {
cLib_offBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
daPy_py_c* player = daPy_getPlayerActorClass();
if (player->getGrabActorID() == fopAcM_GetID(this)) {
if (mType == TYPE_BALL_S) {
/* Palace of Twilight - Palace of Twilight use 1 */
if (!dComIfGs_isEventBit(dSv_event_flag_c::F_0311)
/* Palace of Twilight - Palace of Twilight use 3 */
&& !dComIfGs_isEventBit(dSv_event_flag_c::F_0313)
/* Palace of Twilight - Palace of Twilight use 5 */
&& !dComIfGs_isEventBit(dSv_event_flag_c::F_0315)
/* Palace of Twilight - Palace of Twilight use 7 */
&& !dComIfGs_isEventBit(dSv_event_flag_c::F_0317)
/* Palace of Twilight - Palace of Twilight use 9 */
&& !dComIfGs_isEventBit(dSv_event_flag_c::F_0319)) {
/* Palace of Twilight - Palace of Twilight use 5 */
dComIfGs_onEventBit(dSv_event_flag_c::F_0315);
}
/* Palace of Twilight - Palace of Twilight use 2 */
} else if (!dComIfGs_isEventBit(dSv_event_flag_c::F_0312)
/* Palace of Twilight - Palace of Twilight use 4 */
&& !dComIfGs_isEventBit(dSv_event_flag_c::F_0314)
/* Palace of Twilight - Palace of Twilight use 6 */
&& !dComIfGs_isEventBit(dSv_event_flag_c::F_0316)
/* Palace of Twilight - Palace of Twilight use 8 */
&& !dComIfGs_isEventBit(dSv_event_flag_c::F_0318)
/* Palace of Twilight - Palace of Twilight use 10 */
&& !dComIfGs_isEventBit(dSv_event_flag_c::F_0320)) {
/* Palace of Twilight - Palace of Twilight use 10 */
dComIfGs_onEventBit(dSv_event_flag_c::F_0320);
}
}
}
mMode = MODE_CARRY;
}
int daObjCarry_c::mode_proc_carry() {
daPy_py_c* player = (daPy_py_c*)daPy_getPlayerActorClass();
if (field_0xdaa == 0) {
if (player->getGrabActorID() == fopAcM_GetID(this) && player->getGrabUpStart()) {
field_0xdaa = 1;
}
}
if (!prm_chk_type_lightball()) {
if (mCyl.ChkCoHit()) {
cXyz* cc_move_p = mStts.GetCCMoveP();
if (cc_move_p != NULL) {
field_0xd08 += *cc_move_p;
}
}
mStts.ClrCcMove();
mCyl.ClrCoHit();
player->setGrabCollisionOffset(field_0xd08.x, field_0xd08.z, NULL);
}
if (!fopAcM_checkCarryNow(this)) {
bool temp_r26 = fopAcM_GetSpeedF(this) != 0.0f;
if (0.0f != fopAcM_GetSpeedF(this)) {
if (current.angle.x == 0) {
if (daPy_py_c::checkNowWolf()) {
speedF = data().m_wolfThrowInitSpeedXZ;
speed.y = data().m_wolfThrowInitSpeedY;
} else {
speedF = data().m_throwInitSpeedXZ;
speed.y = data().m_throwInitSpeedY;
}
} else {
if (daPy_py_c::checkNowWolf()) {
speedF = data().m_wolfThrowInitSpeedXZ;
} else {
speedF = data().m_throwInitSpeedXZ;
}
s16 temp_r0 = -current.angle.x;
speed.y = (speedF * cM_ssin(temp_r0)) / cM_scos(temp_r0);
}
current.angle.x = 0;
}
field_0xe24 = 30;
mAcch.OnLineCheck();
if (chkWaterLineIn()) {
if (chkSinkObj()) {
mode_init_sink();
} else {
mode_init_float();
}
} else if (temp_r26) {
mode_init_drop(0);
} else {
mode_init_walk(0);
}
field_0xdaa = 0;
}
field_0xcec = current.pos.y;
return 1;
}
void daObjCarry_c::mode_init_drop(u8 param_0) {
mAcch.ClrMoveBGOnly();
mAcch.ClrGrndNone();
mCyl.OnAtSPrmBit(1);
mCyl.OnTgSPrmBit(1);
mCyl.OnCoSPrmBit(0x10);
mCyl.OffAtSPrmBit(0xC);
cLib_offBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
mStts.SetWeight(data().m_colliderWeight);
field_0xda8 = 0;
mCanCrashRoll = false;
fopAcM_SetMaxFallSpeed(this, -100.0f);
gravity = calc_gravity();
if (mType == TYPE_BOKKURI && mMode == MODE_CARRY) {
gravity = -2.0f;
}
if (prm_chk_type_ironball()) {
mCyl.SetAtAtp(1);
}
mCannon = false;
mMode = MODE_DROP;
field_0xdb4 = 0;
}
int daObjCarry_c::mode_proc_drop() {
if (field_0xdb4 == 0) {
mAcch.OnLineCheck();
field_0xdb4 = 1;
}
fopAcM_posMoveF(this, mStts.GetCCMoveP());
if (prm_chk_type_ironball() && mCyl.GetAtAtp() == 100) {
mAtCps.cCcD_CpsAttr::Set(old.pos, current.pos, 40.0f);
cXyz sp8 = old.pos - current.pos;
mAtCps.SetAtVec(sp8);
mAtCps.SetAtAtp(100);
dComIfG_Ccsp()->Set(&mAtCps);
}
return 1;
}
void daObjCarry_c::mode_init_float() {
mAcch.ClrMoveBGOnly();
mAcch.ClrGrndNone();
mCyl.OffAtSPrmBit(1);
mCyl.OnTgSPrmBit(1);
mCyl.OnCoSPrmBit(0x10);
cLib_onBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
field_0xda8 = 0;
field_0xdc4 = 0;
field_0xdc8 = 0.0f;
if (speedF > 10.0f || speed.y < -20.0f) {
field_0xd5c = 3000.0f;
field_0xd60 = 3000.0f;
}
speed.y = -12.0f;
speedF = cLib_minMaxLimit<f32>(speedF, -10.0f, 10.0f);
mStts.SetWeight(KREG_S(2) + 100);
field_0xd6c = fopAcM_GetSpeed_p(this)->y;
if (prm_chk_type_ironball()) {
mAcch.ClrIronBall();
}
mMode = MODE_FLOAT;
}
int daObjCarry_c::mode_proc_float() {
field_0xdc4++;
gravity = 0.0f;
cXyz sp34;
f32 speed_target;
int spC = 0;
if (fopAcM_getWaterStream(&current.pos, mAcch.m_gnd, &sp34, &spC, 0)) {
s16 sp8 = cM_atan2s(sp34.x, sp34.z);
cXyz sp28(speedF * cM_ssin(current.angle.y), 0.0f, speedF * cM_scos(current.angle.y));
sp34.normalizeZP();
sp34 *= 0.2f * spC;
sp28 += sp34;
current.angle.y = cM_atan2s(sp28.x, sp28.z);
speed_target = 0.8f * spC;
if (speed_target < 2.0f) {
speed_target = 2.0f;
}
} else {
speed_target = 0.0f;
}
cLib_addCalc(&speedF, speed_target, 0.05f, 0.1f, 0.01f);
cLib_addCalc0(&speed.y, 1.0f, 0.2f);
fopAcM_posMoveF(this, mStts.GetCCMoveP());
cXyz sp1C(current.pos);
int temp_r27 = fopAcM_getWaterY(&current.pos, &sp1C.y);
f32 temp_f28 = field_0xdc8 * cM_ssin(field_0xdc4 * 1000);
if (temp_r27 != 0) {
current.pos.y = sp1C.y - data().field_0x24;
cLib_addCalc2(&field_0xdc8, 0.5f, 0.05f, 1.0f);
current.pos.y += temp_f28;
}
f32 var_f30 = 800.0f;
f32 var_f29 = 800.0f;
if (mCyl.ChkCoHit() && field_0xdac == 0) {
var_f30 = 1200.0f;
var_f29 = 1200.0f;
}
cLib_addCalc2(&field_0xd5c, var_f30, 0.03f, 100.0f);
cLib_addCalc2(&field_0xd60, var_f29, 0.03f, 100.0f);
field_0xd64 = field_0xd5c * cM_ssin(field_0xdc4 * 1200);
field_0xd66 = field_0xd60 * cM_ssin(field_0xdc4 * 800);
shape_angle.x = field_0xd64;
shape_angle.z = field_0xd66;
return 1;
}
void daObjCarry_c::mode_init_sink() {
mAcch.ClrMoveBGOnly();
mAcch.ClrGrndNone();
mCyl.OffAtSPrmBit(1);
mCyl.OnTgSPrmBit(1);
mCyl.OnCoSPrmBit(0x10);
cLib_offBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
field_0xda8 = 0;
mStts.SetWeight(data().m_colliderWeight);
if (mMode == MODE_CARRY && 0.0f != speedF) {
speedF = cLib_minMaxLimit<f32>(speedF, -5.0f - KREG_F(2), 5.0f + KREG_F(2));
speed.y = cLib_minMaxLimit<f32>(speed.y, -15.0f - KREG_F(3), 5.0f + KREG_F(4));
} else {
speedF = cLib_minMaxLimit<f32>(speedF, -5.0f - KREG_F(2), 5.0f + KREG_F(2));
speed.y = cLib_minMaxLimit<f32>(speed.y, -5.0f - KREG_F(3), 13.0f + KREG_F(4));
}
gravity = -0.25f + KREG_F(5);
if (prm_chk_type_ironball()) {
mAcch.ClrIronBall();
}
mMode = MODE_SINK;
}
int daObjCarry_c::mode_proc_sink() {
cXyz sp24;
f32 speed_target;
int sp8 = 0;
if (fopAcM_getWaterStream(&current.pos, mAcch.m_gnd, &sp24, &sp8, 0)) {
s16 var_r27 = cM_atan2s(sp24.x, sp24.z);
cXyz sp18(speedF * cM_ssin(current.angle.y), 0.0f, speedF * cM_scos(current.angle.y));
sp24.normalizeZP();
sp18 += sp24;
current.angle.y = cM_atan2s(sp18.x, sp18.z);
speed_target = 0.8f * sp8;
if (speed_target < 2.0f) {
speed_target = 2.0f;
}
} else {
speed_target = 0.0f;
}
cLib_addCalc(&speedF, speed_target, 0.05f, 0.1f, 0.01f);
speed.y = cLib_minMaxLimit<f32>(speed.y, -15.0f - KREG_F(3), 13.0f + KREG_F(4));
if (mAcch.ChkGroundHit()) {
speedF *= 0.9f;
}
if (chkWaterLineIn()) {
gravity = -0.25f + KREG_F(5);
} else {
gravity = data().m_gravity;
}
fopAcM_posMoveF(this, mStts.GetCCMoveP());
if (mAcch.ChkGroundHit()) {
cLib_onBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
} else {
cLib_offBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
}
field_0xcec = current.pos.y;
return 1;
}
void daObjCarry_c::mode_init_yogan() {
mAcch.ClrMoveBGOnly();
mAcch.ClrGrndNone();
mCyl.OffAtSPrmBit(1);
mCyl.OnCoSPrmBit(0x10);
cLib_offBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
mStts.SetWeight(data().m_colliderWeight);
fopAcM_SetGravity(this, -2.0f);
fopAcM_SetMaxFallSpeed(this, -6.0f);
if (prm_chk_type_ironball()) {
mAcch.ClrIronBall();
}
mMode = MODE_YOGAN;
}
int daObjCarry_c::mode_proc_yogan() {
bool temp_r30 = mAcch.m_wtr.GetHeight() > 200.0f + current.pos.y;
bool gnd_landing = mAcch.ChkGroundLanding();
speedF *= 0.65f;
fopAcM_posMoveF(this, NULL);
if (temp_r30 || gnd_landing) {
fopAcM_delete(this);
}
return 1;
}
int daObjCarry_c::mode_proc_magne() {
return 1;
}
int daObjCarry_c::mode_proc_magneCarry() {
return 1;
}
void daObjCarry_c::mode_init_boomCarry() {
mAcch.ClrMoveBGOnly();
mAcch.ClrGrndNone();
mCyl.OffAtSPrmBit(1);
mCyl.OnTgSPrmBit(1);
mCyl.OnCoSPrmBit(1);
mCyl.OnCoSPrmBit(0x10);
cLib_offBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
mCanCrashRoll = false;
gravity = calc_gravity();
fopAcM_SetMaxFallSpeed(this, -100.0f);
mStts.SetWeight(data().m_colliderWeight);
mCyl.GetTgHitGObj();
mBoomerangMove.initOffset(&current.pos);
if (field_0xdb0 == 1) {
field_0xdb0 = 0;
fopAcM_OffCarryType(this, fopAcM_CARRY_TYPE_1);
field_0xd7a = 1;
}
if (prm_chk_type_ironball()) {
mAcch.ClrIronBall();
}
mMode = MODE_BOOM_CARRY;
}
int daObjCarry_c::mode_proc_boomCarry() {
if (!mBoomerangMove.posMove(&current.pos, &shape_angle.y, this, 0x1C00)) {
if (fopAcM_checkCarryNow(this)) {
mode_init_carry();
} else {
mode_init_wait();
}
}
return 1;
}
void daObjCarry_c::mode_init_growth() {
mAcch.ClrMoveBGOnly();
mAcch.ClrGrndNone();
mCyl.OffAtSPrmBit(1);
mCyl.OnTgSPrmBit(1);
mCyl.OnCoSPrmBit(1);
mCyl.OnCoSPrmBit(0x10);
cLib_offBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
field_0xdb0 = 1;
scale.setall(0.0f);
field_0xd79 = 2;
mStts.SetWeight(data().m_colliderWeight);
mMode = MODE_GROWTH;
}
int daObjCarry_c::mode_proc_growth() {
f32 sp8 = scale.x;
f32 temp_f31 = cLib_addCalc(&sp8, data().scale, 0.05f, 0.1f, 0.01f);
scale.setall(sp8);
if (0.0f == temp_f31) {
field_0xcf3 = 10;
field_0xdb1 = 1;
mode_init_wait();
}
return 1;
}
int daObjCarry_c::mode_proc_end() {
return 1;
}
void daObjCarry_c::mode_init_dbDrop(u8 param_0) {
mAcch.ClrMoveBGOnly();
mAcch.ClrGrndNone();
mCyl.OffAtSPrmBit(1);
mCyl.OnCoSPrmBit(0x10);
mCyl.OffTgSPrmBit(1);
cLib_offBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
fopAcM_SetMaxFallSpeed(this, -100.0f);
mStts.SetWeight(data().m_colliderWeight);
gravity = calc_gravity();
field_0xd75 = 1;
field_0xd79 = 0;
mMode = MODE_DB_DROP;
}
int daObjCarry_c::mode_proc_dbDrop() {
fopAcM_posMoveF(this, mStts.GetCCMoveP());
return 1;
}
void daObjCarry_c::mode_init_hookCarry() {
mAcch.ClrMoveBGOnly();
mAcch.ClrGrndNone();
mCyl.OffAtSPrmBit(1);
mCyl.OnTgSPrmBit(1);
mCyl.OnCoSPrmBit(1);
mCyl.OnCoSPrmBit(0x10);
cLib_offBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
mCanCrashRoll = false;
gravity = calc_gravity();
fopAcM_SetMaxFallSpeed(this, -100.0f);
mStts.SetWeight(data().m_colliderWeight);
mCyl.GetTgHitGObj();
mBoomerangMove.initOffset(&current.pos);
if (prm_chk_type_ironball()) {
mAcch.ClrIronBall();
} else if (prm_chk_type_lightball() || mType == TYPE_LV8_BALL) {
mSound.startCollisionSE(Z2SE_HIT_HOOKSHOT_STICK, 0, NULL);
}
mMode = MODE_HOOK_CARRY;
}
int daObjCarry_c::mode_proc_hookCarry() {
if (!fopAcM_checkHookCarryNow(this)) {
mode_init_wait();
}
return 1;
}
void daObjCarry_c::mode_init_fit() {
mAcch.ClrMoveBGOnly();
mAcch.ClrGrndNone();
mCyl.OffAtSPrmBit(1);
mCyl.OnTgSPrmBit(1);
mCyl.OnCoSPrmBit(0x10);
cLib_offBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
fopAcM_OffStatus(this, 0x80000);
field_0xda8 = 0;
speedF = 0.0f;
gravity = data().m_gravity;
fopAcM_SetMaxFallSpeed(this, -100.0f);
mStts.SetWeight(0xFF);
if (prm_chk_type_ironball()) {
mAcch.ClrIronBall();
}
mMode = MODE_FIT;
}
int daObjCarry_c::mode_proc_fit() {
fopAcM_posMoveF(this, NULL);
return 1;
}
int daObjCarry_c::mode_proc_controled() {
calc_rot_call();
setBaseMtx();
field_0xdb9 = mCtrl;
field_0xdec = current.pos;
return 1;
}
void daObjCarry_c::mode_init_resetLightBall() {
mAcch.ClrMoveBGOnly();
mAcch.ClrGrndNone();
mCyl.OffAtSPrmBit(1);
mCyl.OffTgSPrmBit(1);
mCyl.OnCoSPrmBit(0x10);
cLib_offBit<u32>(attention_info.flags, fopAc_AttnFlag_CARRY_e);
field_0xda8 = 0;
speedF = 0.0f;
speed.setall(0.0f);
mStts.ClrCcMove();
gravity = data().m_gravity;
fopAcM_SetMaxFallSpeed(this, -100.0f);
mStts.SetWeight(data().m_colliderWeight);
mMode = MODE_RESET_LIGHTBALL;
}
int daObjCarry_c::mode_proc_resetLightBall() {
if (cLib_chaseF(&scale.x, 1.0f, 0.05f)) {
field_0xcf3 = 10;
field_0xdb1 = 1;
mode_init_wait();
}
scale.y = scale.x;
scale.z = scale.x;
fopAcM_posMoveF(this, NULL);
return 1;
}
BOOL daObjCarry_c::chkSinkAll() {
return mAcch.m_wtr.GetHeight() > current.pos.y + data().field_0x2c * 2.0f;
}
BOOL daObjCarry_c::chkWaterLineIn() {
return mAcch.m_wtr.GetHeight() > current.pos.y + data().field_0x24;
}
BOOL daObjCarry_c::chkSinkObj() {
return data().m_gravity + data().m_Buoyancy <= 0.0f;
}
void daObjCarry_c::bg_check() {
bool roof_hit = mAcch.ChkRoofHit();
bool wall_hit = mAcch.ChkWallHit();
bool gnd_landing = mAcch.ChkGroundLanding();
bool gnd_hit = mAcch.ChkGroundHit();
bool water_hit = mAcch.ChkWaterHit();
bool water_in = mAcch.ChkWaterIn();
if (wall_hit && field_0xe0d == 0) {
cM3dGPla spA0;
bool sp10 = dComIfG_Bgsp().GetTriPla(mAcchCir, &spA0);
f32 var_f27 = 0.0f;
if (sp10 != 0) {
var_f27 = speed.inprod(spA0.mNormal);
}
if (var_f27 < 0.0f) {
if (speed.abs() > 8.0f) {
f32 sp30 = field_0xd1c.y;
cXyz sp94(speed);
cXyz sp88(speed);
f32 var_f31 = data().field_0x14;
if (mCannon) {
var_f31 = 0.05f;
}
switch (dComIfG_Bgsp().GetPolyAtt0(mAcchCir)) {
case 13:
if (mType == TYPE_IRON_BALL && !mCannon) {
var_f31 = 0.2f;
}
/* fallthrough */
case 8:
if (mType == TYPE_IRON_BALL) {
if (!mCannon) {
var_f31 = 0.2f;
}
cXyz size(1.0f + KREG_F(10), 1.0f + KREG_F(10), 1.0f + KREG_F(10));
dComIfGp_particle_set(0xAE3, &current.pos, &current.angle, &size);
mDoAud_seStart(Z2SE_OBJ_IRONBALL_HIT_ICE, &current.pos, (u32)std::fabs(speedF), 0);
// "Iron Ball: Ice Wall Hit SE<%d>\n"
OS_REPORT("鉄球:氷壁ヒットSE<%d>\n", (u32)std::fabs(speedF));
}
break;
default:
if (mType == TYPE_IRON_BALL) {
mDoAud_seStart(Z2SE_OBJ_IRONBALL_HIT, &current.pos, std::fabs(speedF), 0);
// "Iron Ball: Wall Hit SE<%d>\n"
OS_REPORT("鉄球:壁ヒットSE<%d>\n", (u32)std::fabs(speedF));
}
break;
}
bound(&sp94, mAcchCir, var_f31);
speed.set(sp94);
speed.y = sp88.y;
speedF = sp94.absXZ();
current.angle.y = cM_atan2s(sp94.x, sp94.z);
} else {
speedF = 0.0f;
}
}
}
if (gnd_landing) {
f32 temp_f30 = field_0xd1c.y;
if (speed.abs() > 1.0f) {
f32 var_f29 = data().field_0x14;
f32 var_f28 = data().field_0x10;
switch (dComIfG_Bgsp().GetPolyAtt0(mAcch.m_gnd)) {
case 3:
var_f29 = 0.1f;
var_f28 = 0.1f;
break;
case 13:
if (mType == TYPE_IRON_BALL) {
var_f29 = 0.2f;
var_f28 = 0.2f;
if (std::fabs(field_0xd1c.y) > 10.0f) {
cXyz sp70(0.9f + KREG_F(10), 0.9f + KREG_F(10), 0.9f + KREG_F(10));
dComIfGp_particle_setPolyColor(0x881F, mAcch.m_gnd, &current.pos, &tevStr, &current.angle, &sp70, 0, NULL, -1, NULL);
dComIfGp_particle_setPolyColor(0x8820, mAcch.m_gnd, &current.pos, &tevStr, &current.angle, &sp70, 0, NULL, -1, NULL);
}
}
break;
default:
if (mType == TYPE_IRON_BALL && std::fabs(field_0xd1c.y) > 10.0f) {
cXyz sp64(0.9f + KREG_F(10), 0.9f + KREG_F(10), 0.9f + KREG_F(10));
dComIfGp_particle_setPolyColor(0xE7, mAcch.m_gnd, &current.pos, &tevStr, &current.angle, &sp64, 0, NULL, -1, NULL);
}
break;
}
bound(&speed, mAcch.m_gnd, var_f29);
speedF = std::sqrt((speed.x * speed.x) + (speed.z * speed.z));
if (chkWaterLineIn()) {
speed.y = 0.0f;
} else {
speed.y = -temp_f30 * var_f28;
}
if (std::fabs(speed.y) < 5.0f) {
speed.y = 0.0f;
}
}
if (mType == TYPE_IRON_BALL) {
switch (dComIfG_Bgsp().GetPolyAtt0(mAcch.m_gnd)) {
case 13: {
u32 sp2C = std::sqrt((speedF * speedF) + (speed.y * speed.y));
mDoAud_seStart(Z2SE_OBJ_IRONBALL_HIT_SNOW, &current.pos, std::fabs(temp_f30), 0);
break;
}
case 8: {
u32 sp2C = std::sqrt((speedF * speedF) + (speed.y * speed.y));
mDoAud_seStart(Z2SE_OBJ_IRONBALL_HIT_ICE, &current.pos, std::fabs(temp_f30), 0);
break;
}
default:
if (!fopAcM_checkCarryNow(this)) {
mDoAud_seStart(Z2SE_OBJ_IRONBALL_HIT, &current.pos, std::fabs(temp_f30), 0);
}
break;
}
}
}
if (mMode == MODE_WAIT || mMode == MODE_WALK || mMode == MODE_DROP || mMode == MODE_DB_DROP || mMode == MODE_CARRY) {
f32 water_height = mAcch.m_wtr.GetHeight();
if (water_hit) {
f32 sp28 = speed.y;
int poly_att = dComIfG_Bgsp().GetPolyAtt0(mAcch.m_wtr);
switch (poly_att) {
default:
case 7:
case 11:
if (chkWaterLineIn() && mMode != MODE_CARRY) {
if (chkSinkObj()) {
mode_init_sink();
} else {
mode_init_float();
}
}
if (water_in && field_0xdad == 0) {
cXyz pos(current.pos);
pos.y = water_height;
if (sp28 < -15.0f) {
fopKyM_createWpillar(&pos, data().field_0x88, 0);
se_fall_water();
} else {
daPy_py_c* player = daPy_getPlayerActorClass();
if (mMode != MODE_CARRY || (mMode == MODE_CARRY && player->speedF < 10.0f)) {
se_put_water();
}
}
}
break;
case 6:
if (chkWaterLineIn()) {
mode_init_yogan();
}
if (water_in && field_0xdad == 0) {
cXyz pos(current.pos.x, water_height, current.pos.z);
cXyz size(data().field_0x8c, data().field_0x8c, data().field_0x8c);
dComIfGp_particle_set(0x8757, &pos, &tevStr, NULL, &size);
dComIfGp_particle_set(0x8758, &pos, &tevStr, NULL, &size);
}
break;
}
}
if (gnd_landing && !chkWaterLineIn() && (mMode == MODE_DROP || mMode == MODE_DB_DROP)) {
if (mType == TYPE_BOKKURI) {
field_0xd5c = 4000.0f + cM_rndF(1000.0f);
field_0xd60 = 3000.0f + cM_rndF(900.0f);
field_0xd68 = 3000;
}
mode_init_walk(0);
}
} else if ((mMode == MODE_FLOAT || mMode == MODE_SINK) && ((gnd_hit && !chkWaterLineIn()) || !water_in)) {
f32 sp1C = speedF;
f32 sp18 = speed.y;
mode_init_walk(0);
if (water_in == 0) {
speedF = sp1C;
speed.y = sp18;
}
}
if (gnd_hit) {
if (field_0xcf3 != 0) {
field_0xcf3--;
} else if ((mMode == MODE_WALK || mMode == MODE_DROP || mMode == MODE_DB_DROP || mMode == MODE_WAIT || mMode == MODE_SINK) && field_0xdae == 0 && field_0xdb1 == 0 && field_0xcf3 == 0) {
if (mType != TYPE_IRON_BALL) {
se_put(NULL);
}
field_0xdb1 = 1;
}
} else if (field_0xdb0 == 0) {
field_0xdb1 = 0;
}
cXyz sp34(current.pos);
sp34.y = mAcch.m_wtr.GetHeight();
if (water_hit && sp34.y > current.pos.y && (mMode == MODE_FLOAT || (mMode == MODE_SINK && !chkSinkAll()) || (mMode == MODE_WAIT && gnd_hit) || (mMode == MODE_WALK && gnd_hit) || (mMode == MODE_CARRY && water_in && !chkSinkAll()))) {
fopAcM_effHamonSet(&field_0xdd4, &sp34, 1.0f, 0.1f);
}
if (mType == TYPE_IRON_BALL && roof_hit && gnd_hit) {
// "Lift: pinched!\n"
OS_REPORT("持ち上げ:挟まれました!\n");
current.pos.y -= 50.0f;
}
field_0xe0d = wall_hit;
}
bool daObjCarry_c::check_bg_damage_proc_base() {
bool gnd_landing = mAcch.ChkGroundLanding();
bool wall_hit = mAcch.ChkWallHit();
bool var_r30 = false;
if (gnd_landing) {
var_r30 = dComIfG_Bgsp().GetPolyAtt0(mAcch.m_gnd) != 3;
}
if (mMode == MODE_DROP) {
if (wall_hit || var_r30) {
return 1;
}
if (mType == TYPE_TARU) {
if (strcmp(dComIfGp_getStartStageName(), "R_SP160") == 0 && fopAcM_GetRoomNo(this) == 4 && fopAcM_lc_c::lineCheck(&old.pos, &current.pos, this)) {
return 1;
}
}
}
if (var_r30 != 0) {
if (std::fabs(current.pos.y - field_0xcec) > data().field_0x54) {
return 1;
}
}
if (mMode == MODE_BOOM_CARRY && wall_hit) {
return 1;
}
return 0;
}
bool daObjCarry_c::bg_damage_proc_kotubo() {
bool rt = check_bg_damage_proc_base();
if (rt) {
obj_break(true, true, true);
fopAcM_delete(this);
}
return rt;
}
bool daObjCarry_c::bg_damage_proc_ootubo() {
return bg_damage_proc_kotubo();
}
bool daObjCarry_c::bg_damage_proc_kibako() {
return bg_damage_proc_kotubo();
}
bool daObjCarry_c::bg_damage_proc_ironball() {
return false;
}
bool daObjCarry_c::bg_damage_proc_taru() {
return bg_damage_proc_kotubo();
}
bool daObjCarry_c::bg_damage_proc_dokuro() {
return bg_damage_proc_kotubo();
}
bool daObjCarry_c::bg_damage_proc_bokkuri() {
bool rt = check_bg_damage_proc_base();
if (field_0xd74 != 0) {
rt = false;
}
if (mAcch.ChkWaterHit() && mAcch.ChkWaterIn()) {
fopAcM_seStart(this, Z2SE_OBJ_BOKKURI_FALLWATER, 0);
field_0xdb3 = 1;
rt = true;
}
if (rt) {
obj_break(true, true, true);
fopAcM_delete(this);
}
return rt;
}
bool daObjCarry_c::bg_damage_proc_LightBall() {
return false;
}
bool daObjCarry_c::bg_damage_proc_Lv8Ball() {
return false;
}
void daObjCarry_c::obj_break(bool i_createItem, bool i_cancelCarry, bool i_doBreakEff) {
int item_no = getItemNo();
int item_bit = getItemBit();
if (i_createItem) {
if (getItemType() == 0) {
csXyz angle(0, home.angle.y, 0);
fopAcM_createItem(&current.pos, item_no, item_bit, fopAcM_GetHomeRoomNo(this), &angle, NULL, 0);
} else {
csXyz angle(0, home.angle.y, 0);
fopAcM_createItemFromTable(&current.pos, item_no, item_bit, fopAcM_GetHomeRoomNo(this), &angle, 0, NULL, NULL, NULL, false);
}
}
if (i_cancelCarry) {
fopAcM_cancelCarryNow(this);
fopAcM_cancelHookCarryNow(this);
}
if (i_doBreakEff) {
eff_break_call();
se_break(NULL);
}
}
bool daObjCarry_c::check_cc_damage_proc_base(bool param_0) {
bool rt = false;
if (mCyl.ChkAtHit()) {
mCyl.ClrAtHit();
rt = true;
} else if (mCyl.ChkTgHit()) {
cCcD_Obj* tg_hit_obj = mCyl.GetTgHitObj();
if (tg_hit_obj != NULL && !tg_hit_obj->ChkAtType(AT_TYPE_BOOMERANG)) {
mCyl.ClrTgHit();
rt = true;
}
}
return rt;
}
bool daObjCarry_c::cc_damage_proc_kotubo() {
bool rt = check_cc_damage_proc_base(false);
if (rt) {
obj_break(true, true, true);
fopAcM_delete(this);
}
return rt;
}
bool daObjCarry_c::cc_damage_proc_ootubo() {
return cc_damage_proc_kotubo();
}
bool daObjCarry_c::cc_damage_proc_kibako() {
bool break_obj = false;
bool do_break_eff = false;
bool delete_obj = false;
if (mCyl.ChkAtHit()) {
break_obj = true;
do_break_eff = true;
delete_obj = true;
} else if (mCyl.ChkTgHit()) {
dCcD_GObjInf* tg_hit_gobj = mCyl.GetTgHitGObj();
if (tg_hit_gobj != NULL) {
if (!tg_hit_gobj->ChkAtType(AT_TYPE_LANTERN_SWING) && tg_hit_gobj->GetAtMtrl() == dCcD_MTRL_FIRE) {
if (mAcch.ChkGroundHit()) {
u32 params;
daObjBurnBox_c::make_prm_burnBox(&params, 0);
fopAcM_createChild(PROC_Obj_BurnBox, fopAcM_GetID(this), params, &current.pos, fopAcM_GetRoomNo(this), &shape_angle, &scale, -1, NULL);
break_obj = true;
do_break_eff = false;
delete_obj = false;
mDeleteTimer = 5;
} else {
break_obj = true;
do_break_eff = true;
delete_obj = true;
}
} else if (!tg_hit_gobj->ChkAtType(AT_TYPE_ARROW) && !tg_hit_gobj->ChkAtType(AT_TYPE_SHIELD_ATTACK) && !tg_hit_gobj->ChkAtType(AT_TYPE_BOOMERANG)) {
break_obj = true;
do_break_eff = true;
delete_obj = true;
}
}
}
if (break_obj) {
obj_break(true, true, do_break_eff);
}
if (delete_obj) {
fopAcM_delete(this);
}
return break_obj;
}
bool daObjCarry_c::cc_damage_proc_ironball() {
bool var_r26 = false;
bool var_r27 = true;
if (mAcch.ChkGroundHit() && dComIfG_Bgsp().ChkPolySafe(mAcch.m_gnd) && dComIfG_Bgsp().ChkMoveBG_NoDABg(mAcch.m_gnd) && dComIfG_Bgsp().GetActorPointer(mAcch.m_gnd)) {
s16 name = fopAcM_GetName(dComIfG_Bgsp().GetActorPointer(mAcch.m_gnd));
if (name == PROC_Obj_YIblltray) {
var_r27 = false;
mStts.ClrCcMove();
}
}
if (mCyl.ChkTgHit() && var_r27) {
dCcD_GObjInf* tg_hit_gobj = mCyl.GetTgHitGObj();
if (tg_hit_gobj != NULL && tg_hit_gobj->ChkAtType(AT_TYPE_IRON_BALL) && tg_hit_gobj->GetAtAtp() != 1 && tg_hit_gobj->GetAtAtp() != 100) {
cXyz* at_vec_p = tg_hit_gobj->GetAtVecP();
if (at_vec_p != NULL) {
speedF = 100.0f + KREG_F(4);
current.angle.y = cM_atan2s(at_vec_p->x, at_vec_p->z);
}
}
}
return var_r26;
}
bool daObjCarry_c::cc_damage_proc_taru() {
bool break_obj = false;
bool do_break_eff = false;
bool delete_obj = false;
if (mCyl.ChkAtHit()) {
mCyl.ClrAtHit();
break_obj = true;
do_break_eff = true;
delete_obj = true;
} else if (mCyl.ChkTgHit()) {
dCcD_GObjInf* tg_hit_gobj = mCyl.GetTgHitGObj();
if (tg_hit_gobj != NULL) {
if (!tg_hit_gobj->ChkAtType(AT_TYPE_LANTERN_SWING) && tg_hit_gobj->GetAtMtrl() == dCcD_MTRL_FIRE) {
if (mAcch.ChkGroundHit()) {
u32 params;
daObjBurnBox_c::make_prm_burnBox(&params, 2);
fopAcM_createChild(PROC_Obj_BurnBox, fopAcM_GetID(this), params, &current.pos, fopAcM_GetRoomNo(this), &shape_angle, &scale, -1, NULL);
break_obj = true;
do_break_eff = false;
delete_obj = false;
mDeleteTimer = 5;
} else {
break_obj = true;
do_break_eff = true;
delete_obj = true;
}
} else if (!tg_hit_gobj->ChkAtType(AT_TYPE_ARROW) && !tg_hit_gobj->ChkAtType(AT_TYPE_SHIELD_ATTACK) && !tg_hit_gobj->ChkAtType(AT_TYPE_BOOMERANG)) {
mCyl.ClrTgHit();
break_obj = true;
do_break_eff = true;
delete_obj = true;
}
}
}
if (break_obj) {
obj_break(true, true, do_break_eff);
}
if (delete_obj) {
fopAcM_delete(this);
}
return break_obj;
}
bool daObjCarry_c::cc_damage_proc_dokuro() {
return cc_damage_proc_kotubo();
}
bool daObjCarry_c::cc_damage_proc_bokkuri() {
daPy_py_c* player = daPy_getPlayerActorClass();
bool break_obj = false;
bool var_r26 = true;
if (mCyl.ChkAtHit()) {
break_obj = true;
var_r26 = false;
} else if (mCyl.ChkTgHit()) {
cCcD_Obj* tg_hit_obj = mCyl.GetTgHitObj();
if (tg_hit_obj != NULL) {
if (!tg_hit_obj->ChkAtType(AT_TYPE_BOOMERANG) && !tg_hit_obj->ChkAtType(AT_TYPE_SHIELD_ATTACK)) {
break_obj = true;
}
if (tg_hit_obj->ChkAtType(AT_TYPE_NORMAL_SWORD)) {
if (player->speedF > 10.0f) {
var_r26 = false;
}
if (field_0xd75 != 0) {
fopAcM_seStart(this, Z2SE_OBJ_BOKKURI_HIT_ROLL, 0);
}
}
if (tg_hit_obj->ChkAtType(AT_TYPE_SHIELD_ATTACK)) {
if (field_0xdb0 != 0) {
field_0xd7a = 0x10;
fopAcM_OffCarryType(this, fopAcM_CARRY_TYPE_1);
}
field_0xdb0 = 0;
if (mMode == MODE_WAIT || mMode == MODE_WALK) {
cXyz sp8 = current.pos - player->current.pos;
speedF = 25.0f;
current.angle.y = cM_atan2s(sp8.x, sp8.z);
mode_init_walk(0);
}
fopAcM_seStart(this, Z2SE_OBJ_BOKKURI_HIT_ROLL, 0);
}
}
}
if (field_0xd75 != 0) {
break_obj = false;
}
if (break_obj) {
obj_break(true, true, true);
fopAcM_delete(this);
}
return break_obj;
}
bool daObjCarry_c::cc_damage_proc_LightBall() {
return false;
}
bool daObjCarry_c::cc_damage_proc_Lv8Ball() {
return false;
}
void daObjCarry_c::eff_break_tuboBmd(u16 param_0, cXyz param_1) {
J3DModelData* tubo_bmd = (J3DModelData*)dComIfG_getObjectRes("Always", 0x20);
J3DAnmTexPattern* tubo_btp = (J3DAnmTexPattern*)dComIfG_getObjectRes("Always", 0x42);
JUT_ASSERT(6963, tubo_bmd != NULL);
JUT_ASSERT(6964, tubo_btp != NULL);
JPABaseEmitter* emitter = dComIfGp_particle_set(0x15C, &current.pos, NULL, NULL, 0xFF, &dPa_modelEcallBack::getEcallback(), fopAcM_GetRoomNo(this), NULL, NULL, &param_1);
dPa_modelEcallBack::setModel(emitter, tubo_bmd, tevStr, 3, tubo_btp, param_0);
dComIfGp_particle_set(0x15D, &current.pos, NULL, NULL, 0xFF, dPa_control_c::getTsuboSelectTexEcallBack(param_0), fopAcM_GetRoomNo(this), NULL, NULL, &param_1);
}
void daObjCarry_c::eff_break_kibakoBmd(cXyz i_size) {
cXyz pos(current.pos);
J3DModelData* kibako_bmd = (J3DModelData*)dComIfG_getObjectRes("Always", "BreakWoodBox.bmd");
JUT_ASSERT(7005, kibako_bmd != NULL);
JPABaseEmitter* emitter = dComIfGp_particle_set(0x82AF, &pos, NULL, NULL, 0xFF, &dPa_modelEcallBack::getEcallback(), fopAcM_GetRoomNo(this), NULL, NULL, &i_size);
dPa_modelEcallBack::setModel(emitter, kibako_bmd, tevStr, 3, NULL, 0, 0);
for (int i = 0; i < 3; i++) {
static u16 const particle_id[] = {0x82AB, 0x82AC, 0x82AD};
dComIfGp_particle_set(particle_id[i], &pos, NULL, &i_size, 0xFF, NULL, -1, NULL, NULL, NULL);
}
}
void daObjCarry_c::eff_break_tsubo() {
u16 var_r31 = 0;
cXyz spC(cXyz(1.0f, 1.0f, 1.0f));
eff_break_tuboBmd(var_r31, spC);
}
void daObjCarry_c::eff_break_ootubo() {
u16 var_r31 = 1;
cXyz spC(cXyz(1.5f, 1.5f, 1.5f));
eff_break_tuboBmd(var_r31, spC);
}
void daObjCarry_c::eff_break_kibako() {
cXyz size(scale);
eff_break_kibakoBmd(size);
}
void daObjCarry_c::eff_break_ironball() {}
void daObjCarry_c::eff_break_taru() {
cXyz size(0.75f, 0.75f, 0.75f);
eff_break_kibakoBmd(size);
}
void daObjCarry_c::eff_break_dokuro() {
u16 var_r31 = 2;
cXyz spC(cXyz(1.0f, 1.0f, 1.0f));
eff_break_tuboBmd(var_r31, spC);
}
void daObjCarry_c::eff_break_bokkuri() {
cXyz pos(current.pos);
pos.y += 50.0f;
J3DModelData* tubo_bmd = (J3DModelData*)dComIfG_getObjectRes("Always", 0x20);
J3DAnmTexPattern* tubo_btp = (J3DAnmTexPattern*)dComIfG_getObjectRes("Always", 0x42);
JUT_ASSERT(7108, tubo_bmd != NULL);
JUT_ASSERT(7109, tubo_btp != NULL);
JPABaseEmitter* emitter = dComIfGp_particle_set(0x15C, &current.pos, NULL, NULL, 0xFF, &dPa_modelEcallBack::getEcallback(), fopAcM_GetRoomNo(this), NULL, NULL, &scale);
dPa_modelEcallBack::setModel(emitter, tubo_bmd, tevStr, 3, tubo_btp, 5);
for (int i = 0; i < 3; i++) {
static u16 const particle_id[] = {0x8268, 0x8269, 0x826A};
dComIfGp_particle_set(particle_id[i], &pos, NULL, &scale, 0xFF, NULL, -1, NULL, NULL, NULL);
}
}
void daObjCarry_c::eff_break_kotubo2() {
u16 var_r31 = 1;
cXyz spC(cXyz(1.0f, 1.0f, 1.0f));
eff_break_tuboBmd(var_r31, spC);
}
void daObjCarry_c::eff_break_LightBall() {}
void daObjCarry_c::eff_break_ootubo2() {
u16 var_r31 = 0;
cXyz spC(cXyz(1.5f, 1.5f, 1.5f));
eff_break_tuboBmd(var_r31, spC);
}
void daObjCarry_c::eff_break_Lv8Ball() {}
void daObjCarry_c::eff_break_tsuboL8() {
u16 var_r31 = 7;
cXyz spC(cXyz(1.0f, 1.0f, 1.0f));
eff_break_tuboBmd(var_r31, spC);
}
void daObjCarry_c::eff_break_ootuboL8() {
u16 var_r31 = 7;
cXyz spC(cXyz(1.5f, 1.5f, 1.5f));
eff_break_tuboBmd(var_r31, spC);
}
void daObjCarry_c::se_break(cBgS_PolyInfo*) {
if (field_0xdb3 == 0) {
fopAcM_seStart(this, data().m_breakSound, 0);
}
}
void daObjCarry_c::se_put(cBgS_PolyInfo*) {
fopAcM_seStart(this, data().m_putSound, 0);
}
void daObjCarry_c::se_put_water() {
fopAcM_seStart(this, data().m_putWaterSound, 0);
}
void daObjCarry_c::se_fall_water() {
fopAcM_seStart(this, data().m_fallWaterSound, 0);
}
void daObjCarry_c::calc_rot_axis_base(u8 param_0) {
field_0xd4c = ZeroQuat;
if (fopAcM_checkCarryNow(this)) {
if (field_0xd7b < 0) {
mDoMtx_quatSlerp(&field_0xd3c, &ZeroQuat, &field_0xd3c, 0.25f * daPy_getLinkPlayerActorClass()->getBaseAnimeFrameRate());
} else {
field_0xd7b--;
}
return;
}
cXyz sp24 = current.pos - field_0xdec;
cXyz sp18(sp24.x, 0.0f, sp24.z);
bool temp_r29 = sp24.normalizeRS();
bool temp_r28 = sp18.normalizeRS();
bool var_r26 = 1;
if (temp_r29 == 0 && temp_r28 == 0) {
var_r26 = 0;
}
if (temp_r28) {
mRotAxis = sp18;
mDoMtx_stack_c::YrotS(0x4000);
mDoMtx_stack_c::multVec(&mRotAxis, &mRotAxis);
} else if (temp_r29) {
mRotAxis = cXyz::BaseX;
}
if (mCtrl == 0) {
if (mAcch.ChkGroundHit()) {
mRotation = data().field_0x7c * (std::fabs(speedF) + std::fabs(speed.y));
} else {
mRotation = data().m_urnRotateFactor * (std::fabs(speedF) + std::fabs(speed.y));
}
field_0xd4c.x = mRotAxis.x * cM_ssin(mRotation);
field_0xd4c.y = mRotAxis.y * cM_ssin(mRotation);
field_0xd4c.z = mRotAxis.z * cM_ssin(mRotation);
field_0xd4c.w = cM_scos(mRotation);
} else {
sp24 = current.pos - field_0xdec;
current.angle.y = cM_atan2s(sp24.x, sp24.z);
if (var_r26) {
mRotation = std::fabs(sp24.abs()) * data().m_urnRotateFactor;
field_0xd4c.x = mRotAxis.x * cM_ssin(mRotation);
field_0xd4c.y = mRotAxis.y * cM_ssin(mRotation);
field_0xd4c.z = mRotAxis.z * cM_ssin(mRotation);
field_0xd4c.w = cM_scos(mRotation);
}
}
field_0xd7b = param_0;
}
void daObjCarry_c::calc_rot_axis_tsubo() {
cXyz sp20;
int var_r30 = 0;
// NOTE: only case 0 ever reached since var_r30 is never modified
switch (var_r30) {
case 0:
calc_rot_axis_base(5);
break;
case 1:
if (mMode == MODE_DROP || mMode == MODE_SINK || mMode == MODE_YOGAN) {
calc_rot_axis_base(0);
} else {
mRotAxis = cXyz::Zero;
mRotation = 0;
}
break;
case 2:
sp20 = current.pos - old.pos;
if (!sp20.isZero()) {
mRotAxis = cXyz::BaseX;
mDoMtx_stack_c::YrotS(current.angle.y);
mDoMtx_stack_c::multVec(&mRotAxis, &mRotAxis);
}
mRotation += (s16)(((0.5f * field_0xd70) + data().m_urnRotateFactor) * (std::fabs(speedF) + std::fabs(speed.y)));
break;
case 3:
sp20 = current.pos - old.pos;
if (!sp20.isZero()) {
if (!mCyl.ChkCoHit()) {
mRotAxis = sp20;
mDoMtx_stack_c::YrotS(0x4000);
mDoMtx_stack_c::multVec(&mRotAxis, &mRotAxis);
}
}
mRotation += (s16)(((0.5f * field_0xd70) + data().m_urnRotateFactor) * (std::fabs(speedF) + std::fabs(speed.y)));
break;
}
}
void daObjCarry_c::calc_rot_axis_ootubo() {
calc_rot_axis_base(10);
}
void daObjCarry_c::calc_rot_axis_kibako() {
if (fopAcM_checkCarryNow(this)) {
mRotAxis = cXyz::Zero;
mRotation = 0;
} else {
mRotAxis = cXyz::BaseX;
mDoMtx_stack_c::YrotS(current.angle.y);
mDoMtx_stack_c::multVec(&mRotAxis, &mRotAxis);
cXyz sp8 = current.pos - old.pos;
if (mMode == MODE_DROP) {
mRotation += (s16)(speedF * ((field_0xd70 * 0.5f) + data().m_urnRotateFactor));
} else {
mRotation = 0;
}
}
}
void daObjCarry_c::calc_rot_axis_ironball() {
calc_rot_axis_base(10);
}
void daObjCarry_c::calc_rot_axis_taru() {
calc_rot_axis_kibako();
}
void daObjCarry_c::calc_rot_axis_dokuro() {
calc_rot_axis_base(5);
}
void daObjCarry_c::calc_rot_axis_bokkuri() {
if (mMode == MODE_DROP || mMode == MODE_DB_DROP) {
if (fopAcM_checkCarryNow(this)) {
if (cLib_chaseS(&mRotation, 0, 0x2000)) {
mRotAxis = cXyz::Zero;
}
} else {
cXyz sp8 = current.pos - old.pos;
if (!sp8.isZero()) {
mRotAxis = cXyz::BaseX;
mDoMtx_stack_c::YrotS(current.angle.y);
mDoMtx_stack_c::multVec(&mRotAxis, &mRotAxis);
}
mRotation += (s16)(((0.5f * field_0xd70) + data().m_urnRotateFactor) * (std::fabs(speedF) + std::fabs(speed.y)));
}
} else if (mMode == MODE_WALK || mMode == MODE_WAIT) {
mRotAxis = cXyz::Zero;
mRotation = 0;
} else {
mRotAxis = cXyz::Zero;
mRotation = 0;
field_0xd60 = 0.0f;
field_0xd5c = 0.0f;
field_0xd68 = 0;
field_0xd66 = 0;
field_0xd64 = 0;
}
}
void daObjCarry_c::calc_rot_axis_kotubo2() {
calc_rot_axis_base(5);
}
void daObjCarry_c::calc_rot_axis_LightBall() {
calc_rot_axis_base(10);
}
void daObjCarry_c::calc_rot_axis_Lv8Ball() {
calc_rot_axis_base(10);
}
void daObjCarry_c::set_wind_power() {
if (!fopAcM_checkCarryNow(this)) {
if (mTgCyl.ChkTgHit()) {
dCcD_GObjInf* tg_hit_gobj = mTgCyl.GetTgHitGObj();
if (tg_hit_gobj != NULL && tg_hit_gobj->ChkAtType(AT_TYPE_LANTERN_SWING) && tg_hit_gobj->GetAtMtrl() == dCcD_MTRL_WIND) {
cXyz* at_vec_p = tg_hit_gobj->GetAtVecP();
s16 var_r26 = cM_atan2s(at_vec_p->x, at_vec_p->z);
f32 var_f31 = at_vec_p->absXZ() * data().m_urnWindEffRatio;
f32 temp_f30 = std::fabs(at_vec_p->y) * data().m_urnWindEffRatio;
fopAc_ac_c* temp_r28 = mTgCyl.GetTgHitAc();
if (var_f31 < 1.0f && temp_r28 != NULL) {
var_r26 = cM_atan2s(current.pos.x - temp_r28->current.pos.x, current.pos.z - temp_r28->current.pos.z);
var_f31 += 2.0f;
}
cXyz sp14(speedF * cM_ssin(current.angle.y), speed.y, speedF * cM_scos(current.angle.y));
cXyz sp8(var_f31 * cM_ssin(var_r26), temp_f30, var_f31 * cM_scos(var_r26));
sp14 += sp8;
speedF = std::sqrt((sp14.x * sp14.x) + (sp14.z * sp14.z));
current.angle.y = cM_atan2s(sp14.x, sp14.z);
speed.y += temp_f30;
if (current.pos.y > old.pos.y) {
field_0xcec = current.pos.y;
}
}
}
mTgCyl.SetC(current.pos);
dComIfG_Ccsp()->Set(&mTgCyl);
}
}
void daObjCarry_c::exec_proc_tsubo() {
set_wind_power();
}
void daObjCarry_c::exec_proc_ootubo() {
set_wind_power();
}
void daObjCarry_c::exec_proc_kibako() {}
void daObjCarry_c::exec_proc_ironball() {
if (mAcch.GetGroundH() != -G_CM3D_F_INF) {
savePos(getSaveID(), current.pos);
setRoomNo(getSaveID(), fopAcM_GetRoomNo(this));
}
}
void daObjCarry_c::exec_proc_taru() {}
void daObjCarry_c::exec_proc_dokuro() {}
void daObjCarry_c::exec_proc_bokkuri() {
switch (field_0xd79) {
case 0:
if (mAcch.ChkGroundLanding()) {
field_0xd79 = 1;
field_0xd77 = 15;
}
break;
case 1:
if (field_0xd77 != 0) {
field_0xd77--;
}
if (field_0xd77 == 0) {
mSound.startSound(Z2SE_EN_DB_SHRINK, 0, -1);
field_0xd79 = 2;
}
break;
case 2:
cLib_chaseUC(&field_0xd76, 0, 0xFF / 24);
if (field_0xd76 == 0) {
field_0xd75 = 0;
field_0xd79 = 3;
}
break;
case 3:
break;
}
mSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
if (field_0xd7a != 0) {
if (field_0xd7a < 100) {
field_0xd7a++;
}
field_0xd84 = (field_0xd7a - 16) / 5.0f;
if (field_0xd84 > 1.0f) {
field_0xd84 = 1.0f;
} else if (field_0xd84 < 0.0f) {
field_0xd84 = 0.0f;
}
} else {
field_0xd84 = 0.0f;
}
if (mMode == MODE_CARRY) {
if (field_0xd7a > 16) {
cLib_addCalc0(&field_0xd5c, 0.2f, 500.0f);
cLib_addCalc0(&field_0xd60, 0.2f, 500.0f);
cLib_addCalcAngleS2(&field_0xd6a, 0, 5, 4000);
}
field_0xd68 = 0;
} else if (speedF < 10.0f) {
cLib_addCalc0(&field_0xd5c, 0.04f, 200.0f);
cLib_addCalc0(&field_0xd60, 0.04f, 200.0f);
cLib_addCalcAngleS(&field_0xd68, 0, 30, 100, 10);
} else if (mMode == MODE_WALK) {
cLib_chaseS(&field_0xd68, 300.0f * speedF, 100);
}
field_0xd64 = field_0xd5c * cM_ssin(field_0xd04 * 2000);
field_0xd66 = field_0xd60 * cM_ssin(field_0xd04 * 2000);
field_0xd6a += field_0xd68;
if (mMode != MODE_GROWTH) {
f32 scale_target = data().scale;
cLib_addCalc(&scale.x, scale_target, 0.1f, 0.2f, 0.1f);
cLib_addCalc(&scale.y, scale_target, 0.1f, 0.2f, 0.1f);
cLib_addCalc(&scale.z, scale_target, 0.1f, 0.2f, 0.1f);
}
}
void daObjCarry_c::exec_proc_LightBall() {
mDalkmistInf.mPos = current.pos;
mLightAtSph.SetC(current.pos);
dComIfG_Ccsp()->Set(&mLightAtSph);
if (mCyl.ChkTgHit() && mCyl.GetTgHitObj()) {
mSound.startCollisionSE(mCyl.GetTgHitObjHitSeID(1), 2, NULL);
}
mSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
}
void daObjCarry_c::exec_proc_Lv8Ball() {
if (mCyl.ChkTgHit() && mCyl.GetTgHitObj()) {
mSound.startCollisionSE(mCyl.GetTgHitObjHitSeID(1), 2, NULL);
}
mSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
}
void daObjCarry_c::bg_damage_proc_call() {
typedef bool (daObjCarry_c::*type_func)();
static type_func l_type_func[] = {
&daObjCarry_c::bg_damage_proc_kotubo, &daObjCarry_c::bg_damage_proc_ootubo,
&daObjCarry_c::bg_damage_proc_kibako, &daObjCarry_c::bg_damage_proc_ironball,
&daObjCarry_c::bg_damage_proc_taru, &daObjCarry_c::bg_damage_proc_dokuro,
&daObjCarry_c::bg_damage_proc_bokkuri, &daObjCarry_c::bg_damage_proc_kotubo,
&daObjCarry_c::bg_damage_proc_LightBall, &daObjCarry_c::bg_damage_proc_LightBall,
&daObjCarry_c::bg_damage_proc_ootubo, &daObjCarry_c::bg_damage_proc_Lv8Ball,
&daObjCarry_c::bg_damage_proc_kotubo, &daObjCarry_c::bg_damage_proc_ootubo,
};
if (field_0xdae == 0) {
field_0xdae |= (this->*l_type_func[mType])();
}
}
void daObjCarry_c::cc_damage_proc_call() {
typedef bool (daObjCarry_c::*type_func)();
static type_func l_type_func[] = {
&daObjCarry_c::cc_damage_proc_kotubo, &daObjCarry_c::cc_damage_proc_ootubo,
&daObjCarry_c::cc_damage_proc_kibako, &daObjCarry_c::cc_damage_proc_ironball,
&daObjCarry_c::cc_damage_proc_taru, &daObjCarry_c::cc_damage_proc_dokuro,
&daObjCarry_c::cc_damage_proc_bokkuri, &daObjCarry_c::cc_damage_proc_kotubo,
&daObjCarry_c::cc_damage_proc_LightBall, &daObjCarry_c::cc_damage_proc_LightBall,
&daObjCarry_c::cc_damage_proc_ootubo, &daObjCarry_c::cc_damage_proc_Lv8Ball,
&daObjCarry_c::cc_damage_proc_kotubo, &daObjCarry_c::cc_damage_proc_ootubo,
};
if (field_0xdae == 0) {
field_0xdae |= (this->*l_type_func[mType])();
}
}
void daObjCarry_c::eff_break_call() {
typedef void (daObjCarry_c::*type_func)();
static type_func l_type_func[] = {
&daObjCarry_c::eff_break_tsubo, &daObjCarry_c::eff_break_ootubo,
&daObjCarry_c::eff_break_kibako, &daObjCarry_c::eff_break_ironball,
&daObjCarry_c::eff_break_taru, &daObjCarry_c::eff_break_dokuro,
&daObjCarry_c::eff_break_bokkuri, &daObjCarry_c::eff_break_kotubo2,
&daObjCarry_c::eff_break_LightBall, &daObjCarry_c::eff_break_LightBall,
&daObjCarry_c::eff_break_ootubo2, &daObjCarry_c::eff_break_Lv8Ball,
&daObjCarry_c::eff_break_tsuboL8, &daObjCarry_c::eff_break_ootuboL8,
};
(this->*l_type_func[mType])();
}
void daObjCarry_c::calc_rot_call() {
typedef void (daObjCarry_c::*type_func)();
static type_func l_type_func[] = {
&daObjCarry_c::calc_rot_axis_tsubo, &daObjCarry_c::calc_rot_axis_ootubo,
&daObjCarry_c::calc_rot_axis_kibako, &daObjCarry_c::calc_rot_axis_ironball,
&daObjCarry_c::calc_rot_axis_taru, &daObjCarry_c::calc_rot_axis_dokuro,
&daObjCarry_c::calc_rot_axis_bokkuri, &daObjCarry_c::calc_rot_axis_kotubo2,
&daObjCarry_c::calc_rot_axis_LightBall, &daObjCarry_c::calc_rot_axis_LightBall,
&daObjCarry_c::calc_rot_axis_ootubo, &daObjCarry_c::calc_rot_axis_Lv8Ball,
&daObjCarry_c::calc_rot_axis_tsubo, &daObjCarry_c::calc_rot_axis_ootubo,
};
(this->*l_type_func[mType])();
}
void daObjCarry_c::obj_execute_proc_call() {
typedef void (daObjCarry_c::*type_func)();
static type_func l_type_func[] = {
&daObjCarry_c::exec_proc_tsubo, &daObjCarry_c::exec_proc_ootubo,
&daObjCarry_c::exec_proc_kibako, &daObjCarry_c::exec_proc_ironball,
&daObjCarry_c::exec_proc_taru, &daObjCarry_c::exec_proc_dokuro,
&daObjCarry_c::exec_proc_bokkuri, &daObjCarry_c::exec_proc_tsubo,
&daObjCarry_c::exec_proc_LightBall, &daObjCarry_c::exec_proc_LightBall,
&daObjCarry_c::exec_proc_ootubo, &daObjCarry_c::exec_proc_Lv8Ball,
&daObjCarry_c::exec_proc_tsubo, &daObjCarry_c::exec_proc_ootubo,
};
(this->*l_type_func[mType])();
}
void daObjCarry_c::setTgHitCallBack() {
typedef void (*TgCallBack)(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*);
static TgCallBack l_callback[] = {
TgHitCallBackBase, TgHitCallBackBase, TgHitCallBackBase,
TgHitCallBackBase, TgHitCallBackBase, TgHitCallBackBase,
TgHitCallBackBokkuri, TgHitCallBackBase, TgHitCallBackBase,
TgHitCallBackBase, TgHitCallBackBase, TgHitCallBackBase,
TgHitCallBackBase, TgHitCallBackBase,
};
mCyl.SetTgHitCallback(l_callback[mType]);
}
void daObjCarry_c::setCoHitCallBack() {
typedef void (*CoCallBack)(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*);
static CoCallBack l_callback[] = {
CoHitCallBackBase, CoHitCallBackBase, CoHitCallBackBase,
CoHitCallBackBase, CoHitCallBackBase, CoHitCallBackBase,
CoHitCallBackBokkuri, CoHitCallBackBase, CoHitCallBackBase,
CoHitCallBackBase, CoHitCallBackBase, CoHitCallBackBase,
CoHitCallBackBase, CoHitCallBackBase,
};
mCyl.SetCoHitCallback(l_callback[mType]);
}
int daObjCarry_c::CreateInitCall() {
typedef int (daObjCarry_c::*CreateInitFunc)();
static CreateInitFunc l_func[] = {
&daObjCarry_c::CreateInit_tsubo, &daObjCarry_c::CreateInit_ootubo,
&daObjCarry_c::CreateInit_kibako, &daObjCarry_c::CreateInit_ironball,
&daObjCarry_c::CreateInit_taru, &daObjCarry_c::CreateInit_dokuro,
&daObjCarry_c::CreateInit_bokkuri, &daObjCarry_c::CreateInit_tsubo,
&daObjCarry_c::CreateInit_LightBall, &daObjCarry_c::CreateInit_LightBall,
&daObjCarry_c::CreateInit_ootubo, &daObjCarry_c::CreateInit_Lv8Ball,
&daObjCarry_c::CreateInit_tsubo, &daObjCarry_c::CreateInit_ootubo,
};
return (this->*l_func[mType])();
}
static int daObjCarry_Draw(daObjCarry_c* i_this) {
return i_this->draw();
}
static int daObjCarry_Execute(daObjCarry_c* i_this) {
return i_this->execute();
}
static int daObjCarry_Delete(daObjCarry_c* i_this) {
return i_this->_delete();
}
static int daObjCarry_Create(fopAc_ac_c* i_this) {
return ((daObjCarry_c*)i_this)->create();
}
static actor_method_class l_daObjCarry_Method = {
(process_method_func)daObjCarry_Create, (process_method_func)daObjCarry_Delete,
(process_method_func)daObjCarry_Execute, (process_method_func)NULL,
(process_method_func)daObjCarry_Draw};
actor_process_profile_definition g_profile_Obj_Carry = {
fpcLy_CURRENT_e, // mLayerID
8, // mListID
fpcPi_CURRENT_e, // mListPrio
PROC_Obj_Carry, // mProcName
&g_fpcLf_Method.base, // sub_method
sizeof(daObjCarry_c), // mSize
0, // mSizeOther
0, // mParameters
&g_fopAc_Method.base, // sub_method
244, // mPriority
&l_daObjCarry_Method, // sub_method
0x40500, // mStatus
fopAc_ACTOR_e, // mActorType
fopAc_CULLBOX_CUSTOM_e, // cullType
};