Files
bigmak94andClaude Opus 5.5 4b395efe5c Add the Petari decompilation (SMGCommunity/Petari@0a5c660)
The sources of Petari (https://github.com/SMGCommunity/Petari), the
Super Mario Galaxy decompilation by the SMGCommunity, at commit
0a5c6608dc3b4c44a9aa68c2535d1793dc565f02, unchanged but for LF line
endings: LICENSE (as LICENSE-Petari.txt; CC0 1.0), include/, libs/ and
src/.  Left out: the game data Petari keeps from the original
executable, the error message archive (include/Game/System/
ErrorArchive.hpp) and two tables (src/Game/System/GalaxyID.bcsv and
StoryEvent.bcsv); GalaxyQuest's converter takes them from the player's
own disc.  The port's changes follow in the next commit, so
`git diff petari-base -- decomp` shows them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 01:59:38 +02:00

120 lines
3.4 KiB
C++

#pragma once
#include "Game/Util/Array.hpp"
#include <JSystem/JGeometry/TVec.hpp>
class AutoEffectInfo;
class EffectSystem;
class JPAParticleCallBack;
class MultiEmitterCallBack;
class MultiEmitterCallBackBase;
class MultiEmitterParticleCallBack;
class ParticleEmitter;
class SingleEmitter;
class SyncBckEffectInfo;
class XanimePlayer;
class MultiEmitter {
public:
MultiEmitter(const char*, const TVec3f*, const TVec3f*, const TVec3f*, const TVec3f&);
MultiEmitter(const char*, MtxPtr, const TVec3f&);
MultiEmitter(const char*, MtxPtr, const TVec3f*, const TVec3f&);
MultiEmitter(const char*);
void createEmitter();
void createEmitterWithCallBack(MultiEmitterCallBackBase*);
void deleteEmitter();
void forceDeleteEmitter();
void forceDelete(EffectSystem*);
void deleteForeverEmitter();
void playCalcAndDeleteForeverEmitter();
bool isValid() const;
bool isExistOneTimeEmitter() const;
void setHostSRT(const TVec3f*, const TVec3f*, const TVec3f*);
void setHostMtx(MtxPtr);
void setOffset(const TVec3f&);
void setBaseScale(f32);
void setName(const char*);
bool isEqualName(u16) const;
ParticleEmitter* getParticleEmitter(int) const;
void create(EffectSystem*);
void scanParticleEmitter(EffectSystem*);
void forceFollowOn();
void forceFollowOff();
void forceScaleOn();
void initSyncBck(XanimePlayer*, const char*, s32, f32);
void onDeleteSyncBck(bool, f32);
void addSyncBck(const XanimePlayer*, const char*);
void setContinueBckEnd(bool);
void onCreateSyncClipping();
void onForceDeleteSyncClipping();
void stopEmitterOnClipped();
void playEmitterOffClipped();
void setDrawOrder(s32);
void addChildEmitter(MultiEmitter*);
void setGlobalRotationDegree(const TVec3f&, s32);
void allocateEmitter(const char*);
SingleEmitter* getValidEmitter(s32, bool);
void createOneTimeEmitter();
void createForeverEmitter();
// In MultiEmitterAccess
void setGlobalRotation(const TVec3s&, s32);
void setGlobalTranslation(const TVec3f&, s32);
void setGlobalScale(const TVec3f&, s32);
void setGlobalSRTMatrix(const Mtx, s32);
void setGlobalPrmColor(u8, u8, u8, s32);
void setGlobalEnvColor(u8, u8, u8, s32);
void setLocalScale(const TVec3f&, s32);
void setDirectionalSpeed(f32, s32);
void setRate(f32, s32);
void stopCalcEmitter(s32);
void playCalcEmitter(s32);
void stopDrawParticle(s32);
void playDrawParticle(s32);
void setParticleCallBackPtr(JPAParticleCallBack*, s32);
void pauseOff(s32);
// In MarioEffect
void setGlobalScale(f32, s32);
inline bool isFlagOn(u16 flag) const {
u16 mask = mFlags & flag;
return mask == flag;
}
inline bool isFlagOff(u16 flag) const {
u16 mask = mFlags & flag;
return mask != flag;
}
inline void turnFlagOn(u16 flag) {
mFlags |= flag;
}
inline void turnFlagOff(u16 flag) {
mFlags &= ~flag;
}
/* 0x00 */ MR::AssignableArray< SingleEmitter > mEmitters;
/* 0x08 */ MR::Vector< MR::FixedArray< MultiEmitter*, 4 > > mChildren;
/* 0x1C */ MultiEmitterCallBack* mCallBack;
/* 0x20 */ MultiEmitterParticleCallBack* mParticleCallBack;
/* 0x24 */ SyncBckEffectInfo* _24;
/* 0x28 */ const AutoEffectInfo* _28;
/* 0x2C */ f32 _2C;
/* 0x30 */ f32 _30;
/* 0x34 */ u16 mHash;
/* 0x36 */ u8 mFlags;
};