diff options
Diffstat (limited to 'src/d/actor/d_a_obj_bemos.cpp')
| -rw-r--r-- | src/d/actor/d_a_obj_bemos.cpp | 255 |
1 files changed, 224 insertions, 31 deletions
diff --git a/src/d/actor/d_a_obj_bemos.cpp b/src/d/actor/d_a_obj_bemos.cpp index 079a6ff52c..f9149ea267 100644 --- a/src/d/actor/d_a_obj_bemos.cpp +++ b/src/d/actor/d_a_obj_bemos.cpp @@ -9,6 +9,8 @@ #include "d/d_cc_d.h" #include "dol2asm.h" #include "d/d_camera.h" +#include "d/d_com_inf_game.h" +#include "SSystem/SComponent/c_lib.h" // // Forward References: @@ -253,28 +255,104 @@ extern "C" void __register_global_object(); /* 80BAE36C-80BAE4A8 0000EC 013C+00 1/1 0/0 0/0 .text * PPCallBack__9daObjBm_cFP10fopAc_ac_cP10fopAc_ac_csQ29dBgW_Base13PushPullLabel */ -void daObjBm_c::PPCallBack(fopAc_ac_c* param_0, fopAc_ac_c* param_1, s16 param_2, +// NONMATCHING +void daObjBm_c::PPCallBack(fopAc_ac_c* param_0, fopAc_ac_c* i_actorP, s16 param_2, dBgW_Base::PushPullLabel param_3) { - // NONMATCHING + int tmp = cLib_checkBit((int)param_2, 3); + u32 l_swNo3 = getSwNo3(); + u32 l_moveType = getMoveType(); + + if (tmp && !fopAcM_isSwitch(this,l_swNo3)) { + int tmp2 = cLib_checkBit(tmp,2); + s16 angle = param_2; + + if (tmp2) { + angle -= -0x8000; + } + + angle -= home.angle.y; + + JUT_PANIC(513,"0"); + + field_0x10c0 = param_2; + + if (angle >= -0x2000 && angle < 0x2000) { + tmp = 0; + } else { + if (angle >= 0x2000 && angle < 0x6000) { + tmp = 1; + } else { + if (angle < 0x6000 && angle < -0x6000) { + tmp = 2; + } else { + tmp = 3; + } + } + } + + if (l_moveType != 0 || tmp == 0) { + for (int i = 0; i < 4; i++) { + if (tmp == 1) { + field_0x10c4[i] = field_0x10c4[i]+1; + } else { + field_0x10c4[i] = 0; + } + } + + field_0x10d2 = 1; + } + } } /* 80BAE4A8-80BAE5FC 000228 0154+00 1/1 0/0 0/0 .text nodeCallBack__FP8J3DJointi */ -static void nodeCallBack(J3DJoint* param_0, int param_1) { - // NONMATCHING +// NONMATCHING +static int nodeCallBack(J3DJoint* param_0, int param_1) { + if (param_1 == 0) { + u16 jnt_no = param_0->getJntNo(); + J3DModel* model = j3dSys.getModel(); + daObjBm_c* beamos = (daObjBm_c*)model->getUserArea(); + cMtx_copy(model->getAnmMtx(jnt_no), mDoMtx_stack_c::get()); + + if (jnt_no == beamos->getHeadJoint()) { + mDoMtx_stack_c::XrotM(beamos->field_0xf96 + (beamos->field_0x1000 * cM_scos(beamos->field_0x1000 * beamos->field_0xff0))); + } else { + if (jnt_no == beamos->getBigGearJoint()) { + mDoMtx_stack_c::XrotM(beamos->field_0xf9a); + } else { + if (jnt_no == beamos->getSmallGear0Joint()) { + mDoMtx_stack_c::XrotM(beamos->field_0xf9e); + } else { + if (jnt_no == beamos->getSmallGear1Joint()) { + mDoMtx_stack_c::XrotM(beamos->field_0xfa2); + } else { + if (jnt_no == beamos->getSmallGear2Joint()) { + mDoMtx_stack_c::XrotM(beamos->field_0xfa6); + } + } + } + } + } + + cMtx_copy(mDoMtx_stack_c::get(),model->getAnmMtx(jnt_no)); + } } /* ############################################################################################## */ /* 80BB37B8-80BB37C4 000000 000C+00 13/13 0/0 0/0 .rodata l_eye_offset */ -SECTION_RODATA static u8 const l_eye_offset[12] = { - 0x00, 0x00, 0x00, 0x00, 0x43, 0xA5, 0x00, 0x00, 0x42, 0x96, 0x00, 0x00, +SECTION_RODATA static f32 const l_eye_offset[4] = { + 0.0f, + 330.0f, + 75.0f, }; COMPILER_STRIP_GATE(0x80BB37B8, &l_eye_offset); /* 80BB37C4-80BB37D0 00000C 000C+00 0/1 0/0 0/0 .rodata l_high_beam_offset */ #pragma push #pragma force_active on -SECTION_RODATA static u8 const l_high_beam_offset[12] = { - 0x00, 0x00, 0x00, 0x00, 0x43, 0x7F, 0x00, 0x00, 0x42, 0x82, 0x00, 0x00, +SECTION_RODATA static f32 const l_high_beam_offset[4] = { + 0.0f, + 255.0f, + 65.0f, }; COMPILER_STRIP_GATE(0x80BB37C4, &l_high_beam_offset); #pragma pop @@ -282,8 +360,10 @@ COMPILER_STRIP_GATE(0x80BB37C4, &l_high_beam_offset); /* 80BB37D0-80BB37DC 000018 000C+00 0/1 0/0 0/0 .rodata l_mid_beam_offset */ #pragma push #pragma force_active on -SECTION_RODATA static u8 const l_mid_beam_offset[12] = { - 0x00, 0x00, 0x00, 0x00, 0x43, 0x4D, 0x00, 0x00, 0x42, 0x82, 0x00, 0x00, +SECTION_RODATA static f32 const l_mid_beam_offset[3] = { + 0.0f, + 205.0f, + 65.0f, }; COMPILER_STRIP_GATE(0x80BB37D0, &l_mid_beam_offset); #pragma pop @@ -291,17 +371,28 @@ COMPILER_STRIP_GATE(0x80BB37D0, &l_mid_beam_offset); /* 80BB37DC-80BB37E8 000024 000C+00 0/1 0/0 0/0 .rodata l_low_beam_offset */ #pragma push #pragma force_active on -SECTION_RODATA static u8 const l_low_beam_offset[12] = { - 0x00, 0x00, 0x00, 0x00, 0x43, 0x20, 0x00, 0x00, 0x42, 0x82, 0x00, 0x00, +SECTION_RODATA static f32 const l_low_beam_offset[3] = { + 0.0f, + 160.0f, + 65.0f, }; COMPILER_STRIP_GATE(0x80BB37DC, &l_low_beam_offset); #pragma pop /* 80BB37E8-80BB3818 000030 0030+00 1/1 0/0 0/0 .rodata l_craw_offset */ -SECTION_RODATA static u8 const l_craw_offset[48] = { - 0xC2, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xBE, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xC2, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xBE, 0x00, 0x00, +SECTION_RODATA static f32 const l_craw_offset[12] = { + -95.0f, + 0.0f, + 0.0f, + 95.0f, + 0.0f, + 0.0f, + 0.0f, + 0.0f, + -95.0f, + 0.0f, + 0.0f, + 95.0f, }; COMPILER_STRIP_GATE(0x80BB37E8, &l_craw_offset); @@ -321,18 +412,40 @@ COMPILER_STRIP_GATE(0x80BB3824, &lit_3934); /* 80BAE5FC-80BAE68C 00037C 0090+00 1/1 0/0 0/0 .text initBaseMtx__9daObjBm_cFv */ void daObjBm_c::initBaseMtx() { - // NONMATCHING + field_0x10a0.set(0.5f, 0.5f, 1.0f); + mpModel->setBaseScale(scale); + mpModel3->setBaseScale(scale); + mpModel2->setBaseScale(field_0x10a0); + setBaseMtx(); } /* 80BAE68C-80BAE778 00040C 00EC+00 2/2 0/0 0/0 .text setBaseMtx__9daObjBm_cFv */ void daObjBm_c::setBaseMtx() { - // NONMATCHING + 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()); + mDoMtx_stack_c::scaleM(1.0f,1.0f,1.0f); + PSMTXCopy(mDoMtx_stack_c::get(),mBgMtx); + +#if DEBUG + field_0x10e8 = 0.0f; // change to l_HIO + field_0x10ec = 0.0f; // change to l_HIO +#endif + + mpModel2->setBaseScale(field_0x10a0); + mDoMtx_stack_c::transS(field_0xfb8); + mDoMtx_stack_c::ZXYrotM(field_0xfc4); + mpModel2->setBaseTRMtx(mDoMtx_stack_c::get()); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(home.angle); + mpModel3->setBaseTRMtx(mDoMtx_stack_c::get()); } /* ############################################################################################## */ /* 80BB3828-80BB3830 000070 0008+00 2/4 0/0 0/0 .rodata @4106 */ SECTION_RODATA static u8 const lit_4106[8] = { - 0x43, 0x30, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x43, 0x30, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, }; COMPILER_STRIP_GATE(0x80BB3828, &lit_4106); @@ -360,48 +473,58 @@ SECTION_DATA static void* l_eye_matName = (void*)(((char*)&d_a_obj_bemos__string /* 80BB3A9C-80BB3AA0 -00001 0004+00 0/1 0/0 0/0 .data l_head_joint */ #pragma push #pragma force_active on -SECTION_DATA static void* l_head_joint = (void*)(((char*)&d_a_obj_bemos__stringBase0) + 0xD); +SECTION_DATA static char* l_head_joint = "head"; #pragma pop /* 80BB3AA0-80BB3AA4 -00001 0004+00 0/1 0/0 0/0 .data l_bigGear_joint */ #pragma push #pragma force_active on -SECTION_DATA static void* l_bigGear_joint = (void*)(((char*)&d_a_obj_bemos__stringBase0) + 0x12); +SECTION_DATA static char* l_bigGear_joint = "cogRed"; #pragma pop /* 80BB3AA4-80BB3AA8 -00001 0004+00 0/1 0/0 0/0 .data l_smallGear0_joint */ #pragma push #pragma force_active on -SECTION_DATA static void* l_smallGear0_joint = (void*)(((char*)&d_a_obj_bemos__stringBase0) + 0x19); +SECTION_DATA static char* l_smallGear0_joint = "cogBlue"; #pragma pop /* 80BB3AA8-80BB3AAC -00001 0004+00 0/1 0/0 0/0 .data l_smallGear1_joint */ #pragma push #pragma force_active on -SECTION_DATA static void* l_smallGear1_joint = (void*)(((char*)&d_a_obj_bemos__stringBase0) + 0x21); +SECTION_DATA static char* l_smallGear1_joint = "cogGreen"; #pragma pop /* 80BB3AAC-80BB3AB0 -00001 0004+00 0/1 0/0 0/0 .data l_smallGear2_joint */ #pragma push #pragma force_active on -SECTION_DATA static void* l_smallGear2_joint = (void*)(((char*)&d_a_obj_bemos__stringBase0) + 0x2A); +SECTION_DATA static char* l_smallGear2_joint = "cogYellow"; #pragma pop /* 80BB3AB0-80BB3AC4 00003C 0014+00 0/2 0/0 0/0 .data l_joint_table */ #pragma push #pragma force_active on -SECTION_DATA static u8 l_joint_table[20] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +SECTION_DATA static char* l_joint_table[5] = { + l_head_joint, + l_bigGear_joint, + l_smallGear0_joint, + l_smallGear1_joint, + l_smallGear2_joint, }; #pragma pop /* 80BB3AC4-80BB3ADC 000050 0018+00 0/1 0/0 0/0 .data l_cull_box */ #pragma push #pragma force_active on -SECTION_DATA static u8 l_cull_box[24] = { - 0xC4, 0x96, 0x00, 0x00, 0xC2, 0xC8, 0x00, 0x00, 0xC4, 0x96, 0x00, 0x00, - 0x44, 0x96, 0x00, 0x00, 0x43, 0xC8, 0x00, 0x00, 0x44, 0x96, 0x00, 0x00, +SECTION_DATA static Vec l_cull_box[2] = { + {-1200.0f, + -100.0f, + -1200.0f + }, + { + 1200.0f, + 400.0f, + 1200.0f + }, }; #pragma pop @@ -457,7 +580,77 @@ static dCcD_SrcCyl l_cyl_src = { /* 80BAE778-80BAEADC 0004F8 0364+00 1/0 0/0 0/0 .text Create__9daObjBm_cFv */ int daObjBm_c::Create() { - // NONMATCHING + fopAcM_SetMtx(this,mpModel->getBaseTRMtx()); + mStts.Init(0xff, 0xff, this); + mSph.Set(l_sph_src); + mSph.SetStts(&mStts); + mCps.Set(l_cps_src); + mCps.SetStts(&mStts); + + for (int i = 0; i < 4; i++) { + mCyl[i].Set(l_cyl_src); + mCyl[i].SetStts(&mStts); + } + + fopAcM_setCullSizeBox(this,l_cull_box[0].x,l_cull_box[0].y,l_cull_box[0].z,l_cull_box[1].x, l_cull_box[1].y, l_cull_box[1].z); + JUTNameTab* joint_name = mpModel->getModelData()->getJointTree().getJointName(); + for (int i = 0; i < 5; i++) { + if ( mpModel->getModelData()->getJointNum() <= i) break; + if (!strcmp(joint_name->getName(i), l_joint_table[2])) { + mHeadJntNo = i; + mpModel->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack); + } + } + + mpModel->setUserArea((u32)this); + JUTNameTab* material_name = mpModel->getModelData()->getMaterialTable().getMaterialName(); + + u32 uVar12 = 0; + while( true ) { + if ( mpModel->getModelData()->getMaterialNum() <= uVar12) break; + if (strcmp(material_name->getName(uVar12),"bmEye") == 0) { + mpMaterial = mpModel->getModelData()->getMaterialNodePointer(uVar12); + } + uVar12 = uVar12 + 1; + } + +#if DEBUG + if (field_0xfcc == 0) { + OSReport_Error("ブ[モス]。苔のマテリアルがありません"); + return 0; + } +#endif + + // (**(code **)(*(int *)(this + 0x10a0) + 0x14))(this + 0x1080,this + 0x1068,1); + // (**(code **)(*(int *)(this + 0x10d0) + 0x14))(this + 0x10b0,this + 0x1074,1); + + field_0x1039 = 1; + + if (fopAcM_isSwitch(this,getSwNo2())) { + field_0xff7 = 0x0; + + if (getMoveType() != 1) { + mpBaseAnm2->setFrame(mpBaseAnm2->getEndFrame()); + } + + initActionObjBemos(); + } else { + initActionEnBemos(); + if (getSwNo() != -1) { + if (fopAcM_isSwitch(this,getSwNo())) { + field_0xff7 = 0; + initActionSwWait(); + } + } + field_0xff7 = 1; + J3DAnmTevRegKey* model_data = (J3DAnmTevRegKey*)dComIfG_getObjectRes("Obj_bm", 0x14); + mpBrkAnm->init(mpModel->getModelData(),model_data,1,2,1.0f,0,-1); + mpBaseAnm->setFrame(mpBaseAnm->getEndFrame()); + initActionWarning(); + } + + initBaseMtx(); + return 1; } /* ############################################################################################## */ |
