mirror of https://github.com/zeldaret/tp.git
237 lines
7.5 KiB
C++
237 lines
7.5 KiB
C++
/**
|
|
* @file d_a_obj_smw_stone.cpp
|
|
* Object - Sacred Meadow Howling Stone
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h"
|
|
|
|
#include "d/actor/d_a_obj_smw_stone.h"
|
|
#include "d/actor/d_a_alink.h"
|
|
#include "d/d_bg_w.h"
|
|
#include "d/d_com_inf_game.h"
|
|
|
|
/* 80CDEF1C-80CDEF20 -00001 0004+00 3/3 0/0 0/0 .data l_arcName */
|
|
static char* l_arcName = "WStoneF";
|
|
|
|
/* 80CDE518-80CDE538 000078 0020+00 1/1 0/0 0/0 .text daSmWStone_c_createHeap__FP10fopAc_ac_c */
|
|
static int daSmWStone_c_createHeap(fopAc_ac_c* i_this) {
|
|
return static_cast<daSmWStone_c*>(i_this)->createHeap();
|
|
}
|
|
|
|
/* 80CDE538-80CDE588 000098 0050+00 2/2 0/0 0/0 .text __ct__12daSmWStone_cFv */
|
|
daSmWStone_c::daSmWStone_c() {
|
|
mpBgW = NULL;
|
|
mMode = 0;
|
|
}
|
|
|
|
/* 80CDE588-80CDE614 0000E8 008C+00 1/0 0/0 0/0 .text __dt__12daSmWStone_cFv */
|
|
daSmWStone_c::~daSmWStone_c() {
|
|
dComIfG_resDelete(this, l_arcName);
|
|
}
|
|
|
|
/* 80CDEEF4-80CDEF00 000000 000C+00 1/1 0/0 0/0 .rodata @3776 */
|
|
static u8 const lit_3776[12] = {
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
};
|
|
|
|
/* 80CDE614-80CDE7F8 000174 01E4+00 1/1 0/0 0/0 .text create__12daSmWStone_cFv */
|
|
cPhs__Step daSmWStone_c::create() {
|
|
fopAcM_SetupActor(this, daSmWStone_c);
|
|
cPhs__Step step = (cPhs__Step)dComIfG_resLoad(this, l_arcName);
|
|
|
|
if (step == cPhs_COMPLEATE_e) {
|
|
if (!fopAcM_entrySolidHeap(this, daSmWStone_c_createHeap, 0x1000)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
if (dComIfG_Bgsp().Regist(mpBgW, this)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
init();
|
|
setModelMtx();
|
|
fopAcM_SetMtx(this, mpModel->getBaseTRMtx());
|
|
|
|
dBgS_AcchCir acch_cir;
|
|
dBgS_ObjAcch acch;
|
|
acch_cir.SetWall(0.0f, 10.0f);
|
|
acch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1,
|
|
&acch_cir, fopAcM_GetSpeed_p(this), NULL, NULL);
|
|
acch.CrrPos(dComIfG_Bgsp());
|
|
mGroundH = acch.GetGroundH();
|
|
mPolyInfo = acch.m_gnd;
|
|
}
|
|
|
|
return step;
|
|
}
|
|
|
|
/* 80CDE8D8-80CDE92C 000438 0054+00 1/1 0/0 0/0 .text execute__12daSmWStone_cFv */
|
|
int daSmWStone_c::execute() {
|
|
switch (mMode) {
|
|
case 0:
|
|
exeModeHowl();
|
|
// fallthrough
|
|
case 1:
|
|
default:
|
|
setModelMtx();
|
|
break;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80CDE92C-80CDEA2C 00048C 0100+00 1/1 0/0 0/0 .text draw__12daSmWStone_cFv */
|
|
int daSmWStone_c::draw() {
|
|
g_env_light.settingTevStruct(8, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr);
|
|
dComIfGd_setListBG();
|
|
mDoExt_modelUpdateDL(mpModel);
|
|
dComIfGd_setList();
|
|
cXyz pos(current.pos.x, current.pos.y, current.pos.z);
|
|
mShadowKey = dComIfGd_setShadow(mShadowKey, 1, mpModel, &pos, 500.0f, 0.0f, pos.y,
|
|
mGroundH, mPolyInfo, &tevStr, 0, 1.0f,
|
|
dDlst_shadowControl_c::getSimpleTex());
|
|
return 1;
|
|
}
|
|
|
|
/* 80CDEA2C-80CDEAA4 00058C 0078+00 1/1 0/0 0/0 .text Delete__12daSmWStone_cFv */
|
|
int daSmWStone_c::Delete() {
|
|
attention_info.flags = 0;
|
|
if (mpBgW != NULL && mpBgW->ChkUsed()) {
|
|
dComIfG_Bgsp().Release(mpBgW);
|
|
}
|
|
this->~daSmWStone_c();
|
|
return 1;
|
|
}
|
|
|
|
/* 80CDEAA4-80CDEBA0 000604 00FC+00 1/1 0/0 0/0 .text exeModeHowl__12daSmWStone_cFv */
|
|
void daSmWStone_c::exeModeHowl() {
|
|
u8 swbit;
|
|
if (mDelete || (swbit = getSwBit0(), fopAcM_isSwitch(this, swbit))) {
|
|
attention_info.flags = 0;
|
|
mMode = 1;
|
|
} else {
|
|
if (!dComIfGp_event_runCheck()) {
|
|
daAlink_getAlinkActorClass()->startWindStoneSound(2, ¤t.pos);
|
|
}
|
|
attention_info.flags = 0;
|
|
if (chkWlfInRange()) {
|
|
attention_info.flags |= fopAc_AttnFlag_ETC_e;
|
|
attention_info.distances[fopAc_attn_ETC_e] = 0x41;
|
|
daAlink_c* link = daAlink_getAlinkActorClass();
|
|
if (link != NULL && link->checkWolfHowlSuccessAnime()) {
|
|
attention_info.flags = 0;
|
|
mMode = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80CDEBA0-80CDEC04 000700 0064+00 2/2 0/0 0/0 .text setModelMtx__12daSmWStone_cFv */
|
|
void daSmWStone_c::setModelMtx() {
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
}
|
|
|
|
/* 80CDEC04-80CDED30 000764 012C+00 1/1 0/0 0/0 .text createHeap__12daSmWStone_cFv */
|
|
int daSmWStone_c::createHeap() {
|
|
J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 4);
|
|
mpModel = mDoExt_J3DModel__create(model_data, 0x80000, 0x11000084);
|
|
if (mpModel == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
mpBgW = new dBgW();
|
|
if (mpBgW == NULL) {
|
|
return 0;
|
|
}
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
MTXCopy(mDoMtx_stack_c::get(), mBgMtx);
|
|
cBgD_t* dzb = (cBgD_t*)dComIfG_getObjectRes(l_arcName, 7);
|
|
if (mpBgW->Set(dzb, 1, &mBgMtx) == 1) {
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80CDED30-80CDED9C 000890 006C+00 1/1 0/0 0/0 .text init__12daSmWStone_cFv */
|
|
void daSmWStone_c::init() {
|
|
u8 swbit = getSwBit0();
|
|
if (fopAcM_isSwitch(this, swbit)) {
|
|
mMode = 1;
|
|
} else {
|
|
mMode = 0;
|
|
}
|
|
mDelete = false;
|
|
mShadowKey = 0;
|
|
}
|
|
|
|
/* 80CDED9C-80CDEE28 0008FC 008C+00 1/1 0/0 0/0 .text chkWlfInRange__12daSmWStone_cFv */
|
|
bool daSmWStone_c::chkWlfInRange() {
|
|
fopAc_ac_c* player = dComIfGp_getPlayer(0);
|
|
if (player == NULL) {
|
|
return false;
|
|
}
|
|
if (daPy_py_c::checkNowWolf()) {
|
|
cXyz pos = player->current.pos;
|
|
if (pos.abs2(current.pos) < 40000.0f) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/* 80CDEE28-80CDEE7C 000988 0054+00 1/0 0/0 0/0 .text daSmWStone_create__FP12daSmWStone_c
|
|
*/
|
|
static cPhs__Step daSmWStone_create(daSmWStone_c* i_this) {
|
|
fopAcM_SetupActor(i_this, daSmWStone_c);
|
|
return i_this->create();
|
|
}
|
|
|
|
/* 80CDEE7C-80CDEE9C 0009DC 0020+00 1/0 0/0 0/0 .text daSmWStone_Delete__FP12daSmWStone_c
|
|
*/
|
|
static int daSmWStone_Delete(daSmWStone_c* i_this) {
|
|
return i_this->Delete();
|
|
}
|
|
|
|
/* 80CDEE9C-80CDEEBC 0009FC 0020+00 1/0 0/0 0/0 .text daSmWStone_execute__FP12daSmWStone_c */
|
|
static int daSmWStone_execute(daSmWStone_c* i_this) {
|
|
return i_this->execute();
|
|
}
|
|
|
|
/* 80CDEEBC-80CDEEDC 000A1C 0020+00 1/0 0/0 0/0 .text daSmWStone_draw__FP12daSmWStone_c
|
|
*/
|
|
static int daSmWStone_draw(daSmWStone_c* i_this) {
|
|
return i_this->draw();
|
|
}
|
|
|
|
/* 80CDEF20-80CDEF40 -00001 0020+00 1/0 0/0 0/0 .data daSmWStone_METHODS */
|
|
static actor_method_class daSmWStone_METHODS = {
|
|
(process_method_func)daSmWStone_create,
|
|
(process_method_func)daSmWStone_Delete,
|
|
(process_method_func)daSmWStone_execute,
|
|
NULL,
|
|
(process_method_func)daSmWStone_draw,
|
|
};
|
|
|
|
/* 80CDEF40-80CDEF70 -00001 0030+00 0/0 0/0 1/0 .data g_profile_Obj_SmWStone */
|
|
extern actor_process_profile_definition g_profile_Obj_SmWStone = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
7, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_Obj_SmWStone, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daSmWStone_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
735, // mPriority
|
|
&daSmWStone_METHODS, // sub_method
|
|
0x00044100, // mStatus
|
|
fopAc_ENV_e, // mActorType
|
|
fopAc_CULLBOX_0_e, // cullType
|
|
};
|