summaryrefslogtreecommitdiff
path: root/include/JSystem
diff options
context:
space:
mode:
authorTakaRikka <38417346+TakaRikka@users.noreply.github.com>2021-12-31 06:35:39 -0800
committerGitHub <noreply@github.com>2021-12-31 06:35:39 -0800
commitb8573fe911dd1c55f599cbf8e9035d2bb5c3c767 (patch)
tree593b330c4d699015759e62fb7b42c0fb10fe1e96 /include/JSystem
parentacd2622e293e4d104a368abb6279a213c91a2106 (diff)
parent343f65d665a5f59d410feba7a1fe9a582ac4090c (diff)
Merge pull request #170 from magcius/jpa3
JPAExtraShape
Diffstat (limited to 'include/JSystem')
-rw-r--r--include/JSystem/J3DGraphBase/J3DShape.h11
-rw-r--r--include/JSystem/JGeometry.h16
-rw-r--r--include/JSystem/JMath/JMATrigonometric.h11
-rw-r--r--include/JSystem/JParticle/JPABaseShape.h103
-rw-r--r--include/JSystem/JParticle/JPAChildShape.h38
-rw-r--r--include/JSystem/JParticle/JPADynamicsBlock.h18
-rw-r--r--include/JSystem/JParticle/JPAExtraShape.h67
-rw-r--r--include/JSystem/JParticle/JPAParticle.h52
-rw-r--r--include/JSystem/JParticle/JPAResource.h2
9 files changed, 306 insertions, 12 deletions
diff --git a/include/JSystem/J3DGraphBase/J3DShape.h b/include/JSystem/J3DGraphBase/J3DShape.h
index 1fd8e7c56c..b0576077c0 100644
--- a/include/JSystem/J3DGraphBase/J3DShape.h
+++ b/include/JSystem/J3DGraphBase/J3DShape.h
@@ -24,10 +24,11 @@ class J3DVertexData;
class J3DDrawMtxData;
enum J3DShpFlag {
+ J3DShpFlag_Visible = 0x0001,
J3DShpFlag_SkinPosCpu = 0x0004,
J3DShpFlag_SkinNrmCpu = 0x0008,
- J3DShpFlag_Hidden = 0x0010,
- J3DShpFlag_EnableLod = 0x0100,
+ J3DShpFlag_Hidden = 0x0010,
+ J3DShpFlag_EnableLod = 0x0100,
};
class J3DShape {
@@ -56,8 +57,8 @@ public:
void setVertexDataPointer(J3DVertexData* pVtxData) { mVertexData = pVtxData; }
void* getVcdVatCmd() const { return mVcdVatCmd; }
void setVcdVatCmd(void* pVatCmd) { mVcdVatCmd = pVatCmd; }
- void show() { offFlag(1); }
- void hide() { onFlag(1); }
+ void show() { offFlag(J3DShpFlag_Visible); }
+ void hide() { onFlag(J3DShpFlag_Visible); }
void setCurrentViewNoPtr(u32* pViewNoPtr) { mCurrentViewNo = pViewNoPtr; }
void setScaleFlagArray(u8* pScaleFlagArray) { mScaleFlagArray = pScaleFlagArray; }
void setDrawMtx(Mtx** pDrawMtx) { mDrawMtx = pDrawMtx; }
@@ -66,7 +67,7 @@ public:
u32 getBumpMtxOffset() const { return mBumpMtxOffset; }
inline J3DMaterial* getMaterial() const { return mMaterial; }
- inline u32 getPipeline() const { return (mFlags >> 2) & 7; }
+ inline u32 getPipeline() const { return (mFlags >> 2) & 0x07; }
inline u32 getTexMtxLoadType() const { return mFlags & 0xF000; }
static void resetVcdVatCache() { sOldVcdVatCmd = NULL; }
diff --git a/include/JSystem/JGeometry.h b/include/JSystem/JGeometry.h
index fc2d86cd9b..a4c0ca50ed 100644
--- a/include/JSystem/JGeometry.h
+++ b/include/JSystem/JGeometry.h
@@ -33,6 +33,22 @@ struct TVec3<f32> {
y = other.y;
z = other.z;
}
+
+ void set(f32 x_, f32 y_, f32 z_) {
+ x = x_;
+ y = y_;
+ z = z_;
+ }
+
+ void zero() {
+ x = y = z = 0.0f;
+ }
+
+ void mul(const TVec3<f32>& a, const TVec3<f32>& b) {
+ x = a.x * b.x;
+ y = a.y * b.y;
+ z = a.z * b.z;
+ }
};
template <typename T>
diff --git a/include/JSystem/JMath/JMATrigonometric.h b/include/JSystem/JMath/JMATrigonometric.h
index 79d3798ed2..a01b717ca8 100644
--- a/include/JSystem/JMath/JMATrigonometric.h
+++ b/include/JSystem/JMath/JMATrigonometric.h
@@ -17,6 +17,9 @@ struct pair {
struct TSinCosTable {
std::pair<f32, f32> table[0x2000];
+
+ f32 sinShort(s16 v) const { return table[static_cast<u16>(v) >> 3].a1; }
+ f32 cosShort(s16 v) const { return table[static_cast<u16>(v) >> 3].b1; }
};
struct TAtanTable {
@@ -35,4 +38,12 @@ extern TAtanTable atanTable_;
extern TAsinAcosTable asinAcosTable_;
}; // namespace JMath
+inline f32 JMASSin(s16 s) {
+ return JMath::sincosTable_.sinShort(s);
+}
+
+inline f32 JMASCos(s16 s) {
+ return JMath::sincosTable_.cosShort(s);
+}
+
#endif /* JMATRIGONOMETRIC_H */
diff --git a/include/JSystem/JParticle/JPABaseShape.h b/include/JSystem/JParticle/JPABaseShape.h
index 0e7192f083..a081b0c916 100644
--- a/include/JSystem/JParticle/JPABaseShape.h
+++ b/include/JSystem/JParticle/JPABaseShape.h
@@ -2,5 +2,108 @@
#define JPABASESHAPE_H
#include "dolphin/types.h"
+#include "dolphin/gx/GX.h"
+
+class JPAEmitterWorkData;
+class JKRHeap;
+
+struct JPABaseShapeData {
+ // Common header.
+ /* 0x00 */ u8 mMagic[4];
+ /* 0x04 */ u32 mSize;
+
+ /* 0x08 */ u32 mFlags;
+ /* 0x0C */ s16 mClrPrmAnmOffset;
+ /* 0x0E */ s16 mClrEnvAnmOffset;
+ /* 0x10 */ f32 mBaseSizeX;
+ /* 0x14 */ f32 mBaseSizeY;
+ /* 0x18 */ u16 mBlendModeCfg;
+ /* 0x1A */ u8 mAlphaCompareCfg;
+ /* 0x1B */ u8 mAlphaRef0;
+ /* 0x1C */ u8 mAlphaRef1;
+ /* 0x1D */ u8 mZModeCfg;
+ /* 0x1E */ u8 mTexFlg;
+ /* 0x1F */ u8 mTexAnmNum;
+ /* 0x20 */ u8 mTexIdx;
+ /* 0x21 */ u8 mClrFlg;
+ /* 0x22 */ u8 mClrPrmKeyNum;
+ /* 0x23 */ u8 mClrEnvKeyNum;
+ /* 0x24 */ s16 mClrAnmFrmMax;
+ /* 0x26 */ GXColor mClrPrm;
+ /* 0x2A */ GXColor mClrEnv;
+ /* 0x2E */ u8 mAnmRndm;
+ /* 0x2F */ u8 mClrAnmRndmMask;
+ /* 0x30 */ u8 mTexAnmRndmMask;
+};
+
+struct JPABaseShape {
+public:
+ /* 8027A6DC */ JPABaseShape(u8 const*, JKRHeap*);
+ /* 8027A7E8 */ void setGX(JPAEmitterWorkData*) const;
+
+ static GXBlendMode st_bm[3];
+ static GXBlendFactor st_bf[10];
+ static GXLogicOp st_lo[16];
+ static GXCompare st_c[8];
+ static GXAlphaOp st_ao[4];
+ static GXTevColorArg st_ca[6][4];
+ static GXTevAlphaArg st_aa[2][4];
+
+ GXBlendMode getBlendMode() const { return st_bm[mpData->mBlendModeCfg & 0x03]; }
+ GXBlendFactor getBlendSrc() const { return st_bf[(mpData->mBlendModeCfg >> 2) & 0x0F]; }
+ GXBlendFactor getBlendDst() const { return st_bf[(mpData->mBlendModeCfg >> 6) & 0x0F]; }
+ GXLogicOp getLogicOp() const { return st_lo[(mpData->mBlendModeCfg >> 10) & 0x0F]; }
+ GXBool getZCompLoc() const { return (GXBool)((mpData->mZModeCfg >> 5) & 0x01); }
+
+ GXBool getZEnable() const { return (GXBool)(mpData->mZModeCfg & 0x01); }
+ GXCompare getZCmp() const { return st_c[(mpData->mZModeCfg >> 1) & 0x07]; }
+ GXBool getZUpd() const { return (GXBool)((mpData->mZModeCfg >> 4) & 0x01); }
+
+ GXCompare getAlphaCmp0() const { return st_c[mpData->mAlphaCompareCfg & 0x07]; }
+ u8 getAlphaRef0() const { return mpData->mAlphaRef0; }
+ GXAlphaOp getAlphaOp() const { return st_ao[(mpData->mAlphaCompareCfg >> 3) & 0x03]; }
+ GXCompare getAlphaCmp1() const { return st_c[(mpData->mAlphaCompareCfg >> 5) & 0x07]; }
+ u8 getAlphaRef1() const { return mpData->mAlphaRef1; }
+
+ const GXTevColorArg* getTevColorArg() const { return st_ca[(mpData->mFlags >> 0x0F) & 0x07]; }
+ const GXTevAlphaArg* getTevAlphaArg() const { return st_aa[(mpData->mFlags >> 0x12) & 0x01]; }
+
+ u32 getType() const { return (mpData->mFlags >> 0) & 0x0F; }
+ u32 getDirType() const { return (mpData->mFlags >> 4) & 0x07; }
+ u32 getRotType() const { return (mpData->mFlags >> 7) & 0x07; }
+ u32 getBasePlaneType() const { return (mpData->mFlags >> 10) & 0x07; }
+ u32 getTilingS() const { return (mpData->mFlags >> 25) & 0x01; }
+ u32 getTilingT() const { return (mpData->mFlags >> 26) & 0x01; }
+ bool isGlblClrAnm() const { return !!(mpData->mFlags & 0x00001000); }
+ bool isGlblTexAnm() const { return !!(mpData->mFlags & 0x00004000); }
+ bool isPrjTex() const { return !!(mpData->mFlags & 0x00100000); }
+ bool isDrawFwdAhead() const { return !!(mpData->mFlags & 0x00200000); }
+ bool isDrawPrntAhead() const { return !!(mpData->mFlags & 0x00400000); }
+ bool isClipOn() const { return !!(mpData->mFlags & 0x00800000); }
+ bool isTexCrdAnm() const { return !!(mpData->mFlags & 0x01000000); }
+ bool isNoDrawParent() const { return !!(mpData->mFlags & 0x08000000); }
+ bool isNoDrawChild() const { return !!(mpData->mFlags & 0x10000000); }
+
+ bool isPrmAnm() const { return !!(mpData->mClrFlg & 0x02); }
+ bool isEnvAnm() const { return !!(mpData->mClrFlg & 0x08); }
+ u8 getClrAnmType() const { return (mpData->mClrFlg >> 4) & 0x07; }
+ s16 getClrAnmMaxFrm() const { return mpData->mClrAnmFrmMax; }
+ void getPrmClr(s16 idx, GXColor* dst) { *dst = mpPrmClrAnmTbl[idx]; }
+ void getEnvClr(s16 idx, GXColor* dst) { *dst = mpEnvClrAnmTbl[idx]; }
+
+ bool isTexAnm() const { return !!(mpData->mTexFlg & 0x01); }
+ u8 getTexAnmType() const { return (mpData->mTexFlg >> 2) & 0x07; }
+ u32 getTexIdx() const { return mpData->mTexIdx; }
+
+ f32 getBaseSizeX() const { return mpData->mBaseSizeX; }
+ f32 getBaseSizeY() const { return mpData->mBaseSizeY; }
+
+public:
+ /* 0x00 */ const JPABaseShapeData* mpData;
+ /* 0x04 */ const void* mpTexCrdMtxAnmTbl;
+ /* 0x08 */ const u8* mpTexIdxAnimTbl;
+ /* 0x0C */ GXColor* mpPrmClrAnmTbl;
+ /* 0x10 */ GXColor* mpEnvClrAnmTbl;
+};
#endif /* JPABASESHAPE_H */
diff --git a/include/JSystem/JParticle/JPAChildShape.h b/include/JSystem/JParticle/JPAChildShape.h
index f5ef5fa60e..5f6edf0d30 100644
--- a/include/JSystem/JParticle/JPAChildShape.h
+++ b/include/JSystem/JParticle/JPAChildShape.h
@@ -2,5 +2,43 @@
#define JPACHILDSHAPE_H
#include "dolphin/types.h"
+#include "dolphin/gx/GX.h"
+
+struct JPAChildShapeData {
+ // Common header.
+ /* 0x00 */ u8 mMagic[4];
+ /* 0x04 */ u32 mSize;
+
+ /* 0x08 */ u32 mFlags;
+ /* 0x0C */ f32 mPosRndm;
+ /* 0x10 */ f32 mBaseVel;
+ /* 0x14 */ f32 mBaseVelRndm;
+ /* 0x18 */ f32 mVelInfRate;
+ /* 0x1C */ f32 mGravity;
+ /* 0x20 */ f32 mScaleX;
+ /* 0x24 */ f32 mScaleY;
+ /* 0x28 */ f32 mInheritScale;
+ /* 0x2C */ f32 mInheritAlpha;
+ /* 0x30 */ f32 mInheritRGB;
+ /* 0x34 */ GXColor mPrmClr;
+ /* 0x38 */ GXColor mEnvClr;
+ /* 0x3C */ f32 mTiming;
+ /* 0x40 */ s16 mLife;
+ /* 0x42 */ s16 mRate;
+ /* 0x44 */ u8 mStep;
+ /* 0x45 */ u8 mTexIdx;
+ /* 0x46 */ s16 mRotSpeed;
+};
+
+class JPAChildShape {
+public:
+ /* 8027B038 */ JPAChildShape(u8 const*);
+
+ void getPrmClr(GXColor* dst) { *dst = mpData->mPrmClr; }
+ void getEnvClr(GXColor* dst) { *dst = mpData->mEnvClr; }
+
+public:
+ /* 0x00 */ const JPAChildShapeData* mpData;
+};
#endif /* JPACHILDSHAPE_H */
diff --git a/include/JSystem/JParticle/JPADynamicsBlock.h b/include/JSystem/JParticle/JPADynamicsBlock.h
index aa424f49a9..8b3e441c19 100644
--- a/include/JSystem/JParticle/JPADynamicsBlock.h
+++ b/include/JSystem/JParticle/JPADynamicsBlock.h
@@ -35,13 +35,21 @@ struct JPADynamicsBlockData {
/* 0x70 */ s16 mStartFrame;
/* 0x72 */ s16 mLifeTime;
/* 0x74 */ s16 mVolumeSize;
- /* 0x76 */ s16 mDivNumber;
+ /* 0x76 */ u16 mDivNumber;
/* 0x78 */ u8 mRateStep;
/* 0x7C */ u32 field_0x7c;
};
typedef void (*JPADynamicsCalcVolumeFunc)(JPAEmitterWorkData*);
+enum {
+ JPADynFlag_FixedDensity = 0x01,
+ JPADynFlag_FixedInterval = 0x02,
+ JPADynFlag_InheritScale = 0x04,
+ JPADynFlag_FollowEmtr = 0x08,
+ JPADynFlag_FollowEmtrChld = 0x10,
+};
+
class JPADynamicsBlock {
public:
/* 8027BB18 */ JPADynamicsBlock(u8 const*);
@@ -52,10 +60,14 @@ public:
s16 getStartFrame() const { return mpData->mStartFrame; }
u32 getResUserWork() const { return mpData->mResUserWork; }
+ u32 getFlag() const { return mpData->mFlags; }
+ u32 getVolumeType() const { return (mpData->mFlags >> 8) & 0x07; }
+ u16 getDivNumber() const { return mpData->mDivNumber; }
+ f32 getRateRndm() const { return mpData->mRateRndm; }
public:
- JPADynamicsBlockData* mpData;
- JPADynamicsCalcVolumeFunc mpCalcVolumeFunc;
+ /* 0x00 */ const JPADynamicsBlockData* mpData;
+ /* 0x04 */ JPADynamicsCalcVolumeFunc mpCalcVolumeFunc;
};
#endif /* JPADYNAMICSBLOCK_H */
diff --git a/include/JSystem/JParticle/JPAExtraShape.h b/include/JSystem/JParticle/JPAExtraShape.h
index abdcdd0b4d..0df0e57436 100644
--- a/include/JSystem/JParticle/JPAExtraShape.h
+++ b/include/JSystem/JParticle/JPAExtraShape.h
@@ -3,4 +3,71 @@
#include "dolphin/types.h"
+struct JPAExtraShapeData {
+ // Common header.
+ /* 0x00 */ u8 mMagic[4];
+ /* 0x04 */ u32 mSize;
+
+ /* 0x08 */ u32 mFlags;
+ /* 0x0C */ f32 mScaleInTiming;
+ /* 0x10 */ f32 mScaleOutTiming;
+ /* 0x14 */ f32 mScaleInValueX;
+ /* 0x18 */ f32 mScaleOutValueX;
+ /* 0x1C */ f32 mScaleInValueY;
+ /* 0x20 */ f32 mScaleOutValueY;
+ /* 0x24 */ f32 mScaleOutRandom;
+ /* 0x28 */ s16 mScaleAnmCycleX;
+ /* 0x2A */ s16 mScaleAnmCycleY;
+ /* 0x2C */ f32 mAlphaInTiming;
+ /* 0x30 */ f32 mAlphaOutTiming;
+ /* 0x34 */ f32 mAlphaInValue;
+ /* 0x38 */ f32 mAlphaBaseValue;
+ /* 0x3C */ f32 mAlphaOutValue;
+ /* 0x40 */ f32 mAlphaWaveFrequency;
+ /* 0x44 */ f32 mAlphaWaveRandom;
+ /* 0x48 */ f32 mAlphaWaveAmplitude;
+ /* 0x4C */ f32 mRotateAngle;
+ /* 0x50 */ f32 mRotateAngleRandom;
+ /* 0x54 */ f32 mRotateSpeed;
+ /* 0x58 */ f32 mRotateSpeedRandom;
+ /* 0x5C */ f32 mRotateDirection;
+};
+
+class JPAExtraShape {
+public:
+ /* 8027AD88 */ JPAExtraShape(u8 const*);
+ /* 8027ADBC */ void init();
+
+ f32 getScaleInTiming() const { return mpData->mScaleInTiming; }
+ f32 getScaleOutTiming() const { return mpData->mScaleOutTiming; }
+ f32 getScaleInValueX() const { return mpData->mScaleInValueX; }
+ f32 getScaleInValueY() const { return mpData->mScaleInValueY; }
+ f32 getScaleOutValueX() const { return mpData->mScaleOutValueX; }
+ f32 getScaleOutValueY() const { return mpData->mScaleOutValueY; }
+ s16 getScaleAnmCycleX() const { return mpData->mScaleAnmCycleX; }
+ s16 getScaleAnmCycleY() const { return mpData->mScaleAnmCycleY; }
+ f32 getAlphaInTiming() const { return mpData->mAlphaInTiming; }
+ f32 getAlphaOutTiming() const { return mpData->mAlphaOutTiming; }
+ f32 getAlphaInValue() const { return mpData->mAlphaInValue; }
+ f32 getAlphaOutValue() const { return mpData->mAlphaOutValue; }
+ f32 getAlphaBaseValue() const { return mpData->mAlphaBaseValue; }
+ f32 getAlphaFreq() const { return mpData->mAlphaWaveFrequency; }
+ f32 getAlphaAmp() const { return mpData->mAlphaWaveAmplitude; }
+ f32 getScaleIncRateX() const { return mScaleIncRateX; }
+ f32 getScaleDecRateX() const { return mScaleDecRateX; }
+ f32 getScaleIncRateY() const { return mScaleIncRateY; }
+ f32 getScaleDecRateY() const { return mScaleDecRateY; }
+ f32 getAlphaIncRate() const { return mAlphaIncRate; }
+ f32 getAlphaDecRate() const { return mAlphaDecRate; }
+
+private:
+ /* 0x00 */ const JPAExtraShapeData* mpData;
+ /* 0x04 */ f32 mAlphaIncRate;
+ /* 0x08 */ f32 mAlphaDecRate;
+ /* 0x0C */ f32 mScaleIncRateX;
+ /* 0x10 */ f32 mScaleIncRateY;
+ /* 0x14 */ f32 mScaleDecRateX;
+ /* 0x18 */ f32 mScaleDecRateY;
+};
+
#endif /* JPAEXTRASHAPE_H */
diff --git a/include/JSystem/JParticle/JPAParticle.h b/include/JSystem/JParticle/JPAParticle.h
index 046353808f..ae0a07b8b2 100644
--- a/include/JSystem/JParticle/JPAParticle.h
+++ b/include/JSystem/JParticle/JPAParticle.h
@@ -7,6 +7,9 @@
#include "JSystem/JGeometry.h"
#include "JSystem/JSupport/JSUList.h"
+#include "JSystem/JParticle/JPADynamicsBlock.h"
+#include "JSystem/JParticle/JPAResource.h"
+
class JKRHeap;
class JPABaseEmitter;
class JPABaseParticle;
@@ -31,6 +34,30 @@ public:
JPARandom() { mSeed = 0; }
void set_seed(u32 seed) { mSeed = seed; }
+ u32 get_rndm_u() {
+ return mSeed = mSeed * 0x19660du + 0x3c6ef35fu;
+ }
+
+ f32 get_rndm_f() {
+ union { u32 u; f32 f; } a;
+ a.u = ((get_rndm_u() >> 9) | 0x3f800000);
+ return a.f - 1.0f;
+ }
+
+ f32 get_rndm_zp() {
+ f32 f = get_rndm_f();
+ return (f + f) - 1.0f;
+ }
+
+ f32 get_rndm_zh() {
+ f32 f = get_rndm_f();
+ return f - 1.0f;
+ }
+
+ s16 get_rndm_ss() {
+ return ((s16)get_rndm_u()) >> 16;
+ }
+
public:
u32 mSeed;
};
@@ -175,6 +202,13 @@ public:
/* 8027E6A4 */ ~JPAEmitterCallBack();
};
+enum {
+ JPAEmtrStts_StopEmit = 0x01,
+ JPAEmtrStts_StopCalc = 0x02,
+ JPAEmtrStts_FirstEmit = 0x10,
+ JPAEmtrStts_RateStepEmit = 0x20,
+};
+
class JPABaseEmitter {
public:
/* 8027E5EC */ ~JPABaseEmitter();
@@ -191,9 +225,17 @@ public:
/* 8027EF50 */ bool loadTexture(u8, GXTexMapID);
void setStatus(u32 status) { mStatus |= status; }
+ void clearStatus(u32 status) { mStatus &= ~status; }
bool checkStatus(u32 status) { return !!(mStatus & status); }
+ bool checkFlag(u32 flag) { return !!(mpRes->getDyn()->getFlag() & flag); }
u8 getResourceManagerID() const { return mResMgrID; }
u8 getGroupID() const { return mGroupID; }
+ u8 getDrawTimes() const { return mDrawTimes; }
+
+ f32 get_r_f() { return mRndm.get_rndm_f(); }
+ f32 get_r_zp() { return mRndm.get_rndm_zp(); }
+ f32 get_r_zh() { return mRndm.get_rndm_zh(); }
+ s16 get_r_ss() { return mRndm.get_rndm_ss(); }
public:
/* 0x00 */ Vec mLocalScl;
@@ -234,7 +276,7 @@ public:
/* 0xFC */ f32 mScaleOut;
/* 0x100 */ u32 mTick;
/* 0x104 */ s16 mWaitTime;
- /* 0x106 */ u16 mRateStepTimer;
+ /* 0x106 */ s16 mRateStepTimer;
/* 0x108 */ GXColor mPrmClr;
/* 0x10C */ GXColor mEnvClr;
/* 0x110 */ u8 mDrawTimes;
@@ -245,11 +287,15 @@ public:
class JPAParticleCallBack {
public:
- ~JPAParticleCallBack();
+ virtual ~JPAParticleCallBack();
virtual void execute(JPABaseEmitter*, JPABaseParticle*);
virtual void draw(JPABaseEmitter*, JPABaseParticle*);
};
+enum {
+ JPAPtclStts_Invisible = 0x08,
+};
+
class JPABaseParticle {
public:
/* 8027EFEC */ void init_p(JPAEmitterWorkData*);
@@ -277,7 +323,7 @@ public:
/* 0x74 */ f32 mDrag;
/* 0x78 */ u32 field_0x78;
/* 0x7C */ u32 mStatus;
- /* 0x80 */ u16 mAge;
+ /* 0x80 */ s16 mAge;
/* 0x82 */ u16 mLifeTime;
/* 0x84 */ f32 mTime;
/* 0x88 */ u16 mRotateAngle;
diff --git a/include/JSystem/JParticle/JPAResource.h b/include/JSystem/JParticle/JPAResource.h
index f207f15d88..5b3e891bc3 100644
--- a/include/JSystem/JParticle/JPAResource.h
+++ b/include/JSystem/JParticle/JPAResource.h
@@ -20,7 +20,7 @@ class JPAResource {
public:
/* 80274010 */ JPAResource();
/* 80274080 */ void init(JKRHeap*);
- /* 802755E8 */ void calc(JPAEmitterWorkData*, JPABaseEmitter*);
+ /* 802755E8 */ bool calc(JPAEmitterWorkData*, JPABaseEmitter*);
/* 80275A94 */ void draw(JPAEmitterWorkData*, JPABaseEmitter*);
/* 80275B74 */ void drawP(JPAEmitterWorkData*);
/* 80275EB0 */ void drawC(JPAEmitterWorkData*);