mirror of
https://github.com/zeldaret/tww.git
synced 2026-06-21 15:56:50 -04:00
some bomb/bomb2 matches, TVec3::cubic match
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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,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 */
|
||||
|
||||
@@ -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
@@ -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(¤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);
|
||||
|
||||
+175
-74
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user