diff --git a/include/JSystem/JGeometry.h b/include/JSystem/JGeometry.h index e808b9eab..d50c7dd4c 100644 --- a/include/JSystem/JGeometry.h +++ b/include/JSystem/JGeometry.h @@ -289,6 +289,20 @@ struct TVec3 { }; return res; } + + template + void cubic(const JGeometry::TVec3& vec1, const JGeometry::TVec3& vec2, const JGeometry::TVec3& vec3, const JGeometry::TVec3& vec4, f32 f19) { + // TODO: name variables properly + f32 f5 = f19 * f19; + f32 f4 = f5 * f19; + f32 f3 = 1.0f + ((2.0f * f4) - (3.0f * f5)); + f32 f2 = (-2.0f * f4) + (3.0f * f5); + f32 f1 = f19 + (f4 - (2.0f * f5)); + f32 f0 = (f4 - f5); + this->x = (f3 * vec1.x) + (f2 * vec2.x) + (f1 * vec4.x) + (f0 * vec3.z); + this->y = (f3 * vec1.y) + (f2 * vec2.y) + (f1 * vec4.y) + (f0 * vec3.y); + this->z = (f3 * vec1.z) + (f2 * vec2.z) + (f1 * vec4.z) + (f0 * vec3.x); + } }; template diff --git a/include/JSystem/JParticle/JPAParticle.h b/include/JSystem/JParticle/JPAParticle.h index a821cf5f1..b721a1b37 100644 --- a/include/JSystem/JParticle/JPAParticle.h +++ b/include/JSystem/JParticle/JPAParticle.h @@ -34,6 +34,28 @@ public: ~JPABaseParticle() {} JPABaseParticle() : mLink(this), mCurFrame(0.0f) {} void setOffsetPosition(f32 x, f32 y, f32 z) { mGlobalPosition.set(x, y, z); } + void setOffsetPosition(const JGeometry::TVec3& pos) { mGlobalPosition.set(pos); } + + void calcCB(JPABaseEmitter*) {} + void checkStatus(u32) {} + void clearStatus(u32) {} + void drawCB(JPABaseEmitter*) {} + void getAge() const {} + void getDrawParamCPtr() {} + void getDrawParamPPtr() {} + void getGlobalPosition(JGeometry::TVec3&) const {} + void getHeight() {} + void getLifeTime() const {} + void getLocalPosition(JGeometry::TVec3&) const {} + void getOffsetPosition(JGeometry::TVec3&) const {} + void getVelVec(JGeometry::TVec3&) const {} + void getWidth() {} + void initStatus(u32) {} + void isInvisibleParticle() {} + void setCallBackPtr(JPACallBackBase2*) {} + void setDeleteParticleFlag() {} + void setInvisibleParticleFlag() {} + void setStatus(u32) {} public: /* 0x00 */ JSULink mLink; diff --git a/include/d/actor/d_a_bomb.h b/include/d/actor/d_a_bomb.h index de91263ae..3a33b594e 100644 --- a/include/d/actor/d_a_bomb.h +++ b/include/d/actor/d_a_bomb.h @@ -9,14 +9,11 @@ #include "m_Do/m_Do_ext.h" #include "m_Do/m_Do_ext.h" - - class daBomb_fuseSmokeEcallBack : public dPa_levelEcallBack { public: daBomb_fuseSmokeEcallBack() {} - ~daBomb_fuseSmokeEcallBack(); + ~daBomb_fuseSmokeEcallBack() {} - void init(JPABaseEmitter*); void execute(JPABaseEmitter*); void executeAfter(JPABaseEmitter*); void draw(JPABaseEmitter*); @@ -33,11 +30,9 @@ public: class daBomb_fuseSparksEcallBack : public dPa_levelEcallBack { public: daBomb_fuseSparksEcallBack() {} - ~daBomb_fuseSparksEcallBack(); + ~daBomb_fuseSparksEcallBack() {} - void init(JPABaseEmitter*); void execute(JPABaseEmitter*); - void executeAfter(JPABaseEmitter*); void draw(JPABaseEmitter*); void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8); @@ -136,7 +131,12 @@ public: PRM_VERSION_S = 0x1F, }; - void attrType() const {} + struct Attr_c { + const char* resName; + u32 heapSize; + }; + + const Attr_c& attrType() const { return m_attrType[mType]; } s16 getBombRestTime(); s16 getBombCheck_Flag(); @@ -213,11 +213,7 @@ private: /* 0x7C4 */ int mMassCounter; /* 0x7C8 */ int field_0x7C8; - struct AttrType { - const char* resName; - u32 heapSize; - }; - static const AttrType m_attrType[]; + static const Attr_c m_attrType[]; }; // Size 0x7CC #endif /* D_A_BOMB_H */ diff --git a/include/d/actor/d_a_bomb2.h b/include/d/actor/d_a_bomb2.h index 3d388ac64..1ae1e4769 100644 --- a/include/d/actor/d_a_bomb2.h +++ b/include/d/actor/d_a_bomb2.h @@ -14,13 +14,12 @@ namespace daBomb2 { class FuseSmokeCB_c : public dPa_levelEcallBack { public: FuseSmokeCB_c() {} - virtual ~FuseSmokeCB_c(); + virtual ~FuseSmokeCB_c() {} void setOldPosP(const cXyz*, const cXyz*); void deleteCallBack(); - //void init(JPABaseEmitter*); void execute(JPABaseEmitter*); void executeAfter(JPABaseEmitter*); void draw(JPABaseEmitter*); @@ -37,13 +36,11 @@ namespace daBomb2 { class FuseSparksCB_c : public dPa_levelEcallBack { public: FuseSparksCB_c() {} - virtual ~FuseSparksCB_c(); + virtual ~FuseSparksCB_c() {} void deleteCallBack(); - //void init(JPABaseEmitter*); void execute(JPABaseEmitter*); - //void executeAfter(JPABaseEmitter*); void draw(JPABaseEmitter*); void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8); diff --git a/src/d/actor/d_a_bomb.cpp b/src/d/actor/d_a_bomb.cpp index b19ec110c..caefe92e1 100644 --- a/src/d/actor/d_a_bomb.cpp +++ b/src/d/actor/d_a_bomb.cpp @@ -14,6 +14,10 @@ #include "m_Do/m_Do_mtx.h" #include "m_Do/m_Do_lib.h" +// Needed for the .data section to match. +static f32 dummy1[3] = {1.0f, 1.0f, 1.0f}; +static f32 dummy2[3] = {1.0f, 1.0f, 1.0f}; + namespace { enum AttrSt_e { ATTR_STATE_0 = 0x00, @@ -54,56 +58,53 @@ namespace { } } -const daBomb_c::AttrType daBomb_c::m_attrType[] = { +const daBomb_c::Attr_c daBomb_c::m_attrType[] = { {"Link", 0x8E0}, {"VbakH", 0x800}, {"Link", 0x8E0}, }; +/* 800D9364-800D977C .text executeAfter__25daBomb_fuseSmokeEcallBackFP14JPABaseEmitter */ void daBomb_fuseSmokeEcallBack::executeAfter(JPABaseEmitter* emitter) { - cXyz pos = *mpPos; - emitter->mGlobalTranslation.set(pos.x, pos.y, pos.z); + JGeometry::TVec3 vec1; + vec1.set(*field_0x0C); + JGeometry::TVec3 vec2; + vec2.set(*mpPos); + emitter->mGlobalTranslation.set(vec2); f32 temp = mpPos->abs(*field_0x0C); s16 temp2 = (20.0f - temp) * 0.5f + 10.0f; if(temp2 < 10) { temp2 = 10; } - //probably uses cubic__Q29JGeometry8TVec3FRCQ29JGeometry8TVec3RCQ29JGeometry8TVec3RCQ29JGeometry8TVec3RCQ29JGeometry8TVec3f - //but I don't know exactly what that would encompass emitter->mLifeTime = temp2; - cXyz temp3 = *field_0x0C - *mpPos; - cXyz temp4((field_0x0C->x - field_0x10->x) * 0.5f, (field_0x0C->y - field_0x10->y) * 0.5f, (field_0x0C->z - field_0x10->z) * 0.5f); + + JGeometry::TVec3 vec3; + vec3.z = 0.5f * (vec2.x - vec1.x); + vec3.y = 0.5f * (vec2.y - vec1.y); + vec3.x = 0.5f * (vec2.z - vec1.z); + + JGeometry::TVec3 vec4; + vec4.x = 0.5f * (vec1.x - field_0x10->x); + vec4.y = 0.5f * (vec1.y - field_0x10->y); + vec4.z = 0.5f * (vec1.z - field_0x10->z); + f32 temp5 = mpPos->abs(*field_0x0C); - //this is minimally-fixed ghidra stuff, no idea if its functionality is even similar - if(temp5 * 0.1f < 1.0f) { - f32 temp6 = 1.0f / (temp5 * 0.1f); - s32 temp7 = temp6; - s32 temp8 = temp2 + temp7; + if(temp5 * 0.1f > 1.0f) { + f32 step = 1.0f / (temp5 * 0.1f); + s16 temp7 = step * (field_0x04 - temp2); + s16 temp8 = temp2 + temp7; - f32 step = temp6; - for(; temp6 < 1.0f; temp6 += step) { - cXyz temp9; - temp9.x = temp6 * temp6; - temp9.y = temp9.x * temp6; - temp9.z = 1.0f + (2.0f * temp9.y - 3.0f * temp9.x); - cXyz temp10; - temp10.x = -2.0f * temp9.y + 3.0f * temp9.x; - temp10.y = temp6 + (temp9.y - 2.0f * temp9.x); - temp10.z = temp9.y - temp9.x; - cXyz temp11; - temp11.x = temp10.z * temp3.x * 0.5f + temp10.y * temp4.x + temp9.z * field_0x0C->x + temp10.x * mpPos->x; - temp11.y = temp10.z * temp3.y * 0.5f + temp10.y * temp4.y + temp9.z * field_0x0C->y + temp10.x * mpPos->y; - temp11.z = temp10.z * temp3.z * 0.5f + temp10.y * temp4.z + temp9.z * field_0x0C->z + temp10.x * mpPos->z; + for(f32 i = step; i < 1.0f; i += step, temp8 += temp7) { + JGeometry::TVec3 vec5; + vec5.cubic(vec1, vec2, vec3, vec4, i); emitter->mLifeTime = temp8; JPABaseParticle* particle = emitter->createParticle(); if(particle) { - particle->mGlobalPosition = temp11; + particle->setOffsetPosition(vec5); } - - temp8 += temp7; } } @@ -154,15 +155,15 @@ void daBomb_c::draw_norm() { dComIfGd_setList(); } +/* 800D9950-800D9A48 .text draw_nut__8daBomb_cFv */ void daBomb_c::draw_nut() { - //entry calls are loading params in the wrong order if(chk_state(STATE_5) || chk_state(STATE_6)) { - mBck0.entry(mpModel->getModelData(), mBck0.getFrame()); - mBrk0.entry(mpModel->getModelData(), mBrk0.getFrame()); + mBck0.entry(mpModel->getModelData()); + mBrk0.entry(mpModel->getModelData()); } else { - mBck1.entry(mpModel->getModelData(), mBck1.getFrame()); - mBrk1.entry(mpModel->getModelData(), mBrk1.getFrame()); + mBck1.entry(mpModel->getModelData()); + mBrk1.entry(mpModel->getModelData()); } dComIfGd_setListP1(); @@ -358,7 +359,9 @@ bool daBomb_c::checkExplodeBg_norm() { return false; } +/* 800DA098-800DA1A4 .text checkExplodeBg_nut__8daBomb_cFv */ bool daBomb_c::checkExplodeBg_nut() { + /* Nonmatching - regalloc */ bool sink = chk_water_in(); bool burn = chk_lava_hit(); @@ -396,7 +399,9 @@ bool daBomb_c::checkExplodeBg_nut() { return ret; } +/* 800DA1A4-800DA284 .text checkExplodeBg_cannon__8daBomb_cFv */ bool daBomb_c::checkExplodeBg_cannon() { + /* Nonmatching - regalloc */ bool sink = chk_water_in(); bool burn = chk_lava_hit(); @@ -428,6 +433,7 @@ bool daBomb_c::checkExplodeBg_cannon() { return ret; } +/* 800DA284-800DA320 .text checkExplodeBg__8daBomb_cFv */ bool daBomb_c::checkExplodeBg() { typedef bool(daBomb_c::*checkFunc)(); static checkFunc proc[] = { @@ -439,7 +445,9 @@ bool daBomb_c::checkExplodeBg() { return (this->*proc[mType])(); } +/* 800DA320-800DA3A0 .text water_tention__8daBomb_cFv */ void daBomb_c::water_tention() { + /* Nonmatching - regalloc */ if(chk_water_in()) { if(field_0x554.y != -1.0e9f && field_0x554.z != -1.0e9f) { f32 temp; @@ -455,8 +463,10 @@ void daBomb_c::water_tention() { } } +/* 800DA3A0-800DA520 .text posMoveF__8daBomb_cFv */ void daBomb_c::posMoveF() { - u32 temp = mNoGravityTime > 0; + cM3dGPla* tri; + bool temp = mNoGravityTime > 0; f32 gravity; if(temp) { gravity = mGravity; @@ -470,7 +480,7 @@ void daBomb_c::posMoveF() { if(!chk_state(STATE_5) && !chk_state(STATE_6) && field_0x6F3 != 1) { water_tention(); - cM3dGPla* tri = dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd.GetBgIndex(), mAcch.m_gnd.GetPolyIndex()); + tri = dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd.GetBgIndex(), mAcch.m_gnd.GetPolyIndex()); f32 mag = mWindVec.getSquareMag(); if(mag > 0.01f) { @@ -545,10 +555,11 @@ bool daBomb_c::chk_dead_zone() { return mAcch.GetGroundH() == -1.0e9f && field_0x554.y == -1.0e9f && field_0x554.x == -1.0e9f; } +/* 800DA7CC-800DA8C8 .text bound__8daBomb_cFf */ void daBomb_c::bound(f32 param_1) { if(mAcch.ChkWallHit()) { speedF *= 0.8f; - current.angle.y = (mCir.GetWallAngleY() * 2) - (current.angle.y - 0x8000); //+ 0x10000 - 0x8000 generates the addis but seems fake + current.angle.y = (mCir.GetWallAngleY() * 2) - (current.angle.y + 0x8000); } if(mAcch.ChkGroundLanding()) { @@ -1131,7 +1142,7 @@ bool daBomb_c::bombDelete() { se_cannon_fly_stop(); if(mType == 1) { - dComIfG_resDelete(&mPhs, m_attrType[mType].resName); + dComIfG_resDelete(&mPhs, attrType().resName); } dKy_actor_addcol_set(0, 0, 0, 0.0f); @@ -1168,14 +1179,14 @@ int daBomb_c::create() { int status; if(mType == 1) { - status = dComIfG_resLoad(&mPhs, m_attrType[mType].resName); + status = dComIfG_resLoad(&mPhs, attrType().resName); } else { status = cPhs_COMPLEATE_e; } if(status == cPhs_COMPLEATE_e) { - if(fopAcM_entrySolidHeap(this, daBomb_createHeap, m_attrType[mType].heapSize)) { + if(fopAcM_entrySolidHeap(this, daBomb_createHeap, attrType().heapSize)) { create_init(); } else { @@ -1202,7 +1213,7 @@ void daBomb_c::create_init() { mAcch.Set(¤t.pos, &next.pos, this, 1, &mCir, &speed, ¤t.angle, &shape_angle); mAcch.ClrWaterNone(); mAcch.ClrRoofNone(); - mAcch.m_roof_height = 50.0f; + mAcch.m_roof_crr_height = 50.0f; mAcch.OnLineCheck(); field_0x554.setall(-1.0e9f); diff --git a/src/d/actor/d_a_bomb2.cpp b/src/d/actor/d_a_bomb2.cpp index 48f422312..0d33b15b1 100644 --- a/src/d/actor/d_a_bomb2.cpp +++ b/src/d/actor/d_a_bomb2.cpp @@ -11,42 +11,75 @@ #include "m_Do/m_Do_mtx.h" #include "d/d_com_inf_game.h" +// Needed for the .data section to match. +static f32 dummy1[3] = {1.0f, 1.0f, 1.0f}; +static f32 dummy2[3] = {1.0f, 1.0f, 1.0f}; + namespace daBomb2 { namespace { - struct AttrType { - const char* resName; - u32 heapSize; - s16 field_0x8; - s16 field_0xA; - f32 gravity; - f32 maxFallSpeed; - f32 field_0x14; - f32 field_0x18; - f32 field_0x1C; - f32 field_0x20; - f32 field_0x24; - f32 field_0x28; - f32 field_0x2C; - f32 field_0x30; - f32 field_0x34; - f32 field_0x38; - f32 field_0x3C; - f32 field_0x40; - f32 field_0x44; - f32 field_0x48; - f32 field_0x4C; - f32 field_0x50; - f32 field_0x54; - f32 field_0x58; - f32 field_0x5C; - f32 field_0x60; - f32 field_0x64; - f32 field_0x68; + struct Attr_c { + /* 0x00 */ const char* resName; + /* 0x04 */ u32 heapSize; + /* 0x08 */ s16 field_0x8; + /* 0x0A */ s16 field_0xA; + /* 0x0C */ f32 gravity; + /* 0x10 */ f32 maxFallSpeed; + /* 0x14 */ f32 field_0x14; + /* 0x18 */ f32 field_0x18; + /* 0x1C */ f32 field_0x1C; + /* 0x20 */ f32 field_0x20; + /* 0x24 */ f32 field_0x24; + /* 0x28 */ f32 field_0x28; + /* 0x2C */ f32 field_0x2C; + /* 0x30 */ f32 field_0x30; + /* 0x34 */ f32 field_0x34; + /* 0x38 */ f32 field_0x38; + /* 0x3C */ f32 field_0x3C; + /* 0x40 */ f32 field_0x40; + /* 0x44 */ f32 field_0x44; + /* 0x48 */ f32 field_0x48; + /* 0x4C */ f32 field_0x4C; + /* 0x50 */ f32 field_0x50; + /* 0x54 */ f32 field_0x54; + /* 0x58 */ f32 field_0x58; + /* 0x5C */ f32 field_0x5C; + /* 0x60 */ f32 field_0x60; + /* 0x64 */ f32 field_0x64; + /* 0x68 */ f32 field_0x68; }; - const AttrType L_attr = { - "VbakH", 0x920, 0x96, 0x1E, 2.9f, -100.0f, -0.6f, 19.5f, 13.0f, 0.1f, 0.5f, 20.0f, 25.0f, 0.002f, 0.0005f, 140.0f, 100.0f, 180.0f, 50.0f, 2.0f, 0.3f, 0.03f, 0.1f, 0.4f, 0.5f, -0.005f, 1.5f, 0.6f + const Attr_c L_attr = { + /* resName */ "VbakH", + /* heapSize */ 0x920, + /* field_0x8 */ 0x96, + /* field_0xA */ 0x1E, + /* gravity */ 2.9f, + /* maxFallSpeed */ -100.0f, + /* field_0x14 */ -0.6f, + /* field_0x18 */ 19.5f, + /* field_0x1C */ 13.0f, + /* field_0x20 */ 0.1f, + /* field_0x24 */ 0.5f, + /* field_0x28 */ 20.0f, + /* field_0x2C */ 25.0f, + /* field_0x30 */ 0.002f, + /* field_0x34 */ 0.0005f, + /* field_0x38 */ 140.0f, + /* field_0x3C */ 100.0f, + /* field_0x40 */ 180.0f, + /* field_0x44 */ 50.0f, + /* field_0x48 */ 2.0f, + /* field_0x4C */ 0.3f, + /* field_0x50 */ 0.03f, + /* field_0x54 */ 0.1f, + /* field_0x58 */ 0.4f, + /* field_0x5C */ 0.5f, + /* field_0x60 */ -0.005f, + /* field_0x64 */ 1.5f, + /* field_0x68 */ 0.6f, }; + + inline static const Attr_c& attr() { return L_attr; } } void Env_c::set(const cXyz& pos) { @@ -82,6 +115,7 @@ namespace daBomb2 { return field_0x4C > 1; } + /* 800DD4B0-800DD670 .text proc__Q27daBomb25Env_cFRC4cXyz */ void Env_c::proc(const cXyz& param_1) { camera_class* camera = dComIfGp_getCamera(0); f32 temp2 = 0.0f; @@ -93,7 +127,7 @@ namespace daBomb2 { if(temp < 1500.0f) { temp2 = 1.0f - (temp * (1.0f / 1500.0f)); } - temp2 *= field_0x50; // operand swap + temp2 = field_0x50 * temp2; dKy_actor_addcol_amb_set(200, 180, 100, temp2); dKy_bg_addcol_amb_set(180, 160, 60, temp2); @@ -101,15 +135,15 @@ namespace daBomb2 { switch(field_0x4C) { case 0: - cLib_addCalc(&field_0x50, 0.0f, 0.05f, 0.04f, 0.001f); - if(field_0x50 >= 0.01f) { + cLib_addCalc(&field_0x50, 1.0f, 0.5f, 0.4f, 0.01f); + if(field_0x50 >= 0.99f) { field_0x4C += 1; } break; case 1: - cLib_addCalc(&field_0x50, 0.0f, 0.05f, 0.04f, 0.01f); - if(field_0x50 <= 0.99f) { + cLib_addCalc(&field_0x50, 0.0f, 0.05f, 0.04f, 0.001f); + if(field_0x50 <= 0.01f) { field_0x4C += 1; } @@ -132,13 +166,52 @@ namespace daBomb2 { } /* 800DD6BC-800DD6C0 .text execute__Q27daBomb213FuseSmokeCB_cFP14JPABaseEmitter */ - void FuseSmokeCB_c::execute(JPABaseEmitter*) { - /* Nonmatching */ + void FuseSmokeCB_c::execute(JPABaseEmitter* emitter) { } /* 800DD6C0-800DDAE8 .text executeAfter__Q27daBomb213FuseSmokeCB_cFP14JPABaseEmitter */ - void FuseSmokeCB_c::executeAfter(JPABaseEmitter*) { - /* Nonmatching */ + void FuseSmokeCB_c::executeAfter(JPABaseEmitter* emitter) { + JGeometry::TVec3 vec1; + vec1.set(*field_0x0C); + JGeometry::TVec3 vec2; + vec2.set(*mpPos); + f32 f15 = attr().field_0x24; + emitter->setGlobalTranslation(vec2); + + s16 r29 = 10.0f + (0.5f * (20.0f - mpPos->abs(*field_0x0C))); + if (r29 < 0xA) { + r29 = 0xA; + } + emitter->setLifeTime(r29); + + JGeometry::TVec3 vec3; + vec3.z = f15 * (vec2.x - vec1.x); + vec3.y = f15 * (vec2.y - vec1.y); + vec3.x = f15 * (vec2.z - vec1.z); + + JGeometry::TVec3 vec4; + vec4.x = f15 * (vec1.x - field_0x10->x); + vec4.y = f15 * (vec1.y - field_0x10->y); + vec4.z = f15 * (vec1.z - field_0x10->z); + + f32 f0 = mpPos->abs(*field_0x0C) * attr().field_0x20; + if (f0 > 1.0f) { + f32 f20 = 1.0f / f0; + s16 r28 = f20 * (field_0x04 - r29); + s16 lifetime = r29 + r28; + for (f32 f19 = f20; f19 < 1.0f; f19 += f20, lifetime += r28) { + JGeometry::TVec3 vec5; + vec5.cubic(vec1, vec2, vec3, vec4, f19); + + emitter->setLifeTime(lifetime); + JPABaseParticle* particle = emitter->createParticle(); + if (particle) { + particle->setOffsetPosition(vec5); + } + } + } + + field_0x04 = r29; } /* 800DDAE8-800DDAEC .text draw__Q27daBomb213FuseSmokeCB_cFP14JPABaseEmitter */ @@ -189,18 +262,19 @@ namespace daBomb2 { return static_cast(i_this)->create_heap(); } + /* 800DDBAC-800DDD90 .text create_heap_nut__Q27daBomb25Act_cFv */ bool Act_c::create_heap_nut() { - const char* resName = L_attr.resName; + const char* resName = attr().resName; - J3DModelData* mdl_data = (J3DModelData*)dComIfG_getObjectRes(resName, 0xC); + J3DModelData* mdl_data = static_cast(dComIfG_getObjectRes(attr().resName, 0xC)); JUT_ASSERT(0x303, mdl_data != 0); mpModel = mDoExt_J3DModel__create(mdl_data, 0x80000, 0x11000022); - J3DAnmTransform* bck_data = (J3DAnmTransform*)dComIfG_getObjectRes(resName, 0x7); + J3DAnmTransform* bck_data = static_cast(dComIfG_getObjectRes(resName, 0x7)); JUT_ASSERT(0x30D, bck_data != 0); int temp = mBck0.init(mdl_data, bck_data, true, 0, 1.0f, 0, -1, false); - J3DAnmTevRegKey* brk_data = (J3DAnmTevRegKey*)dComIfG_getObjectRes(resName, 0x10); + J3DAnmTevRegKey* brk_data = static_cast(dComIfG_getObjectRes(resName, 0x10)); JUT_ASSERT(0x314, brk_data != 0); int temp3 = mBrk0.init(mdl_data, brk_data, true, 0, 1.0f, 0, -1, false, 0); @@ -226,7 +300,34 @@ namespace daBomb2 { field_0x528 = -1.0e9f; } - dCcD_SrcSph Act_c::M_sph_src = {}; + dCcD_SrcSph Act_c::M_sph_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ AT_TYPE_BOMB, + /* SrcObjAt Atp */ 0x04, + /* SrcObjAt SPrm */ 0x0E, + /* SrcObjTg Type */ ~(AT_TYPE_WATER | AT_TYPE_UNK20000 | AT_TYPE_UNK400000 | AT_TYPE_LIGHT), + /* SrcObjTg SPrm */ 0x09, + /* SrcObjCo SPrm */ 0x79, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0x01, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt GFlag */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg GFlag */ 0x02, + /* SrcGObjCo GFlag */ 0, + }, + // cM3dGSphS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 30.0f, + }, + }; void Act_c::cc_init() { mStts.Init(200, 0xFF, this); @@ -285,15 +386,15 @@ namespace daBomb2 { on_carry(); } - mGravity = L_attr.gravity; - mMaxFallSpeed = L_attr.maxFallSpeed; + mGravity = attr().gravity; + mMaxFallSpeed = attr().maxFallSpeed; bgCrrPos(); speed.y = 0.0f; speedF = 0.0f; current.pos = orig.pos; init_mtx(); - field_0x738 = L_attr.field_0x8; + field_0x738 = attr().field_0x8; field_0x740 = 0; field_0x741 = 0; field_0x742 = 0; @@ -306,10 +407,10 @@ namespace daBomb2 { int Act_c::_create() { fopAcM_SetupActor(this, Act_c); - int status = dComIfG_resLoad(&mPhs, L_attr.resName); + int status = dComIfG_resLoad(&mPhs, attr().resName); if(status == cPhs_COMPLEATE_e) { - if(fopAcM_entrySolidHeap(this, solidHeapCB, L_attr.heapSize)) { + if(fopAcM_entrySolidHeap(this, solidHeapCB, attr().heapSize)) { create_init(); } else { @@ -325,7 +426,7 @@ namespace daBomb2 { bool Act_c::_delete() { eff_fuse_end(); mEnv.clean(); - dComIfG_resDelete(&mPhs, L_attr.resName); + dComIfG_resDelete(&mPhs, attr().resName); return true; } @@ -413,19 +514,19 @@ namespace daBomb2 { void Act_c::bound(f32 param_1) { if(mAcch.ChkWallHit()) { speedF *= 0.8f; - current.angle.y = (mCir.GetWallAngleY() * 2) - (current.angle.y - 0x8000); //+ 0x10000 - 0x8000 generates the addis but seems fake + current.angle.y = (mCir.GetWallAngleY() * 2) - (current.angle.y + 0x8000); } if(mAcch.ChkGroundLanding()) { - daObj::make_land_effect(this, &mAcch.m_gnd, L_attr.field_0x68); - param_1 *= L_attr.field_0x14; - if(param_1 < L_attr.field_0x18) { + daObj::make_land_effect(this, &mAcch.m_gnd, attr().field_0x68); + param_1 *= attr().field_0x14; + if(param_1 < attr().field_0x18) { field_0x741 = 0; } else { speedF *= 0.9f; - if(param_1 > L_attr.field_0x1C) { - speed.y = L_attr.field_0x1C; + if(param_1 > attr().field_0x1C) { + speed.y = attr().field_0x1C; } else { speed.y = param_1; @@ -440,10 +541,10 @@ namespace daBomb2 { } void Act_c::set_nut_exp_interval() { - if(field_0x738 > L_attr.field_0xA) { - field_0x738 = L_attr.field_0xA; + if(field_0x738 > attr().field_0xA) { + field_0x738 = attr().field_0xA; - f32 frame = 0x87 - L_attr.field_0xA; + f32 frame = 0x87 - attr().field_0xA; mBck0.getFrameCtrl()->setFrame(frame); mBrk0.getFrameCtrl()->setFrame(frame); } @@ -585,7 +686,7 @@ namespace daBomb2 { if(mSph.ChkCoHit()) { - if(field_0x741 || speed.abs() > L_attr.field_0x2C) { + if(field_0x741 || speed.abs() > attr().field_0x2C) { explode = true; } @@ -631,13 +732,13 @@ namespace daBomb2 { ret = true; } else { - if(water && speed.abs() > L_attr.field_0x28) { + if(water && speed.abs() > attr().field_0x28) { eff_explode_water(); ret = true; } else if(temp1) { - if(field_0x741 || speed.abs() > L_attr.field_0x2C) { + if(field_0x741 || speed.abs() > attr().field_0x2C) { eff_fuse_start(); set_nut_exp_interval(); } @@ -666,7 +767,7 @@ namespace daBomb2 { bool water = chk_water_in(); bool ret = false; - if(water && speed.abs() <= L_attr.field_0x28) { + if(water && speed.abs() <= attr().field_0x28) { eff_water_splash(); ret = true; @@ -711,7 +812,7 @@ namespace daBomb2 { void Act_c::mode_wait_init() { field_0x694 = 0; - mGravity = L_attr.gravity; + mGravity = attr().gravity; mSph.OnCoSPrmBit(CO_SPRM_SET); } @@ -906,45 +1007,45 @@ namespace daBomb2 { void Act_c::tensor_wait_drop() { if(field_0x7A8 > 0) { - field_0x79C = speed.z * L_attr.field_0x60; - field_0x7A0 = speed.x * L_attr.field_0x60; + field_0x79C = speed.z * attr().field_0x60; + field_0x7A0 = speed.x * attr().field_0x60; } field_0x784 = 0.0f; field_0x788 = 0.0f; - field_0x7A4 = L_attr.field_0x54; + field_0x7A4 = attr().field_0x54; } void Act_c::tensor_wait_ground() { cM3dGPla* pNormal = dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd.GetBgIndex(), mAcch.m_gnd.GetPolyIndex()); if(pNormal) { - field_0x784 = pNormal->mNormal.z * L_attr.field_0x64; - field_0x788 = pNormal->mNormal.x * L_attr.field_0x64; + field_0x784 = pNormal->mNormal.z * attr().field_0x64; + field_0x788 = pNormal->mNormal.x * attr().field_0x64; } else { field_0x784 = 0.0f; field_0x788 = 0.0f; } - field_0x7A4 = L_attr.field_0x58; + field_0x7A4 = attr().field_0x58; } void Act_c::tensor_carry() { field_0x784 = 0.0f; field_0x788 = 0.0f; - field_0x7A4 = L_attr.field_0x58; + field_0x7A4 = attr().field_0x58; } void Act_c::tensor_explode() { field_0x784 = 0.0f; field_0x788 = 0.0f; - field_0x7A4 = L_attr.field_0x58; + field_0x7A4 = attr().field_0x58; } void Act_c::tensor_sink() { field_0x784 = 0.0f; field_0x788 = 0.0f; - field_0x7A4 = L_attr.field_0x58; + field_0x7A4 = attr().field_0x58; } void Act_c::tensor_proc_call() {