some bomb/bomb2 matches, TVec3::cubic match

This commit is contained in:
LagoLunatic
2023-12-20 00:08:40 -05:00
parent 3b2fcca7d4
commit cfe547b37d
6 changed files with 274 additions and 133 deletions
+14
View File
@@ -289,6 +289,20 @@ struct TVec3<f32> {
};
return res;
}
template<typename S>
void cubic(const JGeometry::TVec3<f32>& vec1, const JGeometry::TVec3<f32>& vec2, const JGeometry::TVec3<f32>& vec3, const JGeometry::TVec3<f32>& 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 <typename T>
+22
View File
@@ -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<f32>& 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<f32>&) const {}
void getHeight() {}
void getLifeTime() const {}
void getLocalPosition(JGeometry::TVec3<f32>&) const {}
void getOffsetPosition(JGeometry::TVec3<f32>&) const {}
void getVelVec(JGeometry::TVec3<f32>&) const {}
void getWidth() {}
void initStatus(u32) {}
void isInvisibleParticle() {}
void setCallBackPtr(JPACallBackBase2<JPABaseEmitter*, JPABaseParticle*>*) {}
void setDeleteParticleFlag() {}
void setInvisibleParticleFlag() {}
void setStatus(u32) {}
public:
/* 0x00 */ JSULink<JPABaseParticle> mLink;
+9 -13
View File
@@ -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 */
+2 -5
View File
@@ -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);
+52 -41
View File
@@ -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<f32> vec1;
vec1.set(*field_0x0C);
JGeometry::TVec3<f32> 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<f>__Q29JGeometry8TVec3<f>FRCQ29JGeometry8TVec3<f>RCQ29JGeometry8TVec3<f>RCQ29JGeometry8TVec3<f>RCQ29JGeometry8TVec3<f>f
//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<f32> 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<f32> 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<f32> vec5;
vec5.cubic<f32>(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(&current.pos, &next.pos, this, 1, &mCir, &speed, &current.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);
+175 -74
View File
@@ -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<f32> vec1;
vec1.set(*field_0x0C);
JGeometry::TVec3<f32> 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<f32> vec3;
vec3.z = f15 * (vec2.x - vec1.x);
vec3.y = f15 * (vec2.y - vec1.y);
vec3.x = f15 * (vec2.z - vec1.z);
JGeometry::TVec3<f32> 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<f32> vec5;
vec5.cubic<f32>(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<Act_c*>(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<J3DModelData*>(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<J3DAnmTransform*>(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<J3DAnmTevRegKey*>(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() {