mirror of
https://github.com/zeldaret/tww.git
synced 2026-08-21 22:10:59 -04:00
d_a_steam_tag 100% (#690)
* d_a_steam_tag 100%
Added inline functions to `d_point_wind` that were referenced in this TU
* PR changes added
- Also removed an unused local variable, renamed another
- Seems my struct had one member too many so I removed the last one ('field_0x0F`) and resized `field_0x0E` accordingly
This commit is contained in:
+1
-1
@@ -1717,7 +1717,7 @@ config.libs = [
|
||||
ActorRel(NonMatching, "d_a_shutter"),
|
||||
ActorRel(NonMatching, "d_a_shutter2"),
|
||||
ActorRel(NonMatching, "d_a_st"),
|
||||
ActorRel(NonMatching, "d_a_steam_tag"),
|
||||
ActorRel(Matching, "d_a_steam_tag", extra_cflags=['-pragma "nosyminline on"']),
|
||||
ActorRel(Matching, "d_a_swattack", extra_cflags=['-pragma "nosyminline on"']),
|
||||
ActorRel(Matching, "d_a_switem", extra_cflags=['-pragma "nosyminline on"']),
|
||||
ActorRel(NonMatching, "d_a_swpropeller"),
|
||||
|
||||
@@ -3,29 +3,46 @@
|
||||
|
||||
#include "f_op/f_op_actor.h"
|
||||
#include "d/d_cc_d.h"
|
||||
#include "d/d_particle.h"
|
||||
#include "d/d_point_wind.h"
|
||||
#include "f_op/f_op_actor_mng.h"
|
||||
|
||||
class JPABaseEmitter;
|
||||
|
||||
struct daSteamTag_mData {
|
||||
/* 0x00 */ s16 field_0x00;
|
||||
/* 0x02 */ s16 field_0x02;
|
||||
/* 0x04 */ s16 create_time_range;
|
||||
/* 0x06 */ s16 create_time_min;
|
||||
/* 0x08 */ s16 emit_time_min;
|
||||
/* 0x0A */ s16 emit_time_range;
|
||||
/* 0x0C */ u8 steam_alpha;
|
||||
/* 0x0D */ u8 field_0x0D;
|
||||
/* 0x0E */ s16 field_0x0E;
|
||||
};
|
||||
|
||||
class daSteamTag_c : public fopAc_ac_c {
|
||||
public:
|
||||
~daSteamTag_c();
|
||||
inline s32 create();
|
||||
inline BOOL draw();
|
||||
inline BOOL execute();
|
||||
|
||||
void getData();
|
||||
void CreateInit();
|
||||
void createEmitter();
|
||||
void endEmitter();
|
||||
const daSteamTag_mData* getData();
|
||||
s32 CreateInit();
|
||||
BOOL createEmitter();
|
||||
bool endEmitter();
|
||||
|
||||
static void init();
|
||||
|
||||
static daSteamTag_mData mData;
|
||||
|
||||
public:
|
||||
/* 0x290 */ JPABaseEmitter* mpEmitter;
|
||||
/* 0x294 */ u8 m294[0x296 - 0x294];
|
||||
/* 0x296 */ s16 mEmitTimer;
|
||||
/* 0x298 */ s16 mCreateTimer;
|
||||
/* 0x29A */ u8 m29A[0x29B - 0x29A];
|
||||
/* 0x29A */ u8 m29A;
|
||||
/* 0x29B */ u8 m29B;
|
||||
/* 0x29C */ dCcD_Stts mGStts;
|
||||
/* 0x2D8 */ dCcD_Cyl mCyl;
|
||||
@@ -37,4 +54,8 @@ public:
|
||||
static u8 mEmitterNum;
|
||||
};
|
||||
|
||||
namespace daSteamTag_prm {
|
||||
inline u8 getSchBit(daSteamTag_c* item) { return (fopAcM_GetParam(item) >> 2) & 0xFF; }
|
||||
};
|
||||
|
||||
#endif /* D_A_STEAM_TAG_H */
|
||||
|
||||
@@ -10,8 +10,10 @@ public:
|
||||
WIND_INFLUENCE mWind;
|
||||
|
||||
void set_pwind_init(cM3dGCpsS * pCps);
|
||||
void set_pwind_power(float windStrength){ mWind.mStrength = windStrength; }
|
||||
float get_pwind_power_p(){ return mWind.mStrength; }
|
||||
void set_pwind_move();
|
||||
void set_pwind_delete();
|
||||
};
|
||||
|
||||
#endif /* D_POINT_WIND_H */
|
||||
#endif /* D_POINT_WIND_H */
|
||||
|
||||
+177
-17
@@ -4,56 +4,216 @@
|
||||
//
|
||||
|
||||
#include "d/actor/d_a_steam_tag.h"
|
||||
#include "JSystem/J3DGraphBase/J3DSys.h"
|
||||
#include "JSystem/JParticle/JPAEmitter.h"
|
||||
#include "d/d_cc_d.h"
|
||||
#include "d/d_com_inf_game.h"
|
||||
#include "d/d_item.h"
|
||||
#include "d/d_item_data.h"
|
||||
#include "d/d_procname.h"
|
||||
#include "dolphin/mtx/vec.h"
|
||||
|
||||
static dCcD_SrcCps l_cps_src = {
|
||||
// dCcD_SrcGObjInf
|
||||
{
|
||||
/* Flags */ 0,
|
||||
/* SrcObjAt Type */ AT_TYPE_WIND,
|
||||
/* SrcObjAt Atp */ 0,
|
||||
/* SrcObjAt SPrm */ cCcD_AtSPrm_Set_e | cCcD_AtSPrm_GrpAll_e,
|
||||
/* SrcObjTg Type */ 0,
|
||||
/* SrcObjTg SPrm */ 0,
|
||||
/* SrcObjCo SPrm */ 0,
|
||||
/* SrcGObjAt Se */ 0,
|
||||
/* SrcGObjAt HitMark */ 0,
|
||||
/* SrcGObjAt Spl */ 0,
|
||||
/* SrcGObjAt Mtrl */ 0,
|
||||
/* SrcGObjAt SPrm */ dCcG_AtSPrm_NoHitMark_e,
|
||||
/* SrcGObjTg Se */ 0,
|
||||
/* SrcGObjTg HitMark */ 0,
|
||||
/* SrcGObjTg Spl */ 0,
|
||||
/* SrcGObjTg Mtrl */ 0,
|
||||
/* SrcGObjTg SPrm */ dCcG_TgSPrm_NoHitMark_e,
|
||||
/* SrcGObjCo SPrm */ 0,
|
||||
},
|
||||
// cM3dGCpsS
|
||||
{
|
||||
/* Start */ 0.0f, 0.0f, 0.0f,
|
||||
/* End */ 0.0f, 0.0f, 0.0f,
|
||||
/* Radius */ 200.0f,
|
||||
},
|
||||
};
|
||||
|
||||
daSteamTag_mData daSteamTag_c::mData = {
|
||||
/* field_0x00 */ 0x3DF5,
|
||||
/* field_0x02 */ 0xC28F,
|
||||
/* create_time_range */ 300,
|
||||
/* create_time_min */ 100,
|
||||
/* emit_time_min */ 50,
|
||||
/* emit_time_range */ 150,
|
||||
/* steam_alpha */ 0xB4,
|
||||
/* field_0x0D */ 0x00,
|
||||
/* field_0x0E */ 0x0000,
|
||||
};
|
||||
|
||||
/* 00000078-00000084 .text getData__12daSteamTag_cFv */
|
||||
void daSteamTag_c::getData() {
|
||||
/* Nonmatching */
|
||||
const daSteamTag_mData* daSteamTag_c::getData() {
|
||||
return &daSteamTag_c::mData;
|
||||
}
|
||||
|
||||
/* 00000084-0000029C .text CreateInit__12daSteamTag_cFv */
|
||||
void daSteamTag_c::CreateInit() {
|
||||
/* Nonmatching */
|
||||
s32 daSteamTag_c::CreateInit() {
|
||||
m29B = daSteamTag_prm::getSchBit(this);
|
||||
mEmitTimer = getData()->emit_time_min + cM_rndF(getData()->emit_time_range);
|
||||
mCreateTimer = cM_rndF(getData()->create_time_range);;
|
||||
mpEmitter = NULL;
|
||||
mEmitTimer = 0;
|
||||
mGStts.Init(0xFF,0xFF,this);
|
||||
mCps.Set(l_cps_src);
|
||||
mCps.SetStts(&mGStts);
|
||||
mPntWindCpsS.mStart.x = current.pos.x;
|
||||
mPntWindCpsS.mStart.y = current.pos.y;
|
||||
mPntWindCpsS.mStart.z = current.pos.z;
|
||||
mDoMtx_stack_c::transS(current.pos);
|
||||
mDoMtx_stack_c::ZXYrotM(current.angle);
|
||||
float windY = 200.0f;
|
||||
if (current.angle.x != 0) {
|
||||
windY = 50.0f;
|
||||
}
|
||||
mDoMtx_stack_c::transM(0.0f, windY, 0.0f);
|
||||
mDoMtx_stack_c::multVec(&cXyz::Zero, &mPntWindCpsS.mEnd);
|
||||
mPntWindCpsS.mRadius = 50.0;
|
||||
mCps.cM3dGCps::Set(mPntWindCpsS);
|
||||
mCps.CalcAtVec();
|
||||
mPointWind.set_pwind_init(&mPntWindCpsS);
|
||||
fopAcM_offDraw(this);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* 0000029C-00000398 .text createEmitter__12daSteamTag_cFv */
|
||||
void daSteamTag_c::createEmitter() {
|
||||
/* Nonmatching */
|
||||
BOOL daSteamTag_c::createEmitter() {
|
||||
if (mEmitterNum < 8) {
|
||||
u16 particleID;
|
||||
if (((s16)cM_rndF(100.0f) % 2) != 0) {
|
||||
particleID = 0x808B;
|
||||
} else {
|
||||
particleID = 0x808C;
|
||||
}
|
||||
mpEmitter = dComIfGp_particle_setToon(particleID, ¤t.pos, ¤t.angle, &scale, getData()->steam_alpha);
|
||||
if (mpEmitter) {
|
||||
mEmitterNum++;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* 00000398-000003B4 .text endEmitter__12daSteamTag_cFv */
|
||||
void daSteamTag_c::endEmitter() {
|
||||
/* Nonmatching */
|
||||
bool daSteamTag_c::endEmitter() {
|
||||
mEmitterNum--;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* 000003B4-000003BC .text daSteamTag_Draw__FP12daSteamTag_c */
|
||||
static BOOL daSteamTag_Draw(daSteamTag_c*) {
|
||||
/* Nonmatching */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* 000003BC-000003DC .text daSteamTag_Execute__FP12daSteamTag_c */
|
||||
static BOOL daSteamTag_Execute(daSteamTag_c*) {
|
||||
/* Nonmatching */
|
||||
static BOOL daSteamTag_Execute(daSteamTag_c* i_this) {
|
||||
return ((daSteamTag_c*)i_this)->execute();
|
||||
}
|
||||
|
||||
/* 000003DC-000006FC .text execute__12daSteamTag_cFv */
|
||||
BOOL daSteamTag_c::execute() {
|
||||
/* Nonmatching */
|
||||
float windStrength;
|
||||
if ((mEmitTimer == 0) && (mCreateTimer > 0)) {
|
||||
mCreateTimer--;
|
||||
if (mCreateTimer == 0) {
|
||||
if (createEmitter()) {
|
||||
JGeometry::TVec3<s16> angle;
|
||||
angle.x = current.angle.x;
|
||||
angle.y = current.angle.y;
|
||||
angle.z = current.angle.z;
|
||||
mpEmitter->setGlobalTranslation(current.pos);
|
||||
mpEmitter->setGlobalRotation(angle);
|
||||
mpEmitter->setGlobalAlpha(getData()->steam_alpha);
|
||||
mpEmitter->playCreateParticle();
|
||||
mEmitTimer = getData()->emit_time_min + cM_rndF(getData()->emit_time_range);
|
||||
}
|
||||
else {
|
||||
mCreateTimer = 0x1e;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ((mCreateTimer == 0) && (mEmitTimer > 0)) {
|
||||
mEmitTimer--;
|
||||
if (mEmitTimer == 0) {
|
||||
if (mpEmitter != NULL) {
|
||||
windStrength = 0.0f;
|
||||
mpEmitter->stopCreateParticle();
|
||||
if (mpEmitter->getParticleNumber() == 0) {
|
||||
mpEmitter->becomeInvalidEmitter();
|
||||
endEmitter();
|
||||
mpEmitter = NULL;
|
||||
mCreateTimer = getData()->create_time_min + cM_rndF(getData()->create_time_range);
|
||||
}
|
||||
else {
|
||||
mEmitTimer = 1;
|
||||
windStrength = 1.0f;
|
||||
}
|
||||
mPointWind.set_pwind_power(windStrength);
|
||||
}
|
||||
}
|
||||
else {
|
||||
fopAcM_seStart(this, JA_SE_OBJ_STEAM, 0);
|
||||
if (mpEmitter != NULL) {
|
||||
mpEmitter->setGlobalAlpha(getData()->steam_alpha);
|
||||
}
|
||||
mCps.cM3dGCps::Set(mPntWindCpsS);
|
||||
dComIfG_Ccsp()->Set(&mCps);
|
||||
mPointWind.set_pwind_move();
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* 000006FC-00000704 .text daSteamTag_IsDelete__FP12daSteamTag_c */
|
||||
static BOOL daSteamTag_IsDelete(daSteamTag_c*) {
|
||||
/* Nonmatching */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* 00000704-0000072C .text daSteamTag_Delete__FP12daSteamTag_c */
|
||||
static BOOL daSteamTag_Delete(daSteamTag_c*) {
|
||||
/* Nonmatching */
|
||||
static BOOL daSteamTag_Delete(daSteamTag_c* i_this) {
|
||||
((daSteamTag_c*)i_this)->~daSteamTag_c();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
daSteamTag_c::~daSteamTag_c() {
|
||||
if (mpEmitter != NULL) {
|
||||
mpEmitter->becomeInvalidEmitter();
|
||||
mpEmitter = NULL;
|
||||
}
|
||||
mPointWind.set_pwind_delete();
|
||||
return;
|
||||
}
|
||||
|
||||
s32 daSteamTag_c::create() {
|
||||
int phase_state;
|
||||
fopAcM_SetupActor(this, daSteamTag_c);
|
||||
CreateInit();
|
||||
if ((strcmp(dComIfGp_getStartStageName(),"Adanmae") == 0) &&
|
||||
(current.roomNo == 0) &&
|
||||
(checkItemGet(dItem_PEARL_DIN_e, TRUE))) {
|
||||
phase_state = cPhs_ERROR_e;
|
||||
} else {
|
||||
phase_state = cPhs_COMPLEATE_e;
|
||||
}
|
||||
return phase_state;
|
||||
}
|
||||
|
||||
/* 00000930-00000AD0 .text daSteamTag_Create__FP10fopAc_ac_c */
|
||||
static s32 daSteamTag_Create(fopAc_ac_c*) {
|
||||
/* Nonmatching */
|
||||
static s32 daSteamTag_Create(fopAc_ac_c* i_this) {
|
||||
return ((daSteamTag_c*)i_this)->create();
|
||||
}
|
||||
|
||||
static actor_method_class l_daSteamTag_Method = {
|
||||
|
||||
Reference in New Issue
Block a user