From ff06a2541aa63e668651d27ad4faf298c7463183 Mon Sep 17 00:00:00 2001 From: SuperDude88 <82904174+SuperDude88@users.noreply.github.com> Date: Sun, 29 Jun 2025 00:16:54 -0400 Subject: [PATCH] d_a_obj_canon Equivalent (#802) * d_a_obj_canon Equivalent * Cleanup - Use g_regHIO macros - Use resource enum --- configure.py | 2 +- include/d/actor/d_a_obj_canon.h | 79 +++++- src/d/actor/d_a_obj_canon.cpp | 469 +++++++++++++++++++++++++++++--- 3 files changed, 500 insertions(+), 50 deletions(-) diff --git a/configure.py b/configure.py index 285cc1d26..3b85f7715 100755 --- a/configure.py +++ b/configure.py @@ -1503,7 +1503,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_obj_balancelift"), ActorRel(Equivalent, "d_a_obj_barrier", extra_cflags=['-pragma "nosyminline on"']), # weak func order ActorRel(NonMatching, "d_a_obj_bemos"), - ActorRel(NonMatching, "d_a_obj_canon"), + ActorRel(NonMatching, "d_a_obj_canon", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_obj_eff"), ActorRel(NonMatching, "d_a_obj_magmarock"), ActorRel(NonMatching, "d_a_obj_majyuu_door"), diff --git a/include/d/actor/d_a_obj_canon.h b/include/d/actor/d_a_obj_canon.h index 6fefe264b..b0ef8fa13 100644 --- a/include/d/actor/d_a_obj_canon.h +++ b/include/d/actor/d_a_obj_canon.h @@ -1,7 +1,11 @@ #ifndef D_A_OBJ_CANON_H #define D_A_OBJ_CANON_H +#include "d/d_cc_d.h" +#include "d/d_npc.h" +#include "d/d_particle.h" #include "f_op/f_op_actor.h" +#include "m_Do/m_Do_hostIO.h" class J3DNode; class dCcD_SrcSph; @@ -9,15 +13,16 @@ class dCcD_SrcSph; class daObj_Canon_c : public fopAc_ac_c { public: enum Proc_e { - + PROC_INIT = 0, + PROC_EXEC = 1 }; - void modeProcInit(int) {} + void modeProcInit(int newMode) { modeProc(PROC_INIT, newMode); } void _nodeControl(J3DNode*, J3DModel*); - void _createHeap(); - void setEffect(unsigned short); - void checkTgHit(); + BOOL _createHeap(); + void setEffect(u16); + bool checkTgHit(); void attackCannon(); void lockonCannon(); void setAttention(); @@ -38,22 +43,74 @@ public: void debugDraw(); bool _draw(); void createInit(); - void getArg(); + u8 getArg(); cPhs_State _create(); bool _delete(); + static const u32 m_heapsize; + static const char m_arc_name[]; static const dCcD_SrcSph m_sph_src; public: - /* Place member variables here */ -}; + /* 0x290 */ s32 mCurMode; + /* 0x294 */ u8 field_0x294; + /* 0x295 */ u8 field_0x295; + /* 0x296 */ u8 field_0x296; + /* 0x297 */ u8 field_0x297; + /* 0x298 */ dNpc_PathRun_c field_0x298; + /* 0x2A0 */ u8 field_0x2A0[0x2B0 - 0x2A0]; + /* 0x2B0 */ dPath* field_0x2B0; + /* 0x2B0 */ u8 field_0x2B4[0x2B8 - 0x2B4]; + /* 0x2B8 */ request_of_phase_process_class mPhs; + /* 0x2C0 */ J3DModel* mpModel; + /* 0x2C4 */ s16 field_0x2C4; + /* 0x2C6 */ s16 field_0x2C6; + /* 0x2C8 */ s16 field_0x2C8; + /* 0x2CA */ s16 field_0x2CA; + /* 0x2CC */ cXyz field_0x2CC; + /* 0x2D8 */ dCcD_Sph mSph; + /* 0x420 */ dCcD_Stts mStts; + /* 0x444 */ int field_0x440; + /* 0x444 */ int field_0x444; + /* 0x448 */ u8 field_0x448[0x450 - 0x448]; + /* 0x450 */ cXyz field_0x450; + /* 0x45C */ cXyz field_0x45C; + /* 0x468 */ s16 field_0x468; + /* 0x46A */ s16 field_0x46A; + /* 0x46C */ f32 field_0x46C; + /* 0x470 */ dPa_followEcallBack field_0x470; + /* 0x484 */ int field_0x484; + /* 0x488 */ s32 field_0x488; +}; // Size: 0x48C -class daObj_Canon_HIO_c { +class daObj_Canon_HIO_c : public mDoHIO_entry_c { public: daObj_Canon_HIO_c(); public: - /* Place member variables here */ -}; + /* 0x04 */ bool debug_draw; + /* 0x05 */ u8 field_0x05; + /* 0x08 */ f32 field_0x08; + /* 0x0C */ f32 field_0x0C; + /* 0x10 */ f32 field_0x10; + /* 0x14 */ f32 field_0x14; + /* 0x18 */ f32 field_0x18; + /* 0x1C */ f32 field_0x1C; + /* 0x20 */ f32 field_0x20; + /* 0x24 */ f32 field_0x24; + /* 0x28 */ s16 field_0x28; + /* 0x2C */ f32 field_0x2C; + /* 0x30 */ s16 field_0x30; + /* 0x32 */ s16 field_0x32; + /* 0x34 */ s16 field_0x34; + /* 0x36 */ s16 field_0x36; + /* 0x38 */ s16 field_0x38; + /* 0x3A */ s16 field_0x3A; + /* 0x3C */ s16 field_0x3C; + /* 0x3E */ s16 field_0x3E; + /* 0x40 */ f32 field_0x40; + /* 0x44 */ f32 field_0x44; + /* 0x48 */ s16 field_0x48; +}; // Size: 0x4C #endif /* D_A_OBJ_CANON_H */ diff --git a/src/d/actor/d_a_obj_canon.cpp b/src/d/actor/d_a_obj_canon.cpp index 8c11f32c4..641f83e1c 100644 --- a/src/d/actor/d_a_obj_canon.cpp +++ b/src/d/actor/d_a_obj_canon.cpp @@ -4,10 +4,27 @@ */ #include "d/actor/d_a_obj_canon.h" +#include "JSystem/J3DGraphAnimator/J3DModel.h" +#include "JSystem/J3DGraphAnimator/J3DNode.h" +#include "JSystem/J3DGraphBase/J3DSys.h" +#include "d/actor/d_a_player.h" +#include "d/actor/d_a_ship.h" +#include "d/d_cc_uty.h" +#include "d/d_com_inf_game.h" +#include "d/d_path.h" #include "d/d_procname.h" #include "d/d_priority.h" #include "d/d_cc_d.h" +#include "d/actor/d_a_bomb.h" +#include "d/d_s_play.h" +#include "d/res/res_wallbom.h" +#include "weak_data_1811.h" // IWYU pragma: keep + +daObj_Canon_HIO_c l_HIO; + +const u32 daObj_Canon_c::m_heapsize = 0x8C0; +const char daObj_Canon_c::m_arc_name[] = "WallBom"; const dCcD_SrcSph daObj_Canon_c::m_sph_src = { // dCcD_SrcGObjInf { @@ -40,152 +57,528 @@ const dCcD_SrcSph daObj_Canon_c::m_sph_src = { /* 000000EC-000001A0 .text __ct__17daObj_Canon_HIO_cFv */ daObj_Canon_HIO_c::daObj_Canon_HIO_c() { - /* Nonmatching */ + debug_draw = false; + field_0x05 = 0; + field_0x08 = 150.0f; + field_0x14 = 0.0f; + field_0x18 = 180.0f; + field_0x1C = 0.0f; + field_0x20 = 90.0f; + field_0x24 = -1.1f; + field_0x28 = 0x16; + field_0x2C = 5000.0f; + field_0x30 = 0x3000; + field_0x32 = 0x2328; + field_0x34 = -0x2328; + field_0x36 = 0x2328; + field_0x38 = -0x2328; + field_0x3A = 0x2800; + field_0x3C = 0x1E; + field_0x3E = 0x1E; + field_0x40 = 2000.0f; + field_0x44 = 0.2f; + field_0x48 = 0; } /* 000001E8-00000234 .text nodeControl_CB__FP7J3DNodei */ -static BOOL nodeControl_CB(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeControl_CB(J3DNode* node, int calcTiming) { + if (calcTiming == J3DNodeCBCalcTiming_In) { + J3DModel* model = j3dSys.getModel(); + daObj_Canon_c* i_this = reinterpret_cast(model->getUserArea()); + if (i_this) { + i_this->_nodeControl(node, model); + } + } + + return TRUE; } /* 00000234-000003D8 .text _nodeControl__13daObj_Canon_cFP7J3DNodeP8J3DModel */ -void daObj_Canon_c::_nodeControl(J3DNode*, J3DModel*) { - /* Nonmatching */ +void daObj_Canon_c::_nodeControl(J3DNode* node, J3DModel* model) { + J3DJoint* joint = (J3DJoint*)node; + s32 jntNo = joint->getJntNo(); + mDoMtx_stack_c::copy(model->getAnmMtx(jntNo)); + csXyz temp(0, 0, 0); + if(REG12_S(1)) { + temp.set(REG12_S(2), REG12_S(3), REG12_S(4)); + } + else { + temp.x = -field_0x2CA; + temp.z = -field_0x2C6; + } + mDoMtx_stack_c::ZXYrotM(temp); + field_0x468 += REG12_S(2) + 0x1830; + mDoMtx_stack_c::XrotM(field_0x46A * (REG12_S(5) + 5) * cM_ssin(field_0x468)); + cXyz temp2; + temp2.x = REG12_F(3); + temp2.y = -field_0x46C; + temp2.z = REG12_F(5); + mDoMtx_stack_c::transM(temp2); + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); } /* 000003D8-000003F8 .text createHeap_CB__FP10fopAc_ac_c */ -static BOOL createHeap_CB(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL createHeap_CB(fopAc_ac_c* i_this) { + return static_cast(i_this)->_createHeap(); } /* 000003F8-000004CC .text _createHeap__13daObj_Canon_cFv */ -void daObj_Canon_c::_createHeap() { - /* Nonmatching */ +BOOL daObj_Canon_c::_createHeap() { + J3DModelData* modelData = (J3DModelData *)dComIfG_getObjectRes(m_arc_name, WALLBOM_BDL_WALLBOM); + JUT_ASSERT(0x115, modelData != 0); + + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000022); + if(mpModel == NULL) { + return FALSE; + } + + mpModel->setUserArea((u32)this); + modelData->getJointNodePointer(3)->setCallBack(nodeControl_CB); + + return TRUE; } /* 000004CC-000005AC .text setEffect__13daObj_Canon_cFUs */ -void daObj_Canon_c::setEffect(unsigned short) { - /* Nonmatching */ +void daObj_Canon_c::setEffect(u16 param_1) { + GXColor* prmColor = NULL, *envColor = NULL; + if(param_1 == dPa_name::ID_SCENE_82E4) { + prmColor = &tevStr.mColorK0; + envColor = &tevStr.mColorK0; + } + + if(param_1 == dPa_name::ID_COMMON_03E1) { + dComIfGp_particle_set(param_1, ¤t.pos, &shape_angle, &scale, 0xFF, &field_0x470, -1, prmColor, envColor); + field_0x484 = 0xE6; + } + else { + dComIfGp_particle_set(param_1, ¤t.pos, &shape_angle, &scale, 0xFF, NULL, -1, prmColor, envColor); + } } /* 000005AC-0000082C .text checkTgHit__13daObj_Canon_cFv */ -void daObj_Canon_c::checkTgHit() { - /* Nonmatching */ +bool daObj_Canon_c::checkTgHit() { + mStts.Move(); + if(l_HIO.field_0x05) { + health = 0; + modeProcInit(2); + return true; + } + + if(cLib_calcTimer(&field_0x440) == 0) { + CcAtInfo atInfo; + atInfo.pParticlePos = NULL; + cCcD_Obj* tg = mSph.GetTgHitObj(); + cXyz hitPos = *mSph.GetTgHitPosP(); + atInfo.mpObj = mSph.GetTgHitObj(); + if (tg == NULL) { + return false; + } + + bool hit = true; + switch(tg->GetAtType()) { + case AT_TYPE_BOMB: + health -= 2; + break; + case AT_TYPE_BOOMERANG: + field_0x46A = 0x190; + fopAcM_seStart(this, JA_SE_LK_W_WEP_HIT, 0x20); + health -= 1; + break; + default: + hit = false; + } + + if(hit) { + field_0x440 = 5; + dComIfGp_particle_set(dPa_name::ID_COMMON_0010, &hitPos); + + if(health <= 0) { + daPy_py_c* player = daPy_getPlayerActorClass(); + cXyz particleScale(2.0f, 2.0f, 2.0f); + dComIfGp_particle_set(dPa_name::ID_COMMON_BIG_HIT, &hitPos, &player->shape_angle, &particleScale); + fopAcM_seStart(this, JA_SE_LK_LAST_HIT, 0); + modeProcInit(2); + } + else { + modeProcInit(0); + } + + return true; + } + } + + return false; } /* 0000082C-00000990 .text attackCannon__13daObj_Canon_cFv */ void daObj_Canon_c::attackCannon() { - /* Nonmatching */ + csXyz angle; + angle.set(shape_angle.x - field_0x2CA, shape_angle.y + field_0x2C6, shape_angle.z); + daBomb_c* bomb = (daBomb_c*)fopAcM_fastCreate(PROC_BOMB, daBomb_c::prm_make(daBomb_c::STATE_4, true, true), &field_0x450, tevStr.mRoomNo, &angle); + bomb->setNoGravityTime(l_HIO.field_0x28); + bomb->speedF = l_HIO.field_0x20 * cM_scos(angle.x); + bomb->speed.y = -(l_HIO.field_0x20 * cM_ssin(angle.x)); + bomb->gravity = l_HIO.field_0x24; + + field_0x46A = 0xC8; + + mDoAud_seStart(JA_SE_LK_SHIP_CANNON_FIRE, &field_0x450); } /* 00000990-00000B4C .text lockonCannon__13daObj_Canon_cFv */ void daObj_Canon_c::lockonCannon() { - /* Nonmatching */ + f32 temp2 = (current.pos - field_0x2CC).absXZ(); + + field_0x2C4 = cLib_targetAngleY(¤t.pos, &field_0x2CC) - shape_angle.y; + s16 temp3 = 0; + if(temp2 > l_HIO.field_0x2C) { + temp2 -= l_HIO.field_0x2C; + temp3 = temp2; + if(temp3 > l_HIO.field_0x30) { + temp3 = l_HIO.field_0x30; + } + } + field_0x2C8 = temp3 + cLib_targetAngleX(¤t.pos, &field_0x2CC); + field_0x2C8 = cLib_minMaxLimit(field_0x2C8, l_HIO.field_0x34, l_HIO.field_0x32); + field_0x2C4 = cLib_minMaxLimit(field_0x2C4, l_HIO.field_0x38, l_HIO.field_0x36); } /* 00000B4C-00000BA8 .text setAttention__13daObj_Canon_cFv */ void daObj_Canon_c::setAttention() { - /* Nonmatching */ + attention_info.position = field_0x45C; + attention_info.position.y += l_HIO.field_0x0C; + eyePos = field_0x45C; + eyePos.y += l_HIO.field_0x10; } /* 00000BA8-00000C2C .text setCollision__13daObj_Canon_cFv */ void daObj_Canon_c::setCollision() { - /* Nonmatching */ + mSph.SetR((80.0f + REG12_F(0)) * scale.x); + mSph.SetC(field_0x45C); + + if(mCurMode != 2 && mCurMode != 3) { + dComIfG_Ccsp()->Set(&mSph); + } } /* 00000C2C-00000CB4 .text setMtx__13daObj_Canon_cFv */ void daObj_Canon_c::setMtx() { - /* Nonmatching */ + mpModel->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000CB4-00000CC8 .text modeWaitInit__13daObj_Canon_cFv */ void daObj_Canon_c::modeWaitInit() { - /* Nonmatching */ + field_0x444 = l_HIO.field_0x3E; } /* 00000CC8-00001064 .text modeWait__13daObj_Canon_cFv */ void daObj_Canon_c::modeWait() { - /* Nonmatching */ + if(!checkTgHit()) { + daPy_py_c* player = daPy_getPlayerActorClass(); + + if(dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK1000000_e)) { + field_0x444 = l_HIO.field_0x3E * 10; + field_0x488 = 0; + } + + daShip_c* ship = dComIfGp_getShipActor(); + if(ship && ship->checkShootCannon()) { + field_0x488++; + } + + if(cLib_calcTimer(&field_0x444) == 0) { + if(field_0x298.chkInside(&player->current.pos)) { + s16 temp = l_HIO.field_0x08; + + f32 abs = (current.pos - field_0x2CC).absXZ(); + if(abs > l_HIO.field_0x40) { + temp = temp + (abs - l_HIO.field_0x40) * l_HIO.field_0x44; + } + + field_0x2CC = daPy_getPlayerActorClass()->current.pos; + + if(field_0x298.chkInside(&field_0x2CC)) { + if(dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK1000000_e | daPyStts0_SWIM_e)) { + field_0x488 = 0; + temp += 3000.0f; + } + else if(abs > l_HIO.field_0x40 && field_0x488 < 6) { + temp += 200.0f * (6 - field_0x488); + } + + s16 temp2 = fopAcM_searchActorAngleY(this, daPy_getPlayerActorClass()); + + field_0x2CC.x -= temp * cM_ssin(temp2); + field_0x2CC.z -= temp * cM_scos(temp2); + + field_0x444 = l_HIO.field_0x3E; + + modeProcInit(1); + } + } + else { + field_0x2C8 = 0; + field_0x2C4 = 0; + field_0x444 = l_HIO.field_0x3E; + } + } + } } /* 00001064-00001078 .text modeAttackInit__13daObj_Canon_cFv */ void daObj_Canon_c::modeAttackInit() { - /* Nonmatching */ + field_0x444 = l_HIO.field_0x3C; } /* 00001078-000010DC .text modeAttack__13daObj_Canon_cFv */ void daObj_Canon_c::modeAttack() { - /* Nonmatching */ + if(!checkTgHit()) { + lockonCannon(); + + if(cLib_calcTimer(&field_0x444) == 0) { + attackCannon(); + modeProcInit(0); + } + } } /* 000010DC-00001174 .text modeDeleteInit__13daObj_Canon_cFv */ void daObj_Canon_c::modeDeleteInit() { - /* Nonmatching */ + field_0x46A = 0; + + if(field_0x295 != 0xFF) { + dComIfGs_onSwitch(field_0x295, fopAcM_GetRoomNo(this)); + } + + setEffect(dPa_name::ID_SCENE_82E4); + setEffect(dPa_name::ID_SCENE_82E5); + setEffect(dPa_name::ID_SCENE_82E6); + setEffect(dPa_name::ID_COMMON_03E1); + + fopAcM_OffStatus(this, fopAcStts_SHOWMAP_e | 0x1F); } /* 00001174-00001178 .text modeDelete__13daObj_Canon_cFv */ void daObj_Canon_c::modeDelete() { - /* Nonmatching */ + return; } /* 00001178-00001194 .text modeSwWaitInit__13daObj_Canon_cFv */ void daObj_Canon_c::modeSwWaitInit() { - /* Nonmatching */ + field_0x46C = 120.0f; + fopAcM_OffStatus(this, fopAcStts_SHOWMAP_e | 0x1F); } /* 00001194-000011F4 .text modeSwWait__13daObj_Canon_cFv */ void daObj_Canon_c::modeSwWait() { - /* Nonmatching */ + if(field_0x296 != 0xFF) { + if(dComIfGs_isSwitch(field_0x296, fopAcM_GetRoomNo(this))) { + modeProcInit(4); + } + } } /* 000011F4-0000121C .text modeAppearInit__13daObj_Canon_cFv */ void daObj_Canon_c::modeAppearInit() { - /* Nonmatching */ + field_0x46A = 0x258; + field_0x46C = 120.0f; + fopAcM_SetStatusMap(this, 0x15); } /* 0000121C-00001290 .text modeAppear__13daObj_Canon_cFv */ void daObj_Canon_c::modeAppear() { - /* Nonmatching */ + cLib_addCalc2(&field_0x46C, 0.0f, 0.1f, 1.0f); + if(field_0x46C < 2.0f) { + field_0x46C = 0.0f; + modeProcInit(0); + } } /* 00001290-00001410 .text modeProc__13daObj_Canon_cFQ213daObj_Canon_c6Proc_ei */ -void daObj_Canon_c::modeProc(daObj_Canon_c::Proc_e, int) { - /* Nonmatching */ +void daObj_Canon_c::modeProc(daObj_Canon_c::Proc_e proc, int newMode) { + typedef void(daObj_Canon_c::*mode_func_t)(void); + struct mode_entry_t { + mode_func_t init; + mode_func_t run; + const char* name; + }; + + static mode_entry_t mode_tbl[] = { + { + &daObj_Canon_c::modeWaitInit, + &daObj_Canon_c::modeWait, + "WAIT", + }, + { + &daObj_Canon_c::modeAttackInit, + &daObj_Canon_c::modeAttack, + "ATTACK", + }, + { + &daObj_Canon_c::modeDeleteInit, + &daObj_Canon_c::modeDelete, + "DELETE", + }, + { + &daObj_Canon_c::modeSwWaitInit, + &daObj_Canon_c::modeSwWait, + "SW_WAIT", + }, + { + &daObj_Canon_c::modeAppearInit, + &daObj_Canon_c::modeAppear, + "APPEAR", + }, + }; + + if(proc == PROC_INIT) { + mCurMode = newMode; + (this->*mode_tbl[mCurMode].init)(); + } + else if(proc == PROC_EXEC) { + (this->*mode_tbl[mCurMode].run)(); + } } /* 00001410-000015AC .text _execute__13daObj_Canon_cFv */ bool daObj_Canon_c::_execute() { - /* Nonmatching */ + cLib_addCalcAngleS2(&field_0x46A, 0, 0xA, 0xA); + cLib_addCalcAngleS2(&field_0x2CA, field_0x2C8, 0x6, 0x300); + cLib_addCalcAngleS2(&field_0x2C6, field_0x2C4, 0x6, 0x300); + + setAttention(); + setCollision(); + + modeProc(PROC_EXEC, 5); + + mpModel->calc(); + Vec temp = {0.0f, 0.0f, 0.0f}; + temp.x = l_HIO.field_0x14; + temp.y = l_HIO.field_0x18 * scale.x; + temp.z = l_HIO.field_0x1C; + mDoMtx_multVec(mpModel->getAnmMtx(3), &temp, &field_0x450); + Vec temp2 = {0.0f, 0.0f, 0.0f}; + temp2.x = REG12_F(0); + temp2.y = (REG12_F(1) + 60.0f) * scale.x; + temp2.z = REG12_F(2); + mDoMtx_multVec(mpModel->getAnmMtx(3), &temp2, &field_0x45C); + + if(field_0x470.getEmitter()) { + if(cLib_calcTimer(&field_0x484) == 0) { + field_0x470.end(); + } + } + + setMtx(); + + return false; } /* 000015AC-000015B0 .text debugDraw__13daObj_Canon_cFv */ void daObj_Canon_c::debugDraw() { - /* Nonmatching */ + GXColor col = {0xFF, 0x00, 0x00, 0x80}; + GXColor col2 = {0xFF, 0x00, 0x00, 0x80}; + + return; } /* 000015B0-00001688 .text _draw__13daObj_Canon_cFv */ bool daObj_Canon_c::_draw() { - /* Nonmatching */ + if(l_HIO.debug_draw) { + debugDraw(); + } + + if(mCurMode == 2 || mCurMode == 3) { + mpModel->getModelData()->getJointNodePointer(3)->getMesh()->getShape()->hide(); + } + else { + mpModel->getModelData()->getJointNodePointer(3)->getMesh()->getShape()->show(); + } + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + mDoExt_modelEntryDL(mpModel); + + return true; } /* 00001688-00001804 .text createInit__13daObj_Canon_cFv */ void daObj_Canon_c::createInit() { - /* Nonmatching */ + if(field_0x295 != 0xFF && dComIfGs_isSwitch(field_0x295, fopAcM_GetRoomNo(this))) { + modeProcInit(2); + } + else if(field_0x296 != 0xFF && !dComIfGs_isSwitch(field_0x296, fopAcM_GetRoomNo(this))) { + modeProcInit(3); + } + else { + modeProcInit(0); + } + + max_health = 2; + health = max_health; + + field_0x2B0 = dPath_GetRoomPath(field_0x294, fopAcM_GetRoomNo(this)); + field_0x298.setInfDrct(field_0x2B0); + + setMtx(); + + mpModel->calc(); + + f32 temp = scale.x; + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + fopAcM_setCullSizeBox(this, -100.0f * temp, -100.0f * temp, -10.0f * temp, 100.0f * temp, 100.0f * temp, 150.0f * temp); + fopAcM_setCullSizeFar(this, 10.0f); + + mStts.Init(0xFF, 0xFF, this); + mSph.Set(m_sph_src); + mSph.SetStts(&mStts); } /* 00001804-00001880 .text getArg__13daObj_Canon_cFv */ -void daObj_Canon_c::getArg() { - /* Nonmatching */ +u8 daObj_Canon_c::getArg() { + u32 param = fopAcM_GetParam(this); + field_0x297 = fopAcM_GetParamBit(param, 0, 0xFF); + field_0x296 = fopAcM_GetParamBit(param, 8, 0xFF); + field_0x294 = fopAcM_GetParamBit(param, 16, 0xFF); + field_0x295 = fopAcM_GetParamBit(param, 24, 0xFF); + if(field_0x297 != 0xFF) { + scale.set(1.0 + field_0x297 * 0.1, 1.0 + field_0x297 * 0.1, 1.0 + field_0x297 * 0.1); + } } /* 00001880-000019D8 .text _create__13daObj_Canon_cFv */ cPhs_State daObj_Canon_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daObj_Canon_c); + + int result = dComIfG_resLoad(&mPhs, m_arc_name); + if(result == cPhs_COMPLEATE_e) { + getArg(); + + if(field_0x294 == 0xFF) { + return cPhs_ERROR_e; + } + + if(!fopAcM_entrySolidHeap(this, createHeap_CB, 0x8C0)) { + return cPhs_ERROR_e; + } + + createInit(); + } + + return result; } /* 00001BEC-00001C50 .text _delete__13daObj_Canon_cFv */ bool daObj_Canon_c::_delete() { - /* Nonmatching */ + dComIfG_resDelete(&mPhs, m_arc_name); + field_0x470.end(); + mDoAud_seDeleteObject(&field_0x450); + + return true; } /* 00001C50-00001C70 .text daObj_CanonCreate__FPv */