/** * @file d_a_obj_pumpkin.cpp * */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_obj_pumpkin.h" #include "d/d_cc_d.h" #if DEBUG #include "SSystem/SComponent/c_counter.h" #include "JSystem/JHostIO/JORFile.h" #endif #include "d/actor/d_a_npc.h" #include "d/d_cc_uty.h" #include "d/actor/d_a_npc_jagar.h" /* ############################################################################################## */ /* 80CB8370-80CB83A4 000000 0034+00 5/5 0/0 0/0 .rodata m__21daObj_Pumpkin_Param_c */ const daObj_Pumpkin_HIOParam daObj_Pumpkin_Param_c::m = { 0.0f, -5.0f, 1.4f, 100.0f, 73.0f, 24.0f, 12.0f, 24.0f, 37.0f, 45.0f, 18.0f, 16, 0, 20, 20, }; #if DEBUG daObj_Pumpkin_HIO_c::daObj_Pumpkin_HIO_c() { m = daObj_Pumpkin_Param_c::m; } void daObj_Pumpkin_HIO_c::listenPropertyEvent(const JORPropertyEvent* event) { char msg_buffer[2004]; JORReflexible::listenPropertyEvent(event); JORFile file_handle; int len; switch (reinterpret_cast(event->id)) { case 0x40000002: if (file_handle.open(6, "すべてのファイル(*.*)\0*.*\0", NULL, NULL, NULL) != 0) { memset(msg_buffer, 0, 2000); len = 0; // interesting offset sprintf(msg_buffer + len, "%.3ff,\t// 注目オフセット\n", m.featured_offset); len = strlen(msg_buffer); // gravity sprintf(msg_buffer + len, "%.3ff,\t// 重力\n", m.gravity); len = strlen(msg_buffer); // scale sprintf(msg_buffer + len, "%.3ff,\t// スケ-ル\n", m.scale); len = strlen(msg_buffer); // real shadow size sprintf(msg_buffer + len, "%.3ff,\t// リアル影サイズ\n", m.real_shadow_size); len = strlen(msg_buffer); // weight sprintf(msg_buffer + len, "%.3ff,\t// 体重\n", m.weight); len = strlen(msg_buffer); // height sprintf(msg_buffer + len, "%.3ff,\t// 高さ\n", m.height); len = strlen(msg_buffer); // knee-length sprintf(msg_buffer + len, "%.3ff,\t// ひざ丈\n", m.knee_length); len = strlen(msg_buffer); // width sprintf(msg_buffer + len, "%.3ff,\t// 幅\n", m.width); len = strlen(msg_buffer); // Emission speed sprintf(msg_buffer + len, "%.3ff,\t// 発射速度\n", m.fire_rate); len = strlen(msg_buffer); // Launch Angle sprintf(msg_buffer + len, "%.3ff,\t// 発射角度\n", m.launch_angle); len = strlen(msg_buffer); // Floating offset sprintf(msg_buffer + len, "%.3ff,\t// 浮きオフセット\n", m.floating_offset); len = strlen(msg_buffer); // Hold on sprintf(msg_buffer + len, "%d, \t// ふんばり\n", m.hold_on); len = strlen(msg_buffer); // Pull sound delay sprintf(msg_buffer + len, "%d, \t// 引き抜き音遅延\n", m.pull_sound_delay); len = strlen(msg_buffer); // Growth time 1 sprintf(msg_buffer + len, "%d, \t// 成長時間1\n", m.growth_time_1); len = strlen(msg_buffer); // Growth time 2 sprintf(msg_buffer + len, "%d, \t// 成長時間2\n", m.growth_time_2); len = strlen(msg_buffer); // file_handle.writeData(msg_buffer, len); file_handle.close(); OS_REPORT("write append success!::%6d\n", len); } else { OS_REPORT("write append failure!\n"); } break; } } void daObj_Pumpkin_HIO_c::genMessage(JORMContext* ctext) { ctext->genSlider("注目オフセット ", &m.featured_offset, 0.0f, 1000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); ctext->genSlider("重力 ", &m.gravity, -100.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); ctext->genSlider("スケ-ル ", &m.scale, 0.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); ctext->genSlider("リアル影サイズ ", &m.real_shadow_size, 0.0f, 10000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); ctext->genSlider("体重 ", &m.weight, 0.0f, 255.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); ctext->genSlider("高さ ", &m.height, 0.0f, 1000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); ctext->genSlider("ひざ丈 ", &m.knee_length, 0.0f, 1000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); ctext->genSlider("幅 ", &m.width, 0.0f, 1000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); ctext->genSlider("発射速度 ", &m.fire_rate, 0.0f, 1000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); // fire angle: ctext->genSlider("発射角度 ", &m.launch_angle, 0.0f, 90.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); ctext->genSlider("浮きオフセット ", &m.floating_offset, -100.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); // stand strong: ctext->genSlider("ふんばり ", &m.hold_on, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); ctext->genSlider("引き抜き音遅延 ", &m.pull_sound_delay, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); ctext->genSlider("成長時間1 ", &m.growth_time_1, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); ctext->genSlider("成長時間2 ", &m.growth_time_2, 0, 1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); // export file: ctext->genButton("ファイル書き出し", 0x40000002, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18); } #endif /* 80CB83A4-80CB83D4 000034 0030+00 1/1 0/0 0/0 .rodata l_ccDObjData */ const dCcD_SrcGObjInf l_ccDObjData = { {0, // mFlags { {0, 0, 0}, // mObjAt {0xD8FBFDFF, 0x1F}, // mObjTg {0x79} // mObjCo } // mSrcObjHitInf }, // mObj {0, 0, 0, 0, 0}, // mGObjAt {10, 0, 0, 0, 0}, // mGObjTg {0} // mGObjCo }; /* 80CB848C-80CB8494 000020 0008+00 2/3 0/0 0/0 .data l_bmdData */ static int l_bmdData[1][2] = { {3, 1}, }; /* 80CB8494-80CB849C -00001 0008+00 2/4 0/0 0/0 .data l_resNameList */ static char* l_resNameList[2] = { "", "pumpkin", }; /* 80CB849C-80CB84E0 000030 0044+00 1/2 0/0 0/0 .data l_ccDCyl */ static dCcD_SrcCyl l_ccDCyl = { l_ccDObjData, // mObjInf { {0.0f, 0.0f, 0.0f}, // mCenter 0.0f, // mRadius 0.0f // mHeight } // mCyl }; /* 80CB85DC-80CB85E0 000014 0004+00 1/1 0/0 0/0 .bss l_HIO */ static OBJ_PUMPKIN_HIO_CLASS l_HIO; /* 80CB578C-80CB5A04 0000EC 0278+00 1/0 0/0 0/0 .text __dt__15daObj_Pumpkin_cFv */ daObj_Pumpkin_c::~daObj_Pumpkin_c() { // "|%06d:%x|daObj_Pumpkin_c -> Destruct\n": OS_REPORT("|%06d:%x|daObj_Pumpkin_c -> デストラクト\n", g_Counter.mCounter0, this); #if DEBUG if (mpHIO != NULL) { mpHIO->removeHIO(); } #endif dComIfG_resDelete(&mPhaseReq, l_resNameList[l_bmdData[0][1]]); } /* 80CB5A04-80CB5D74 000364 0370+00 1/1 0/0 0/0 .text create__15daObj_Pumpkin_cFv */ int daObj_Pumpkin_c::create() { fopAcM_SetupActor(this, daObj_Pumpkin_c); mType = getType(); cPhs__Step phase = (cPhs__Step) dComIfG_resLoad(&mPhaseReq, l_resNameList[l_bmdData[0][1]]); if (phase == cPhs_COMPLEATE_e) { OS_REPORT("\t(%s:%d) ItemTableNo:%d, ProcType:%d<%08x> -> roomNo.%d", fopAcM_getProcNameString(this), getType(), getItemTableNo(), getProcType(), fopAcM_GetParam(this), fopAcM_GetRoomNo(this)); if ((daNpcT_chkEvtBit(0x1E) || daNpcT_chkEvtBit(0x92)) && isDelete()) { OS_REPORT("===>isDelete:TRUE\n"); return cPhs_ERROR_e; } OS_REPORT("\n"); if (!fopAcM_entrySolidHeap(this, createHeapCallBack, 0xEB0)) { return cPhs_ERROR_e; } J3DModelData* model_data = mpModel->getModelData(); fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); fopAcM_setCullSizeBox(this, -50.0f, -50.0f, -50.0f, 50.0f, 50.0f, 50.0f); #if DEBUG mpHIO = &l_HIO; // pumpkin: mpHIO->entryHIO("かぼちゃ"); #endif reset(); mObjAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), fopAcM_GetAngle_p(this), fopAcM_GetShapeAngle_p(this)); mStts.Init(mpHIO->m.weight, 0, this); mCyl0.Set(l_ccDCyl); mCyl0.SetStts(&mStts); mCyl1.Set(l_ccDCyl); mCyl1.SetStts(&mStts); current.pos = home.pos; old.pos = current.pos; field_0xB60 = current.pos.y; setMtx(); } return phase; } /* 80CB5F88-80CB6018 0008E8 0090+00 1/1 0/0 0/0 .text CreateHeap__15daObj_Pumpkin_cFv */ int daObj_Pumpkin_c::CreateHeap() { J3DModelData* modelData = NULL; modelData = (J3DModelData*)dComIfG_getObjectRes(l_resNameList[l_bmdData[0][1]], l_bmdData[0][0]); if (modelData == NULL) { return 0; } mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); if (mpModel == NULL) { return 0; } return 1; } /* 80CB6018-80CB604C 000978 0034+00 1/1 0/0 0/0 .text Delete__15daObj_Pumpkin_cFv */ int daObj_Pumpkin_c::Delete() { OS_REPORT("|%06d:%x|daObj_Pumpkin_c -> Delete\n", g_Counter.mCounter0, this); this->~daObj_Pumpkin_c(); return 1; } /* 80CB604C-80CB7638 0009AC 15EC+00 1/1 0/0 0/0 .text Execute__15daObj_Pumpkin_cFv */ int daObj_Pumpkin_c::Execute() { f32 var_f29 = mpHIO->m.floating_offset; f32 f_scale = mpHIO->m.scale; s16 sp_0x14 = 0; s16 sp_0x12 = 0; mPumpkinScale = 1.0f; if (mType == 1) { mPumpkinScale = 1.8f; var_f29 *= mPumpkinScale; f_scale *= mPumpkinScale; } scale.set(f_scale, f_scale, f_scale); fopAcM_OffCarryType(this, fopAcM_CARRY(fopAcM_CARRY_CHICKEN | fopAcM_CARRY_SIDE | fopAcM_CARRY_TYPE_1)); attention_info.flags = 0; switch (mType) { case 0: attention_info.distances[fopAc_attn_CARRY_e] = 6; break; case 1: attention_info.distances[fopAc_attn_CARRY_e] = 8; break; case 2: attention_info.distances[fopAc_attn_CARRY_e] = 6; break; case 3: attention_info.distances[fopAc_attn_CARRY_e] = 8; break; default: attention_info.distances[fopAc_attn_CARRY_e] = 6; break; } mAcchCir.SetWallR(mpHIO->m.width * mPumpkinScale); mAcchCir.SetWallH(mpHIO->m.knee_length * mPumpkinScale); gravity = mpHIO->m.gravity * mPumpkinScale; int sp_0x30 = 0; if (fopAcM_checkCarryNow(this) || fopAcM_checkHawkCarryNow(this) || field_0xbb3) { sp_0x30 = 1; } if (field_0xBAE) { int item_table_no = getItemTableNo(); if (item_table_no >= 0 && mItemProcId == fpcM_ERROR_PROCESS_ID_e) { mItemProcId = fopAcM_createItemFromTable(¤t.pos, item_table_no, -1, fopAcM_GetRoomNo(this), NULL, 0, NULL, NULL, NULL, NULL); } if (mItemProcId == fpcM_ERROR_PROCESS_ID_e || fopAcM_IsExecuting(mItemProcId)) { if (mType == 0 && getProcType() != 2) { field_0xB48 = mpHIO->m.growth_time_1; field_0xB4C = mpHIO->m.growth_time_2; field_0xBAF = 0; field_0xBB0 = 0; current.pos = home.pos; old.pos = home.pos; current.angle = home.angle; shape_angle = home.angle; scale.setall(0.0f); } else { fopAcM_delete(this); } field_0xBAE = 0; } } else if (field_0xB4C) { if (field_0xBAF) { field_0xB68 = (mpHIO->m.growth_time_2 - field_0xB4C) / f32(mpHIO->m.growth_time_2) * 0.5f + (mpHIO->m.growth_time_1 - field_0xB48) / f32(mpHIO->m.growth_time_1) * 0.5f; if (cLib_calcTimer(&field_0xB4C) == 0) { field_0xBAF = 0; field_0xB68 = 1.0f; } } else { field_0xB68 = (mpHIO->m.growth_time_1 - field_0xB48) / f32(mpHIO->m.growth_time_1) * 0.5f; if (mCyl1.ChkTgHit() && mCyl1.GetTgHitGObj() != NULL && mCyl1.GetTgHitGObj()->GetAtType() == AT_TYPE_LANTERN_SWING && mCyl1.GetTgHitGObj()->GetAtMtrl() == dCcD_MTRL_UNK_6) { // field_0xBAF = 1; } } cLib_calcTimer(&field_0xB48); f_scale *= field_0xB68; scale.set(f_scale, f_scale, f_scale); } else { int sp_0x28 = 0; if (field_0xBAA == 0 && mCyl1.ChkTgHit()) { if (mCyl1.GetTgHitGObj() != NULL && mCyl1.GetTgHitGObj()->GetAtType() == AT_TYPE_BOOMERANG) { mBoomerangMove.initOffset(¤t.pos, mCyl1.GetTgHitGObj()); field_0xBAA = 1; sp_0x30 = 0; if (field_0xBA8) { dComIfGp_particle_set(-1, dPa_RM(ID_ZI_S_PUMPKIN_LEAF_A), ¤t.pos, &shape_angle, &scale); dComIfGp_particle_set(-1, dPa_RM(ID_ZI_S_PUMPKIN_LEAF_B), ¤t.pos, &shape_angle, &scale); field_0xBA8 = 0; } } else { sp_0x28 = 1; } } else if (field_0xBAD && cM3d_IsZero(speedF) == 0 && mCyl0.ChkCoHit()) { fopAc_ac_c* actor_p = dCc_GetAc(mCyl0.GetCoHitObj()->GetAc()); if (fopAcM_GetName(actor_p) != PROC_ALINK) { sp_0x28 = 1; } } if (sp_0x28) { crash(); sp_0x30 = 0; } else { if (field_0xBAA) { if (mBoomerangMove.posMove(¤t.pos, &shape_angle.y, this, 0x1C00) == 0) { sp_0x30 = fopAcM_checkCarryNow(this) != 0; field_0xBAA = 0; } else if (mObjAcch.ChkWallHit()) { sp_0x30 = 0; crash(); } } if (sp_0x30) { if (getProcType() == 0) { if (fopAcM_checkCarryNow(this) && field_0xBAA == 0) { if (field_0xB44 < mpHIO->m.hold_on + mpHIO->m.pull_sound_delay) { ++field_0xB44; if (mpHIO->m.hold_on + mpHIO->m.pull_sound_delay <= field_0xB44) { fopAcM_seStart(this, Z2SE_OBJ_PUMPKIN_PULLOUT, 0); } if (field_0xBA8 && mpHIO->m.hold_on <= field_0xB44) { dComIfGp_particle_set(-1, dPa_RM(ID_ZI_S_PUMPKIN_LEAF_A), ¤t.pos, &shape_angle, &scale); dComIfGp_particle_set(-1, dPa_RM(ID_ZI_S_PUMPKIN_LEAF_B), ¤t.pos, &shape_angle, &scale); field_0xBA8 = 0; } } } else if (field_0xBA8) { fopAcM_seStart(this, Z2SE_OBJ_PUMPKIN_PULLOUT, 0); dComIfGp_particle_set(-1, dPa_RM(ID_ZI_S_PUMPKIN_LEAF_A), ¤t.pos, &shape_angle, &scale); dComIfGp_particle_set(-1, dPa_RM(ID_ZI_S_PUMPKIN_LEAF_B), ¤t.pos, &shape_angle, &scale); field_0xB44 = mpHIO->m.hold_on + mpHIO->m.pull_sound_delay; field_0xBA8 = 0; } } mObjAcch.ClrWallHit(); mObjAcch.ClrGroundHit(); mObjAcch.SetWallNone(); mObjAcch.SetGrndNone(); field_0xB60 = 0.0f; mStts.SetWeight(0); speed.setall(0.0f); speedF = 0.0f; field_0xB20.setall(0.0f); field_0xB38.setall(0); gravity = 0.0f; field_0xBAB = 0; field_0xBAC = 0; field_0xBAD = 0; field_0xBB2 = 0; } else { mStts.SetWeight(mpHIO->m.weight); if (field_0xBA8 || mType == 1) { mStts.SetWeight(0xFF); } mObjAcch.ClrWallNone(); mObjAcch.ClrGrndNone(); if (field_0xBB1 && cM3d_IsZero(speedF) == 0) { popup(mpHIO->m.fire_rate, mpHIO->m.launch_angle, NULL); if (fopAcM_carryOffRevise(this)) { speed.setall(0.0f); } } else { int sp_0x20 = 0; cXyz sp_0x4C; s16 sp_0x10 = 0x80; fopAcM_getWaterY(¤t.pos, &mWaterY); if (-G_CM3D_F_INF != mWaterY && var_f29 < mWaterY - field_0xB60) { if (current.pos.y <= mWaterY) { if (field_0xBAC == 0) { speedF *= 0.3f; speed.y *= 0.5f; field_0xBAB = 0; field_0xBAC = 1; if (field_0xBAD || field_0xBB2 || field_0xBB1) { fopAcM_seStart(this, Z2SE_CM_BODYFALL_WATER_S, 0); setWaterPrtcl(); sp_0x20 = 1; if ((field_0xBAD || field_0xBB2) && speed.y < 0.0f) { field_0xB70 = 3000.0f; } } field_0xBAD = 0; field_0xBB2 = 0; } int streamPower; if (fopAcM_getWaterStream(¤t.pos, mGndChk, &sp_0x4C, &streamPower, 0)) { sp_0x4C.normalizeZP(); cLib_addCalcAngleS2(¤t.angle.y, cM_atan2s(sp_0x4C.x, sp_0x4C.z), 4, 0x200); if (sp_0x20) { current.angle.y = cM_atan2s(sp_0x4C.x, sp_0x4C.z); } sp_0x10 *= streamPower; cLib_chaseAngleS(&field_0xB38.y, (field_0xB38.y < 0) ? -sp_0x10 : sp_0x10, 0x10); if (field_0xBAB) { cLib_addCalc2(&speedF, streamPower * 1.55f, 0.15f, 1.0f); } else { cLib_addCalc2(&speedF, streamPower * 0.75f, 0.15f, 1.0f); } } else { cLib_chaseF(&speedF, 0.0f, 0.3f); } if (field_0xB54 == 0 && mObjAcch.ChkWallHit()) { if (getWallAngle(current.angle.y, &sp_0x12)) { current.angle.y = sp_0x12; current.angle.y += s16(cM_rndFX(2000.0f)); } else { current.angle.y += s16(cM_rndFX(2000.0f)); current.angle.y -= 0x8000; } field_0xB38.y = -field_0xB38.y / 2; field_0xB54 = 10; } if (field_0xBAB) { cLib_addCalc2(¤t.pos.y, mWaterY - var_f29, 0.5f, 2.0f); speed.y = 0.0f; setHamonPrtcl(); } else if (current.pos.y + var_f29 < mWaterY) { if (speed.y < 0.0f) { cLib_addCalc(&speed.y, 2.0f, 0.8f, 11.0f, 0.1f); } else { cLib_addCalc(&speed.y, 2.0f, 0.5f, 0.5f, 0.1f); } field_0xB38.y = 0x100; mObjAcch.ClrGroundHit(); field_0xBAB = 1; } gravity = 0.0f; } } } if (field_0xBAB) { if (mObjAcch.ChkGroundHit()) { field_0xBAB = 0; field_0xBAC = 0; field_0xB38.setall(0); speedF = 0.0f; speed.setall(0.0f); } } else if (field_0xBAC == 0) { if (field_0xBAD) { if (0.0f <= field_0xB20.y && speed.y < 0.0f) { field_0xB74 = -500.0f; } if (mObjAcch.ChkWallHit()) { crash(); } else if (mObjAcch.ChkGroundHit()) { if (-250.0f < field_0xB74) { if (cM3d_IsZero(field_0xB74) == 0) { setSmokePrtcl(); } field_0xBAD = 0; speedF = 0.0f; speed.setall(0.0f); } else { crash(); } } } else if (field_0xBB2) { if (mObjAcch.ChkGroundHit()) { if (-250.0f < field_0xB74) { if (cM3d_IsZero(field_0xB74) == 0) { setSmokePrtcl(); } field_0xBB2 = 0; speedF = 0.0f; speed.setall(0.0f); } else { crash(); } } } else if (field_0xBB1) { fopAcM_seStart(this, Z2SE_OBJ_PUMPKIN_PUT, 0); } else if (mObjAcch.ChkGroundHit() == 0) { field_0xB74 = field_0xB60 - current.pos.y; field_0xBB2 = 1; } } if (field_0xBB0 == 0 && field_0xBAD == 0 && field_0xBB2 == 0) { if (mType == 1 || field_0xBA8) { fopAcM_OnCarryType(this, fopAcM_CARRY_TYPE_1); } else { fopAcM_OnCarryType(this, fopAcM_CARRY_SIDE); } cLib_onBit(attention_info.flags, fopAc_AttnFlag_CARRY_e); fopAcM_OnCarryType(this, fopAcM_CARRY_CHICKEN); } field_0xB20 = speed; if (field_0xBAC) { cLib_addCalc2(&field_0xB70, mStts.GetCCMoveP() != NULL ? 1200.0f : 900.0f, 0.05f, 100.0f); } else { cLib_addCalc2(&field_0xB70, 0.0f, 0.25f, 100.0f); } shape_angle.x = field_0xB70 * cM_ssin(field_0xB78 * 1000); shape_angle.z = field_0xB70 * cM_scos(field_0xB78 * 1000); cLib_chaseAngleS(&field_0xB38.y, 0, 10); shape_angle.y += field_0xB38.y; ++field_0xB78; if (field_0xBAB) { f32 sqrt = JMAFastSqrt(mStts.GetCCMoveP()->x * mStts.GetCCMoveP()->x + mStts.GetCCMoveP()->z * mStts.GetCCMoveP()->z); if (1.0f < sqrt) { field_0xB80 = cM_atan2s(mStts.GetCCMoveP()->x, mStts.GetCCMoveP()->z); if (field_0xB58 == 0) { if (30.0f < sqrt) { sqrt = 30.0f; } else if (sqrt < 0.0f) { sqrt = 0.0f; } field_0xB5C = sqrt; field_0xB38.y = 0x200; field_0xB58 = 10; } } } else { field_0xB5C = 0.0f; } cLib_addCalc2(&field_0xB5C, 0.0f, 0.33f, 100.0f); fopAcM_calcSpeed(this); if (field_0xBAB) { field_0xB2C.x = field_0xB5C * cM_ssin(field_0xB80); field_0xB2C.z = field_0xB5C * cM_scos(field_0xB80); field_0xB2C.y = 0.0f; speed += field_0xB2C; } fopAcM_posMove(this, mStts.GetCCMoveP()); mObjAcch.CrrPos(dComIfG_Bgsp()); mGndChk = mObjAcch.m_gnd; field_0xB60 = mObjAcch.GetGroundH(); if (field_0xBAA) { mBoomerangMove.bgCheckAfterOffset(¤t.pos); } if (-G_CM3D_F_INF != field_0xB60) { field_0xB7A = daNpcF_getGroundAngle(&mGndChk, shape_angle.y); setEnvTevColor(); setRoomNo(); } } } } attention_info.position = current.pos; eyePos = current.pos; if (field_0xbb3 == 0) { setMtx(); } field_0xB7C = calcRollAngle(field_0xB7C, 0x10000); if (field_0xBB0 == 0 && field_0xB50 == 0) { cXyz sp_0x40 = current.pos; sp_0x40.y += 6.0f; if (field_0xBAD && cM3d_IsZero(speedF) == 0) { mCyl0.SetAtType(8); mCyl0.SetAtAtp(1); mCyl0.SetAtSPrm(0x1F); } else { mCyl0.SetAtType(0); mCyl0.SetAtSPrm(0); } if (field_0xB4C == 0) { mCyl0.SetR(mpHIO->m.width * mPumpkinScale); mCyl0.SetH(mpHIO->m.height * mPumpkinScale); mCyl0.SetC(current.pos); dComIfG_Ccsp()->Set(&mCyl0); } mCyl1.SetCoSPrm(0); if (field_0xB4C) { mCyl1.SetTgType(0x200); mCyl1.SetTgSPrm(0x1F); } else { mCyl1.SetTgType(0xD8FBFDFF); mCyl1.SetTgSPrm(0x1F); } mCyl1.SetR(mpHIO->m.width * mPumpkinScale); mCyl1.SetH(mpHIO->m.height * mPumpkinScale); mCyl1.SetC(sp_0x40); dComIfG_Ccsp()->Set(&mCyl1); } mCyl1.ClrTgHit(); mCyl0.ClrAtHit(); mCyl0.ClrCoHit(); field_0xBB1 = sp_0x30 != 0; cLib_calcTimer(&field_0xB50); cLib_calcTimer(&field_0xB54); cLib_calcTimer(&field_0xB58); field_0xbb3 = 0; return 1; } /* 80CB7638-80CB77DC 001F98 01A4+00 1/1 0/0 0/0 .text Draw__15daObj_Pumpkin_cFv */ int daObj_Pumpkin_c::Draw() { if (field_0xBB0 == 0) { g_env_light.settingTevStruct(0, ¤t.pos, &tevStr); g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr); if (field_0xBA8 == 0) { mpModel->getModelData()->getMaterialNodePointer(0)->getShape()->hide(); } mDoExt_modelUpdateDL(mpModel); mpModel->getModelData()->getMaterialNodePointer(0)->getShape()->show(); fopAc_ac_c* actor_p = NULL; fopAcM_SearchByID(daPy_getPlayerActorClass()->getGrabActorID(), &actor_p); if (actor_p == this) { model = mpModel; } else if (-G_CM3D_F_INF != field_0xB60) { cM3dGPla pla; bool tri_pla = dComIfG_Bgsp().GetTriPla(mGndChk, &pla); if (tri_pla) { f32 reg_f31 = scale.x / (mpHIO->m.scale * mPumpkinScale) * 50.0f; dComIfGd_setSimpleShadow(¤t.pos, field_0xB60, reg_f31, &pla.mNormal, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); } } } return 1; } /* 80CB7824-80CB7844 002184 0020+00 1/1 0/0 0/0 .text * createHeapCallBack__15daObj_Pumpkin_cFP10fopAc_ac_c */ int daObj_Pumpkin_c::createHeapCallBack(fopAc_ac_c* i_this) { daObj_Pumpkin_c* a_this = static_cast(i_this); return a_this->CreateHeap(); } /* 80CB7844-80CB78C8 0021A4 0084+00 1/1 0/0 0/0 .text isDelete__15daObj_Pumpkin_cFv */ int daObj_Pumpkin_c::isDelete() { switch ((s32) mType) { case 0: return 0; case 1: return daNpcT_chkEvtBit(0x1E) == 0; case 2: return daNpcT_chkEvtBit(0x92) == 0; case 3: return 0; default: return 0; } } /* 80CB78C8-80CB7924 002228 005C+00 1/1 0/0 0/0 .text setEnvTevColor__15daObj_Pumpkin_cFv */ void daObj_Pumpkin_c::setEnvTevColor() { tevStr.YukaCol = dComIfG_Bgsp().GetPolyColor(mGndChk); tevStr.room_no = dComIfG_Bgsp().GetRoomId(mGndChk); } /* 80CB7924-80CB7968 002284 0044+00 1/1 0/0 0/0 .text setRoomNo__15daObj_Pumpkin_cFv */ void daObj_Pumpkin_c::setRoomNo() { s8 room_id = dComIfG_Bgsp().GetRoomId(mGndChk); fopAcM_SetRoomNo(this, room_id); mStts.SetRoomId(room_id); } /* 80CB7968-80CB79DC 0022C8 0074+00 2/2 0/0 0/0 .text reset__15daObj_Pumpkin_cFv */ void daObj_Pumpkin_c::reset() { int num_bytes = (u8*)&field_0xbb4 - (u8*)&field_0xB20; memset(&field_0xB20, 0, num_bytes); switch (getProcType()) { case 0: field_0xBA8 = 1; case 1: case 2: break; } mItemProcId = -1; } /* 80CB79DC-80CB7AE4 00233C 0108+00 2/2 0/0 0/0 .text setMtx__15daObj_Pumpkin_cFv */ void daObj_Pumpkin_c::setMtx() { s16 angleDiff = shape_angle.y - current.angle.y; s16 dVar5 = field_0xB7C * cM_scos(angleDiff); s16 dVar6 = field_0xB7C * cM_ssin(angleDiff); mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); mDoMtx_stack_c::ZXYrotM(shape_angle); mDoMtx_stack_c::XrotM(dVar5); mDoMtx_stack_c::ZrotM(dVar6); mDoMtx_stack_c::scaleM(scale); mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 80CB7AE4-80CB7B84 002444 00A0+00 1/1 0/0 0/0 .text calcRollAngle__15daObj_Pumpkin_cFsi */ s16 daObj_Pumpkin_c::calcRollAngle(s16 arg0, int arg1) { int reg_r31; int reg_r30; int sp_0x8 = arg1; int reg_r29 = 0x800; int reg_27 = 4; if (arg0) { reg_r31 = (u16)arg0; reg_r30 = sp_0x8 - reg_r31; if (reg_27 < abs(reg_r30)) { reg_r30 /= reg_27; if (reg_r30 > reg_r29) { reg_r31 = reg_r31 + reg_r29; } else if (reg_r30 < -reg_r29) { reg_r31 = reg_r31 - reg_r29; } else { reg_r31 = reg_r31 + reg_r30; } } else { reg_r31 = sp_0x8; } return reg_r31; } return 0; } /* 80CB7B84-80CB7D14 0024E4 0190+00 1/1 0/0 0/0 .text getWallAngle__15daObj_Pumpkin_cFsPs */ int daObj_Pumpkin_c::getWallAngle(s16 arg0, s16* arg1) { cXyz sp_0x20; cXyz sp_0x30[2]; cXyz sp_0x14; s16 reg_r27 = arg0; mDoMtx_stack_c::YrotS(arg0); sp_0x14.set(0.0f, 0.0f, -50.0f); mDoMtx_stack_c::multVec(&sp_0x14, &sp_0x20); sp_0x20 += current.pos; sp_0x14.set(5.0f, 0.0f, 200.0f); for (int idx = 0; idx < 2; ++idx) { mDoMtx_stack_c::multVec(&sp_0x14, &sp_0x30[idx]); sp_0x14.x = -1.0f * sp_0x14.x; sp_0x30[idx] += sp_0x20; mLinChk.Set(&sp_0x20, &sp_0x30[idx], this); if (dComIfG_Bgsp().LineCross(&mLinChk)) { sp_0x30[idx] = mLinChk.GetCross(); continue; } return 0; } sp_0x14 = sp_0x30[1] - sp_0x30[0]; reg_r27 = cM_atan2s(sp_0x14.x, sp_0x14.z); *arg1 = reg_r27 + 0x4000; return 1; } /* 80CB7D14-80CB7D98 002674 0084+00 1/1 0/0 0/0 .text setSmokePrtcl__15daObj_Pumpkin_cFv */ void daObj_Pumpkin_c::setSmokePrtcl() { fopAcM_effSmokeSet1(&mSmokePrtcl1, &mSmokePrtcl2, ¤t.pos, NULL, 0.6f * mPumpkinScale, &tevStr, 1); dComIfGp_particle_levelEmitterOnEventMove(mSmokePrtcl1); dComIfGp_particle_levelEmitterOnEventMove(mSmokePrtcl2); } /* 80CB7D98-80CB7E98 0026F8 0100+00 1/1 0/0 0/0 .text setWaterPrtcl__15daObj_Pumpkin_cFv */ void daObj_Pumpkin_c::setWaterPrtcl() { static u16 emttrId[4] = { ID_ZI_J_DOWNWTRA_A, ID_ZI_J_DOWNWTRA_B, ID_ZI_J_DOWNWTRA_C, ID_ZI_J_DOWNWTRA_D, }; cXyz prtcl_scale(0.6f * mPumpkinScale, 0.6f * mPumpkinScale, 0.6f * mPumpkinScale); cXyz water_pos(current.pos.x, mWaterY, current.pos.z); for (int idx = 0; idx < 4; ++idx) { mWaterPrtcls[idx] = dComIfGp_particle_set(mWaterPrtcls[idx], emttrId[idx], &water_pos, &tevStr, NULL, &prtcl_scale, 0xFF, NULL, -1, NULL, NULL, NULL); dComIfGp_particle_levelEmitterOnEventMove(mWaterPrtcls[idx]); } } /* 80CB7E98-80CB7EF4 0027F8 005C+00 1/1 0/0 0/0 .text setHamonPrtcl__15daObj_Pumpkin_cFv */ void daObj_Pumpkin_c::setHamonPrtcl() { cXyz water_pos(current.pos.x, mWaterY, current.pos.z); fopAcM_effHamonSet(&mHamonPrtcl, &water_pos, 0.7f * mPumpkinScale, 0.05f); } /* 80CB7EF4-80CB81A4 002854 02B0+00 1/1 0/0 0/0 .text crash__15daObj_Pumpkin_cFv */ void daObj_Pumpkin_c::crash() { fopAc_ac_c* actor_p = NULL; s32 reg_r30 = 0; reg_r30 = fopAcM_SearchByName(PROC_NPC_JAGAR, &actor_p); if (reg_r30 && actor_p != NULL) { ((daNpc_Jagar_c*)actor_p)->crashPumpkin(this); } fopAcM_seStart(this, Z2SE_OBJ_PUMPKIN_CRASH, 0); if (field_0xBA8) { dComIfGp_particle_set(-1, dPa_RM(ID_ZI_S_PUMPKIN_LEAF_A), ¤t.pos, &shape_angle, &scale); dComIfGp_particle_set(-1, dPa_RM(ID_ZI_S_PUMPKIN_LEAF_B), ¤t.pos, &shape_angle, &scale); } dComIfGp_particle_set(-1, dPa_RM(ID_ZI_S_PUMPKIN_A), ¤t.pos, NULL, &scale); reset(); mStts.ClrCcMove(); speedF = 0.0f; speed.setall(0.0f); field_0xBB0 = 1; field_0xBAE = 1; } /* 80CB81A4-80CB81C4 002B04 0020+00 1/0 0/0 0/0 .text daObj_Pumpkin_Create__FPv */ static int daObj_Pumpkin_Create(void* i_this) { int ret = static_cast(i_this)->create(); return ret; } /* 80CB81C4-80CB81E4 002B24 0020+00 1/0 0/0 0/0 .text daObj_Pumpkin_Delete__FPv */ static int daObj_Pumpkin_Delete(void* i_this) { return static_cast(i_this)->Delete(); } /* 80CB81E4-80CB8204 002B44 0020+00 1/0 0/0 0/0 .text daObj_Pumpkin_Execute__FPv */ static int daObj_Pumpkin_Execute(void* i_this) { return static_cast(i_this)->Execute(); } /* 80CB8204-80CB8224 002B64 0020+00 1/0 0/0 0/0 .text daObj_Pumpkin_Draw__FPv */ static int daObj_Pumpkin_Draw(void* i_this) { return static_cast(i_this)->Draw(); } /* 80CB8224-80CB822C 002B84 0008+00 1/0 0/0 0/0 .text daObj_Pumpkin_IsDelete__FPv */ static int daObj_Pumpkin_IsDelete(void*) { return 1; } /* 80CB84E8-80CB8508 -00001 0020+00 1/0 0/0 0/0 .data daObj_Pumpkin_MethodTable */ static actor_method_class daObj_Pumpkin_MethodTable = { (process_method_func)daObj_Pumpkin_Create, (process_method_func)daObj_Pumpkin_Delete, (process_method_func)daObj_Pumpkin_Execute, (process_method_func)daObj_Pumpkin_IsDelete, (process_method_func)daObj_Pumpkin_Draw, }; /* 80CB8508-80CB8538 -00001 0030+00 0/0 0/0 1/0 .data g_profile_OBJ_PUMPKIN */ extern actor_process_profile_definition g_profile_OBJ_PUMPKIN = { fpcLy_CURRENT_e, // mLayerID 8, // mListID fpcPi_CURRENT_e, // mListPrio PROC_OBJ_PUMPKIN, // mProcName &g_fpcLf_Method.base, // sub_method sizeof(daObj_Pumpkin_c), // mSize 0, // mSizeOther 0, // mParameters &g_fopAc_Method.base, // sub_method 716, // mPriority &daObj_Pumpkin_MethodTable, // sub_method 0x00044100, // mStatus fopAc_ACTOR_e, // mActorType fopAc_CULLBOX_CUSTOM_e, // cullType };