diff options
Diffstat (limited to '')
-rw-r--r-- | NewerProject.yaml | 4 | ||||
-rwxr-xr-x[-rw-r--r--] | include/game.h | 4202 | ||||
-rw-r--r-- | kamek_ntsc.x | 11 | ||||
-rw-r--r-- | kamek_ntsc2.x | 11 | ||||
-rw-r--r-- | kamek_pal2.x | 11 | ||||
-rw-r--r-- | mrsun.yaml | 4 | ||||
-rwxr-xr-x | src/mrsun.cpp | 121 |
7 files changed, 2168 insertions, 2196 deletions
diff --git a/NewerProject.yaml b/NewerProject.yaml index 86dde10..8a27c54 100644 --- a/NewerProject.yaml +++ b/NewerProject.yaml @@ -6,6 +6,7 @@ modules: - processed/worldmap.yaml - processed/levelnames.yaml - processed/animtiles.yaml + - processed/mrsun.yaml - processed/spritetex.yaml # - processed/gakenoko.yaml - processed/poweruphax.yaml @@ -19,11 +20,10 @@ modules: # - processed/msgbox.yaml # - processed/replay.yaml - processed/growup.yaml - - processed/levelspecial.yaml + #- processed/levelspecial.yaml - processed/eventlooper.yaml - processed/spritespawner.yaml - processed/spriteswapper.yaml - processed/compression.yaml # - processed/crowdclapper.yaml - processed/blocksnake.yaml - - processed/mrsun.yaml diff --git a/include/game.h b/include/game.h index 7412762..38e8dd6 100644..100755 --- a/include/game.h +++ b/include/game.h @@ -1,2096 +1,2106 @@ -#ifndef __KAMEK_GAME_H -#define __KAMEK_GAME_H - -//#define offsetof(type, member) ((__std(size_t)) &(((type *) 0)->member)) - -#include <common.h> -#include <rvl/mtx.h> -#include <rvl/GXEnum.h> -#include <rvl/vifuncs.h> -#include <rvl/arc.h> -#define offsetof(type, member) ((u32) &(((type *) 0)->member)) - - -extern "C" { -int strlen(const char *str); - -float atan(float x); -float atan2(float y, float x); - -float cos(float x); -float sin(float x); -} - -bool DVD_Start(); -bool DVD_End(); -bool DVD_StillLoading(void *dvdclass2); -void DVD_LoadFile(void *dvdclass, char *folder, char *file, void *callbackData); -void DVD_FreeFile(void *dvdclass2, char *file); - -extern void *DVDClass; - -inline void *GetDVDClass() { - return DVDClass; -} - -inline void *GetDVDClass2() { - return (void*)(((u32)GetDVDClass())+4); -} - -void *DVD_GetFile(void *dvdclass2, const char *arc, const char *file); -void *DVD_GetFile(void *dvdclass2, const char *arc, const char *file, u32 *length); - -int MakeRandomNumber(int count); -int MakeRandomNumberForTiles(int count); - - -extern int Player_Active[4]; -extern int Player_ID[4]; -extern int Player_Powerup[4]; -extern int Player_Flags[4]; -extern int Player_Lives[4]; -extern int Player_Coins[4]; - -struct StartLevelInfo { - int maybeUnused; - unsigned char unk1; // 0x04 - unsigned char unk2; // 0x05 - unsigned char unk3; // 0x06 - unsigned char unk4; // 0x07 - unsigned int purpose; // 0x08 - unsigned char world1; // 0x0C - unsigned char level1; // 0x0D - unsigned char world2; // 0x0E - unsigned char level2; // 0x0F -}; - -extern void *GameMgr; -inline void *GetGameMgr() { - return GameMgr; -} - -bool QueryPlayerAvailability(int id); -void DoStartLevel(void *gameMgr, StartLevelInfo *sl); -void SetSomeConditionShit(int world, int level, unsigned int bits); - -bool IsWideScreen(); - -#define GAMEMGR_GET_AFC(gmgr) (*((bool*)(((u32)(gmgr))+0xAFC))) - - -#define COND_COIN1 1 -#define COND_COIN2 2 -#define COND_COIN3 4 -#define COND_NORMAL 0x10 -#define COND_SECRET 0x20 -#define COND_SGNORMAL 0x80 -#define COND_SGSECRET 0x100 - -class SaveFirstBlock { -public: - char titleID[4]; // 0x00 - u8 field_00; // 0x04 - u8 field_01; // 0x05 - u8 current_file; // 0x06 - u8 field_03; // 0x07 - u16 freemode_fav[10][0x2A]; // 0x08 - u16 coinbtl_fav[10][0x2A]; // 0x350 - u16 bitfield; // 0x698 - u16 field_69A; // 0x69A - u32 checksum; // 0x69C -}; - -class SaveBlock { -public: - u8 field_00; // 0x00 - u8 field_01; // 0x01 - u8 bitfield; // 0x02 - u8 current_world; // 0x03 - u8 field_04; // 0x04 - u8 current_path_node; // 0x05 - u8 field_06; // 0x06 - u8 switch_on; // 0x07 - u8 field_08; // 0x08 - u8 powerups_available[7]; // 0x09 - u8 toad_level_idx[10]; // 0x10 - u8 player_continues[4]; // 0x1A - u8 player_coins[4]; // 0x1E - u8 player_lives[4]; // 0x22 - u8 player_flags[4]; // 0x26 - u8 player_type[4]; // 0x2A - u8 player_powerup[4]; // 0x2E - u8 worlds_available[10]; // 0x32 - u32 ambush_countdown[10]; // 0x3C - u16 field_64; // 0x64 - u16 credits_hiscore; // 0x66 - u16 score; // 0x68 - u32 completions[10][0x2A]; // 0x6C - u8 hint_movie_bought[70]; // 0x6FC - u8 toad_location[10]; // 0x742 - u8 field_74C[10][4]; // 0x74C - u8 field_774[10][4]; // 0x774 - u8 field_79C[10][4]; // 0x79C - u8 death_counts[10][0x2A]; // 0x7C4 - u8 death_count_3_4_switch; // 0x968 - u8 pad[0x13]; // 0x969 - u32 checksum; // 0x97C - - u32 GetLevelCondition(int world, int level); - bool CheckLevelCondition(int world, int level, int cond); - bool CheckIfCoinCollected(int world, int level, int num); -}; - -class SaveFile { -public: - u32 field_00; - u32 field_04; - u32 field_08; - u32 field_0C; - u32 field_10; - u32 field_14; - u32 field_18; - u32 field_1C; - - // Real Savefile starts here - SaveFirstBlock header; - SaveBlock blocks[3]; - SaveBlock quickSave[3]; - - SaveBlock *GetBlock(int id); - SaveBlock *GetQSBlock(int id); - - bool CheckIfWriting(); // 0x800E0540 -}; - -class SaveHandler { -public: - u8 unknown[0x70]; - u32 CurrentState; - u32 CurrentError; - u32 field_7C; -}; - -extern SaveFile *SaveFileInstance; -extern SaveHandler *SaveHandlerInstance; - -inline SaveFile *GetSaveFile() { - return SaveFileInstance; -} - -inline SaveHandler *GetSaveHandler() { - return SaveHandlerInstance; -} - -#define WPAD_DOWN 0x0001 // Actually Left, but rotated -#define WPAD_UP 0x0002 // Actually Right, but rotated -#define WPAD_RIGHT 0x0004 // Actually Down, but rotated -#define WPAD_LEFT 0x0008 // Actually Up, but rotated -#define WPAD_PLUS 0x0010 -#define WPAD_TWO 0x0100 -#define WPAD_ONE 0x0200 -#define WPAD_B 0x0400 -#define WPAD_A 0x0800 -#define WPAD_MINUS 0x1000 -#define WPAD_HOME 0x8000 - -struct RemoconMngClass { - void *vtable; - void *controllers[4]; -}; - -/* - * Ok, here's how the remocon/wiimote shit works: - * Remocon is a NSMB-specific class, it handles the different control methods - * and D-pad directions and such automatically. - * - * Wiimote is a generic class (part of EGG) -- well it's not actually called - * that, but who cares. It handles different types of controllers. Only - * query it if whatever you're accessing is control type dependent. - */ - -extern RemoconMngClass *RemoconMng; -extern int ActiveWiimoteID; -extern void *ActiveWiimote; - -inline RemoconMngClass *GetRemoconMng() { - return RemoconMng; -} - -inline int GetActiveWiimoteID() { - return ActiveWiimoteID; -} - -inline void *GetActiveRemocon() { - return GetRemoconMng()->controllers[GetActiveWiimoteID()]; -} - -inline void *GetActiveWiimote() { - return ActiveWiimote; -} - -inline unsigned int Remocon_GetButtons(void *self) { - return *((unsigned int*)((u32)self+0x18)); -} - -inline unsigned int Remocon_GetPressed(void *self) { - return *((unsigned int*)((u32)self+0x1C)); -} - -typedef bool (*__Wiimote_TestButtons_type)(void*, unsigned int); -inline bool Wiimote_TestButtons(void *self, unsigned int btns) { - VF_BEGIN(__Wiimote_TestButtons_type, self, 8, 0) - return VF_CALL(self, btns); - VF_END; -} - -int SearchForIndexOfPlayerID(int id); - -bool CheckIfContinueShouldBeActivated(); - -bool CheckIfMenuShouldBeCancelledForSpecifiedWiimote(int num); - -void StartTitleScreenStage(bool realDemo, int sceneParam); - -bool CheckIfWeCantDoStuff(); - -u32 QueryGlobal5758(u32 check); - -void SaveGame(void *classDoesntMatter, bool isQuick); - -#include <actors.h> -void *CreateParentedObject(short classID, void *parent, int settings, char something); -void *CreateChildObject(short classID, void *parent, int settings, int unk1, int unk2); - - -#define WIPE_FADE 0 -#define WIPE_CIRCLE 1 -#define WIPE_BOWSER 2 -#define WIPE_WAVY 3 -#define WIPE_MARIO 4 -#define WIPE_CIRCLE_s 5 - -void ActivateWipe(int type); - -typedef void (*ScreenDrawFunc)(); - -extern ScreenDrawFunc *CurrentDrawFunc; -void WorldMapDrawFunc(); -void GameSetupDrawFunc(); - -void GameSetup__LoadScene(void *self); // 0x80919560 -void FreeScene(int id); - -void WpadShit(int unk); // 0x8016F780 - -void *BgTexMng__LoadAnimTile(void *self, int tileset, short tile, char *name, char *delays, char reverse); // 0x80087B60 - -extern void *GameHeaps[]; - - -class dFlagMgr_c { -public: - dFlagMgr_c(); - - enum ActionFlag { - ACTIVATE = 1, - TICKS = 2 - }; - - u64 flags; - float _8[64], _108[64]; - u8 _208[64]; - u64 _248[64]; - u8 _448[64]; - - u32 ticksRemainingForAction[64]; - u8 actionFlag[64]; - u32 _5C8[64]; // somehow sound related?! assigned by last param to set(); only checked for == 0 - u8 _6C8; // assigned -1 by FlagMgr, and other values by the Switch object, nothing else though - - void setup(bool isNewLevel); - void applyAndClearAllTimedActions(); // only used when setup(true) is called - void execute(); - - void set(u8 number, int delay, bool activate, bool reverseEffect, bool makeNoise, u32 unknown=0); - - u8 findLowestFlagInSet(u32 unk, u64 set); - - void setSpecial(u8 number, float to8, float to108, u8 to208, u32 unk, u64 to248); - float get8(u8 number); - float get108(u8 number); - u8 get208(u8 number); - u64 get248(u8 number); - u8 get448(u8 number); - - // convenience inline functions which may or may not actually exist in Nintendo's original code - u64 mask(u8 number) { return (u64)1 << number; } - bool active(u8 number) { return (flags & mask(number)) != 0; } - bool inactive(u8 number) { return (flags & mask(number)) == 0; } - - static dFlagMgr_c *instance; -}; - - -namespace nw4r { - -namespace ut { - // this isn't 100% accurate because it doesn't use templates - // or detail::LinkListImpl, but oh well - // I don't need the methods anyway. - - class LinkListNode { - public: - LinkListNode *next; - LinkListNode *prev; - }; - - class LinkList { - public: - int count; - LinkListNode initialNode; - }; - - class Color : public GXColor { }; - - class Rect { - public: - f32 left; - f32 top; - f32 right; - f32 bottom; - }; - - template <class T> - class TagProcessorBase { }; -} - -namespace lyt { - class Pane; // forward declaration - class DrawInfo; - - class AnimTransform; // I'll do these later - class AnimResource; - class AnimationLink; - class ResourceAccessor; - class GroupContainer; - - class Layout { - public: - Layout(); - virtual ~Layout(); - - virtual bool Build(const void *data, ResourceAccessor *resAcc); - - virtual AnimTransform *CreateAnimTransform(); - virtual AnimTransform *CreateAnimTransform(const void *data, ResourceAccessor *resAcc); - virtual AnimTransform *CreateAnimTransform(const AnimResource &res, ResourceAccessor *resAcc); - - virtual void BindAnimation(AnimTransform *anim); - virtual void UnbindAnimation(AnimTransform *anim); - virtual void UnbindAllAnimation(); - virtual bool BindAnimationAuto(const AnimResource &res, ResourceAccessor *resAcc); - - virtual void SetAnimationEnable(AnimTransform *anim, bool unk); - - virtual void CalculateMtx(const DrawInfo &info); - - virtual void/*?*/ Draw(const DrawInfo &info); - virtual void/*?*/ Animate(ulong flag); - - virtual void/*?*/ SetTagProcessor(ut::TagProcessorBase<wchar_t> *tagProc); - - ut::LinkList animations; - - Pane *rootPane; - GroupContainer *groupContainer; - - float width; - float height; - }; - - - class DrawInfo { - public: - DrawInfo(); - virtual ~DrawInfo(); - - Mtx matrix; - float left; - float top; - float right; - float bottom; - float scaleX; - float scaleY; - float alpha; - u8 _50; // this is actually a bitfield. todo: investigate how CW handles bitfields, and so on - }; - - - class Material { - public: - // ... - }; - - class Pane { - public: - //Pane(nw4r::lyt::res::Pane const *); // todo: this struct - Pane(void *); - virtual ~Pane(); - - virtual void *GetRuntimeTypeInfo() const; - virtual void CalculateMtx(const DrawInfo &info); - - virtual void Draw(const DrawInfo &info); - virtual void DrawSelf(const DrawInfo &info); - virtual void Animate(ulong flag); - virtual void AnimateSelf(ulong flag); - - virtual ut::Color GetVtxColor(ulong id) const; - virtual void SetVtxColor(ulong id, ut::Color color); - virtual uchar GetColorElement(ulong id) const; - virtual void SetColorElement(ulong id, uchar value); - virtual uchar GetVtxColorElement(ulong id) const; - virtual void SetVtxColorElement(ulong id, uchar value); - - virtual Pane *FindPaneByName(const char *name, bool recursive); - virtual Material *FindMaterialByName(const char *name, bool recursive); - - virtual void/*?*/ BindAnimation(AnimTransform *anim, bool unk1, bool unk2); - virtual void UnbindAnimation(AnimTransform *anim, bool unk); - virtual void UnbindAllAnimation(bool unk); - virtual void UnbindAnimationSelf(AnimTransform *anim); - - virtual ut::LinkListNode *FindAnimationLinkSelf(AnimTransform *anim); - virtual ut::LinkListNode *FindAnimationLinkSelf(const AnimResource &anim); - - virtual void SetAnimationEnable(AnimTransform *anim, bool unk1, bool unk2); - virtual void SetAnimationEnable(const AnimResource &anim, bool unk1, bool unk2); - - virtual ulong GetMaterialNum() const; - virtual Material *GetMaterial() const; - virtual Material *GetMaterial(ulong id) const; - - virtual void LoadMtx(const DrawInfo &info); - - void AppendChild(Pane *child); - - ut::Rect GetPaneRect(const DrawInfo &info) const; - - ut::LinkListNode *AddAnimationLink(AnimationLink *link); - - Vec2 GetVtxPos() const; - - - ut::LinkListNode parentLink; - Pane *parent; - - ut::LinkList children; - ut::LinkList animations; - - Material *material; - - Vec trans; - Vec rotate; - Vec2 scale; - Vec2 size; - - Mtx calcMtx; - Mtx effectiveMtx; - - float _B4; - - u8 alpha; - u8 effectiveAlpha; - u8 origin; - u8 flag; - - char name[0x11]; - char userdata[8]; - - u8 _D5; - u8 paneIsOwnedBySomeoneElse; - u8 _D7; - }; - - class TextBox : public Pane { - public: - TextBox(void *, void *); // todo: TextBox((res::TextBox const *,ResBlockSet const &)) - ~TextBox(); - - void *GetRuntimeTypeInfo() const; - - void DrawSelf(const DrawInfo &info); - - ut::Color GetVtxColor(ulong id) const; - void SetVtxColor(ulong id, ut::Color color); - uchar GetVtxColorElement(ulong id) const; - void SetVtxColorElement(ulong id, uchar value); - - virtual void LoadMtx(const DrawInfo &info); - - virtual void AllocStringBuffer(u16 size); - virtual void FreeStringBuffer(); - - virtual u16 SetString(const wchar_t *str, u16 destOffset = 0); - virtual u16 SetString(const wchar_t *str, u16 destOffset, u16 length); - - wchar_t *stringBuf; - - ut::Color colour1, colour2; - void *font; // actually a ut::ResFont or whatever - - float fontSizeX, fontSizeY; - float lineSpace, charSpace; - - void *tagProc; // actually a TagProcessor - - u16 bufferLength; - u16 stringLength; - - u8 alignment; - u8 flags; - }; -} - - - -namespace g3d { -struct CameraData -{ -enum Flag - { -FLAG_CAMERA_LOOKAT = 0x00000001, -FLAG_CAMERA_ROTATE = 0x00000002, -FLAG_CAMERA_AIM = 0x00000004, -MASK_CAMERA = 0x00000007, - -FLAG_CMTX_VALID = 0x00000008, - -FLAG_PROJ_FLUSTUM = 0x00000010, -FLAG_PROJ_PERSP = 0x00000020, -FLAG_PROJ_ORTHO = 0x00000040, -MASK_PROJ = 0x00000070, - -FLAG_PMTX_VALID = 0x00000080, - -FLAG_VIEWPORT_JITTER_ABOVE = 0x00000100 - }; - -Mtx cameraMtx; -Mtx44 projMtx; - -u32 flags; - -VEC3 cameraPos; -VEC3 cameraUp; -VEC3 cameraTarget; -VEC3 cameraRotate; -f32 cameraTwist; - -GXProjectionType projType; -f32 projFovy; -f32 projAspect; -f32 projNear; -f32 projFar; -f32 projTop; -f32 projBottom; -f32 projLeft; -f32 projRight; - -f32 lightScaleS; -f32 lightScaleT; -f32 lightTransS; -f32 lightTransT; - -VEC2 viewportOrigin; -VEC2 viewportSize; -f32 viewportNear; -f32 viewportFar; - -u32 scissorX; -u32 scissorY; -u32 scissorWidth; -u32 scissorHeight; - -s32 scissorOffsetX; -s32 scissorOffsetY; -}; - -/* Correct camera -cameraMtx: -1.0 0.0 0.0 -0.0 -0.0 1.0 0.0 -0.0 -0.0 0.0 1.0 -6000.0 - -projMtx: -0.002345 0.000000 0.000000 -1.000000 -0.000000 0.004386 0.000000 -1.000000 -0.000000 0.000000 -0.000005 -0.500000 -0.000000 0.000000 0.000000 1.000000 - -flags: 000000C9 : FLAG_CAMERA_LOOKAT | FLAG_CMTX_VALID | FLAG_PROJ_ORTHO | FLAG_PMTX_VALID - -cameraPos: {0, 0, 15} -cameraUp: {0, 1, 0} -cameraTarget: {0, 0, 0} -cameraRotate: {0, 0, 0} -cameraTwist: 0 - -projType: 1 -projFovy: 60 -projAspect: 1.333333 -projNear: -100000 -projFar: 100000 -projTop: 456 -projBottom: 0 -projLeft: 0 -projRight: 853 - -lightScaleS: 0.5 -lightScaleT: 0.5 -lightTransS: 0.5 -lightTransT: 0.5 - -viewportOrigin: {0,0} -viewportSize: {640,456} -viewportNear: 0 -viewportFar: 1 - -scissorX: 0 -scissorY: 0 -scissorWidth: 0x280 -scissorHeight: 0x1C8 - -scissorOffsetX: 0 -scissorOffsetY: 0 -*/ - -class Camera { -public: - enum PostureType { POSTURE_LOOKAT, POSTURE_ROTATE, POSTURE_AIM }; - struct PostureInfo - { - PostureType tp; - VEC3 cameraUp; - VEC3 cameraTarget; - VEC3 cameraRotate; - f32 cameraTwist; - }; -private: - CameraData *data; -public: - Camera(CameraData *pCamera); - void Init(); - void Init(u16 efbWidth, u16 efbHeight, u16 xfbWidth, u16 xfbHeight, u16 viWidth, u16 viHeight); - //void SetPosition(f32 x, f32 y, f32 z); - void SetPosition(const VEC3 &pos); - //void GetPosition(f32 *px, f32 *py, f32 *pz) const; - void GetPosition(VEC3 *pPos) const; - void SetPosture(const PostureInfo &info); - //void GetPosture(PostureInfo *info) const; - void SetCameraMtxDirectly(const Mtx &mtx); - void GetCameraMtx(Mtx *pMtx) const; - void SetOrtho(f32 top, f32 bottom, f32 left, f32 right, f32 near, f32 far); - //void SetFrustum(f32 top, f32 bottom, f32 left, f32 right, f32 near, f32 far); - void SetPerspective(f32 fovy, f32 aspect, f32 near, f32 far); - void SetProjectionMtxDirectly(const Mtx44 *pMtx); - void GetProjectionMtx(Mtx44 *pMtx) const; - //GXProjectionType GetProjectionType() const; - void SetScissor(u32 xOrigin, u32 yOrigin, u32 width, u32 height); - void SetScissorBoxOffset(s32 xOffset, s32 yOffset); - //void GetScissor(u32 *xOrigin, u32 *yOrigin, u32 *width, u32 *height); - void SetViewport(f32 xOrigin, f32 yOrigin, f32 width, f32 height); - //void SetViewport(f32 xOrigin, f32 yOrigin, f32 width, f32 height, f32 near, f32 far); - void SetViewportZRange(f32 near, f32 far); - void SetViewportJitter(u32 field); - //void SetViewportJitter(f32 xOrigin, f32 yOrigin, f32 width, f32 height, f32 near, f32 far, u32 field); - void GetViewport(f32 *xOrigin, f32 *yOrigin, f32 *width, f32 *height, f32 *near, f32 *far) const; - void GXSetViewport() const; - void GXSetProjection() const; - void GXSetScissor() const; - void GXSetScissorBoxOffset() const; -}; - -namespace G3DState { - GXRenderModeObj *GetRenderModeObj(); -} -} -} - - -nw4r::g3d::CameraData *GetCameraByID(int id); - -int GetCurrentCameraID(); // 80164C80 -void SetCurrentCameraID(int id); // 80164C90 - -void LinkScene(int id); // 80164D50 -void UnlinkScene(int id); // 80164CD0 - -void SceneCalcWorld(int sceneID); // 80164E10 -void SceneCameraStuff(int sceneID); // 80164EA0 - -void CalcMaterial(); // 80164E90 -void DrawOpa(); // 80164F70 -void DrawXlu(); // 80164F80 - -bool ChangeAlphaUpdate(bool enable); // 802D3270 - -void DoSpecialDrawing1(); // 8006CAE0 -void DoSpecialDrawing2(); // 8006CB40 - -void SetupLYTDrawing(); // 80163360 -void ClearLayoutDrawList(); // 801632B0 - -void DrawAllLayoutsBeforeX(int x); // 80163440 -void DrawAllLayoutsAfterX(int x); // 801634D0 -void DrawAllLayoutsAfterXandBeforeY(int x, int y); // 80163560 - -void RenderEffects(int v1, int v2); // 80093F10 - -void RemoveAllFromScnRoot(); // 80164FB0 -void Reset3DState(); // 80165000 - -extern "C" void GXDrawDone(); // 801C4FE0 - - - -namespace m2d { - class Base_c /*: public nw4r::ut::Link what's this? */ { - public: - u32 _00; - u32 _04; - - Base_c(); - virtual ~Base_c(); - virtual void draw(); // don't call this directly - - void scheduleForDrawing(); - - u8 drawOrder; - }; - - class Simple_c : public Base_c { - public: - nw4r::lyt::Layout layout; - nw4r::lyt::DrawInfo drawInfo; - - u32 _84; - float _88; - float _8C; - float _90; - u32 _94; - - Simple_c(); - ~Simple_c(); - - void draw(); - virtual void _vf10(); - virtual void _vf14(); - }; -} - - - -namespace EGG { - class Frustum { - public: - GXProjectionType projType; - int isCentered; - float width; - float height; - float fovy; - float dunno; - float near; - float far; - float center_x_maybe; - float center_y_maybe; - float x_direction; - float unk2; - float unk3; - short some_flag_bit; - - - // isCentered might actually be isNotCentered, dunno - Frustum(GXProjectionType projType, Vec2 size, bool isCentered, float near, float far); // 802C6D20 - Frustum(Frustum &f); // 802C6D90 - virtual ~Frustum(); // 802C75F0 - - virtual void loadDirectly(); // 802C7050 - virtual void loadIntoCamera(nw4r::g3d::Camera cam); // 802C7070 - - void setOrtho(float top, float bottom, float left, float right, float near, float far); // 802C6DD0 - - void setFovy(float newFovy); // 802C6F60 - - void getCenterPointsBasedOnPos(float x, float y, float *destX, float *destY); // 802C6FD0 - - // no idea what this does - float getSomethingForPerspective(float blah); // 802C7020 - - - protected: - // not all of these might be protected, dunno - - void copyAllFields(Frustum &f); // 802C6EE0 - - void saveSomething(float f1, float f2, float f3, float f4); // 802C70C0 - void loadSomething(float *f1, float *f2, float *f3, float *f4); // 802C70E0 - - void loadPerspective(); // 802C7110 - void loadOrtho(); // 802C7140 - - void setCameraPerspective(nw4r::g3d::Camera cam); // 802C7170 - void setCameraOrtho(nw4r::g3d::Camera cam); // 802C71E0 - - void getPerspectiveProjMtx(Mtx44 *mtx); // 802C7250 - void getPerspectiveProjv(float *ptr); // 802C72E0 - void getOrthoProjv(float *ptr); // 802C73A0 - - void getOrthoVars(float *top, float *bottom, float *left, float *right); // 802C7480 - }; -} - - -class TileRenderer { -public: - TileRenderer(); - ~TileRenderer(); - - TileRenderer *list1, *list2; - u16 tileNumber; - u8 unkFlag, someBool; - float x, y, z; - float scale; - s16 rotation; - u8 unkByte; - - u16 getTileNum(); - bool getSomeBool(); - void setSomeBool(u8 value); - - float getX(); - float getY(); - float getZ(); - void setPosition(float x, float y); - void setPosition(float x, float y, float z); - - u8 getUnkFlag(); - - void setVars(float scale); // sets unkFlag=1, rotation=0, unkByte=0 - void setVars(float scale, s16 rotation); // sets unkFlag=2, unkByte=0 - - float getScale(); - float getRotationFloat(); - s16 getRotation(); - - u8 getUnkByte(); - - class List { - public: - u32 count; - TileRenderer *first, *last; // order? - - void add(TileRenderer *r); - void remove(TileRenderer *r); - void removeAll(); - - List(); - ~List(); - }; -}; - -class dActor_c; // forward declaration - -class Physics { -public: - struct Unknown { - Unknown(); - ~Unknown(); - - float x, y; - }; - - struct Info { - float x1, y1, x2, y2; // Might be distance to center/edge like APhysics - void *otherCallback1, *otherCallback2, *otherCallback3; - }; - - Physics(); - ~Physics(); - - dActor_c *owner; - Physics *next, *prev; - u32 _C, _10, _14, _18, _1C, _20, _24, _28, _2C, _30, _34, _38, _3C; - void *otherCallback1, *otherCallback2, *otherCallback3; - void *callback1, *callback2, *callback3; - float lastX, lastY; - Unknown unkArray[4]; - float x, y; - float _88, _8C, _90; - Vec lastActorPosition; - float _A0, _A4, last_A0, last_A4, _B0, _B4; - u32 _B8; - s16 *ptrToRotationShort; - s16 currentRotation; - s16 rotDiff; - s16 rotDiffAlt; - u32 isRound; - u32 _CC; - u32 flagsMaybe; - u32 _D4, _D8; - u8 isAddedToList, _DD, layer; - u32 id; - - void addToList(); - void removeFromList(); - - void baseSetup(dActor_c *actor, u32 t_40, u32 t_44, u32 t_48, u8 t_DD, u8 layer); - - // note: Scale can be a null pointer (in that case, it'll use 1.0) - void setup(dActor_c *actor, - float x1, float y1, float x2, float y2, - void *otherCB1, void *otherCB2, void *otherCB3, - u8 t_DD, u8 layer, Vec2 *scale = 0); - - void setup(dActor_c *actor, - Vec2 *p1, Vec2 *p2, - void *otherCB1, void *otherCB2, void *otherCB3, - u8 t_DD, u8 layer, Vec2 *scale = 0); - - void setup(dActor_c *actor, Info *pInfo, u8 t_DD, u8 layer, Vec2 *scale = 0); - - // radius might be diameter? dunno - void setupRound(dActor_c *actor, - float x, float y, float radius, - void *otherCB1, void *otherCB2, void *otherCB3, - u8 t_DD, u8 layer); - - void setRect(float x1, float y1, float x2, float y2, Vec2 *scale = 0); - void setRect(Vec2 *p1, Vec2 *p2, Vec2 *scale = 0); - - void setX(float value); - void setY(float value); - void setWidth(float value); - void setHeight(float value); - - void setPtrToRotation(s16 *ptr); - - void update(); - - // todo: more stuff that might not be relevant atm -}; - - -class ActivePhysics { -public: - struct Info; // forward declaration - typedef void (*Callback)(Info *self, Info *other); - - struct Info { - float xDistToCenter; - float yDistToCenter; - float xDistToEdge; - float yDistToEdge; - u8 category1; - u8 category2; - u32 bitfield1; - u32 bitfield2; - u16 unkShort1C; - Callback callback; - }; - - ActivePhysics(); - virtual ~ActivePhysics(); - - dActor_c *owner; // should be dStageActor? dunno - u32 _8; - u32 _C; - ActivePhysics *listPrev, *listNext; - u32 _18; - Info info; - u32 _40, _44, _48, _4C; - float firstFloatArray[8]; - float secondFloatArray[8]; - Vec2 positionOfLastCollision; - u16 result1; - u16 result2; - u16 result3; - u8 collisionCheckType; - u8 chainlinkMode; - u8 layer; - u8 someFlagByte; - u8 isLinkedIntoList; -}; - - -#include <statelib.h> - -class dActorState_c; -class dActorMultiState_c; - - -class AcStateMgrBase { -public: - virtual ~AcStateMgrBase(); - - u32 cls1, cls2, cls3; - dActorMultiState_c *owner; - u32 unkZero; - - StateMgr<dActorMultiState_c> manager; - - // All these are passed straight through to the manager - virtual void _vfC(); - virtual void _vf10(); - virtual void _vf14(); - virtual void _vf18(); - virtual void _vf1C(); - virtual void _vf20(); - virtual void _vf24(); - virtual void _vf28(); - virtual void _vf2C(); -}; - -class AcStateMgr : public AcStateMgrBase { -public: - ~AcStateMgr(); -}; - -class MultiStateMgrBase { -public: - virtual ~MultiStateMgrBase(); - - AcStateMgr s1, s2; - AcStateMgr *ptrToStateMgr; - - virtual void _vfC(); // calls vfC on ptrToStateMgr - virtual void execute(); // calls vf10 on ptrToStateMgr - virtual void _vf14(); // if (isSecondStateMgr()) { disableSecond(); } else { ptrToStateMgr->_vf14(); } - virtual void setState(StateBase *state); // calls vf18 on ptrToStateMgr - virtual void _vf1C(); // calls vf1C on ptrToStateMgr - virtual void _vf20(); // calls vf20 on ptrToStateMgr - virtual void _vf24(); // calls vf24 on ptrToStateMgr - virtual StateBase *getCurrentState(); // calls vf28 on ptrToStateMgr - virtual void _vf2C(); // calls vf2C on ptrToStateMgr - virtual void enableSecond(); // sets ptrToStateMgr to s2, calls vf18 on it - virtual void disableSecond(); // if (isSecondStateMgr()) { ptrToStateMgr->vf14(); ptrToStateMgr = &s1; } - virtual bool isSecondStateMgr(); - virtual void _vf3C(); // calls vf28 on s1 -}; - -class MultiStateMgr : public MultiStateMgrBase { -public: - // what the fuck does this do - ~MultiStateMgr(); -}; - - -struct LinkListEntry { - LinkListEntry *prev; - LinkListEntry *next; - void *owned_obj; -}; - - -struct LinkList { - LinkListEntry *first; - LinkListEntry *last; - // PTMF goes here, but I don't know how to represent it -}; - - -struct OrderedLinkListEntry : LinkListEntry { - u16 order; - u16 _; -}; - - -struct TreeNode { - TreeNode *parent; - TreeNode *child; - TreeNode *prev; - TreeNode *next; - void *owned_obj; -}; - - -struct Tree { - TreeNode *firstNode; - // PTMF goes here, but I don't know how to represent it -}; - - -typedef bool (*ChainedFunc)(void*); - -class FunctionChain { -public: - ChainedFunc *functions; - u16 count; - u16 current; - - void setup(ChainedFunc *functions, u16 count); // 8015F740 -}; - - -class fBase_c { -public: - u32 id; - u32 settings; - u16 name; - u8 _A; - u8 _B; - u8 _C; - u8 _D; - u8 base_type; - u8 _F; - TreeNode link_connect; - OrderedLinkListEntry link_execute; - OrderedLinkListEntry link_draw; - LinkListEntry link_IDlookup; - u32 _50; - u32 _54; - u32 _58; - u32 heap; - - fBase_c(); - - virtual int onCreate(); - virtual int beforeCreate(); - virtual int afterCreate(int); - - virtual int onDelete(); - virtual int beforeDelete(); - virtual int afterDelete(int); - - virtual int onExecute(); - virtual int beforeExecute(); - virtual int afterExecute(int); - - virtual int onDraw(); - virtual int beforeDraw(); - virtual int afterDraw(int); - - virtual void willBeDeleted(); - - virtual bool moreHeapShit(u32 size, void *parentHeap); - virtual bool createHeap(u32 size, void *parentHeap); - virtual void heapCreated(); - - virtual ~fBase_c(); - - void Delete(); - - fBase_c *GetParent(); - fBase_c *GetChild(); - fBase_c *GetNext(); - - bool hasUninitialisedProcesses(); // 80162B60 -}; - -class dBase_c : public fBase_c { -public: - u32 _64; - const char *explanation_string; - const char *name_string; - - dBase_c(); - - int beforeCreate(); - int afterCreate(int); - int beforeDelete(); - int afterDelete(int); - int beforeExecute(); - int afterExecute(int); - int beforeDraw(); - int afterDraw(int); - - ~dBase_c(); - - virtual const char *GetExplanationString(); -}; - -class dScene_c : public dBase_c { -public: - FunctionChain *ptrToInitChain; - - dScene_c(); - - int beforeCreate(); - int afterCreate(int); - int beforeDelete(); - int afterDelete(int); - int beforeExecute(); - int afterExecute(int); - int beforeDraw(); - int afterDraw(int); - - ~dScene_c(); - - - void setInitChain(FunctionChain &initChain) { - ptrToInitChain = &initChain; - } -}; - -class dActor_c : public dBase_c { -public: - LinkListEntry link_actor; - Mtx matrix; - Vec pos; - Vec last_pos; - Vec pos_delta; - Vec _D0; - Vec scale; - Vec speed; - Vec max_speed; - S16Vec rot; - S16Vec _106; - u32 _10C; - u32 _110; - float y_speed_inc; - u32 _118; - float x_speed_inc; - u32 _120; - bool visible; - - dActor_c(); - - virtual void specialDraw1(); - virtual void specialDraw2(); - virtual int _vf58(); - virtual void _vf5C(); - - ~dActor_c(); -}; - -class dStageActor_c : public dActor_c { -public: - u8 _125; - u32 _128, _12C, _130, _134, _138, _13C; - float _140; - u32 _144; - ActivePhysics aPhysics; - u8 classAt1EC[236]; - u32 _2D8; - u8 classAt2DC[0x34]; - u32 _310, _314; - float spriteSomeRectX, spriteSomeRectY; - float _320, _324, _328, _32C, _330, _334, _338, _33C, _340, _344; - u8 direction; - u8 currentZoneID; - u8 _34A, _34B; - u8 *spriteByteStorage; - u16 *spriteShortStorage; - u16 spriteEventNum; - u64 spriteEventMask; - u32 _360; - u16 spriteSomeFlag; - u8 _366, _367; - u32 _368; - u8 _36C, _36D; - Vec somethingRelatedToScale; - u32 _37C, _380, _384, _388; - u8 _38C, _38D, enableFlag, currentLayerID; - u8 _390, _391, _392, _padding; - - dStageActor_c(); - - int beforeCreate(); - int afterCreate(int); - int beforeDelete(); - int afterDelete(int); - int beforeExecute(); - int afterExecute(int); - int beforeDraw(); - int afterDraw(int); - - const char *GetExplanationString(); - - virtual bool _vf60(); // does stuff with BG_GM - virtual void kill(); // nullsub here, defined in StageActor. probably no params - virtual int _vf68(); // params unknown. return (1) might be bool - virtual u8 *_vf6C(); // returns byte 0x38D - virtual Vec2 _vf70(); // returns Vec Actor.pos + Vec Actor.field_D0 - virtual int _vf74(); // params unknown. return (1) might be bool - virtual void _vf78(); // params unknown. nullsub - virtual void _vf7C(); // params unknown. nullsub - virtual void eatIn(); // copies Actor.scale into StageActor.somethingRelatedToScale - virtual void disableEatIn(); // params unknown. nullsub - virtual void _vf88(); // params unknown. nullsub - virtual bool _vf8C(void *other); // dAcPy_c/daPlBase_c? return (1) is probably bool. seems related to EatOut. uses vfA4 - virtual bool _vf90(dStageActor_c *other); // does something with scores - virtual void _vf94(void *other); // dAcPy_c/daPlBase_c? modifies This's position - virtual void removeMyActivePhysics(); - virtual void addMyActivePhysics(); - virtual void returnRegularScale(); // the reverse of vf80, yay - virtual void _vfA4(void *other); // AcPy/PlBase? similar to vf94 but not quite the same - virtual float _vfA8(void *other); // AcPy/PlBase? what DOES this do...? does a bit of float math - virtual void _vfAC(void *other); // copies somethingRelatedToScale into scale, then multiplies scale by vfA8's return - virtual void _vfB0(); // plays Wm_en_burst_s at actor position - virtual void _vfB4(); // params unknown. nullsub - virtual void _vfB8(); // params unknown. nullsub - virtual void _vfBC(); // params unknown. nullsub - virtual void _vfC0(); // params unknown. nullsub - virtual void _vfC4(); // params unknown. nullsub - virtual void _vfC8(Vec2 *p); // does stuff including effects and playing PLAYER_SE_OBJ/GROUP_BOOT/SE_OBJ_CMN_SPLASH - virtual void _vfCC(Vec2 *p); // mostly same as vfC8, but uses PLAYER_SE_OBJ/GROUP_BOOT/SE_OBJ_CMN_SPLASH_LAVA - virtual void _vfD0(Vec2 *p); // mostly same as vfC8, but uses PLAYER_SE_OBJ/GROUP_BOOT/SE_OBJ_CMN_SPLASH_POISON - - // I'll add methods as I need them - void checkZoneBoundaries(u32 flags); // I think this method is for that, anyway - - ~dStageActor_c(); - - - static void create(Actors type, u32 settings, Vec *pos, S16Vec *rot, u8 layer); - static void createChild(Actors type, u32 settings, Vec *pos, S16Vec *rot, u8 layer); -}; - - -class dAc_Py_c : public dStageActor_c { -public: - u8 data[0x1164 - 0x394]; - ActivePhysics bPhysics; - ActivePhysics cPhysics; - ActivePhysics dPhysics; - ActivePhysics ePhysics; - - dAc_Py_c(); - - int beforeCreate(); - int afterCreate(int); - int beforeDelete(); - int afterDelete(int); - int beforeExecute(); - int afterExecute(int); - int beforeDraw(); - int afterDraw(int); - - ~dAc_Py_c(); -}; - - -/* TODO -class dActorState_c : public dStageActor_c { -public: - ~dActorState_c(); - - virtual void _vfD4(); - virtual void _vfD8(); - virtual void _vfDC(); -}; -*/ - - -class dActorMultiState_c : public dStageActor_c { -public: - ~dActorMultiState_c(); - - MultiStateMgr acState; - - virtual void doStateChange(StateBase *state); // might return bool? overridden by dEn_c - virtual void _vfD8(); // nullsub ?? - virtual void _vfDC(); // nullsub ?? - virtual void _vfE0(); // nullsub ?? -}; - - -class dEn_c : public dActorMultiState_c { -public: - float _414, _418, _41C, _420; - void *nextState; - u32 _428, _42C; - u8 _430, _431, isDead; - u32 _434; - u16 _438; - u32 _43C; - Vec velocity1, velocity2; - u8 _458, _459, _45A, _45B, _45C, _45D, _45E; - u32 _460; - Vec initialScale; - float _470; - u32 _474, _478; - dEn_c *_47C; - u32 _480; - u8 classAt484[0x4EC - 0x484]; - u32 _4EC; - float _4F0, _4F4, _4F8; - u32 flags_4FC; - u16 counter_500, counter_502; - u16 counter_504[4]; - u16 counter_50C; - u32 _510, _514, _518; - void *_51C; - dEn_c *_520; - u32 _524, _528, _52C, _530; - - dEn_c(); - - int afterCreate(int); - int beforeExecute(int); - int afterExecute(int); - int beforeDraw(int); - - void kill(); - - void eatIn(); - void disableEatIn(); - bool _vf8C(void *other); // AcPy/PlBase? - void _vfAC(); - void _vfCC(Vec2 *p); - void _vfD0(Vec2 *p); - - void doStateChange(StateBase *state); // might return bool, dunno - - // Now here's where the fun starts. - - virtual bool preSpriteCollision(ActivePhysics *apThis, ActivePhysics *apOther); - virtual bool prePlayerCollision(ActivePhysics *apThis, ActivePhysics *apOther); - virtual bool preYoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther); - - virtual bool stageActorCollision(ActivePhysics *apThis, ActivePhysics *apOther); - - virtual void spriteCollision(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void yoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther); - - // WHAT A MESS - virtual void collisionCat3_StarPower(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void collisionCat5_Mario(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void _vf108(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void collisionCatD_GroundPound(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void _vf110(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void collisionCat8_FencePunch(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void collisionCat7_WMWaggleWaterYoshi(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void _vf120(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void collisionCatA_PenguinMario(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void collisionCat11_PipeCannon(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther); - - virtual void _vf140(dStageActor_c *actor); - virtual void _vf144(int something); - virtual void _vf148(); // deletes actors held by Class484 and other stuff - virtual void _vf14C(); // deletes actors held by Class484 and makes an En Coin Jump - virtual u32 _vf150(); // reads some bits from a value in Class1EC - virtual void eatenByYoshiProbably(); // nullsub, params unknown - virtual void playHpdpSound1(); // plays PLAYER_SE_EMY/GROUP_BOOT/SE_EMY_DOWN_HPDP_S or _H - virtual void playEnemyDownSound1(); - virtual void playEnemyDownComboSound(void *player); // AcPy_c/daPlBase_c? - virtual void playHpdpSound2(); // plays PLAYER_SE_EMY/GROUP_BOOT/SE_EMY_DOWN_HPDP_S or _H - virtual void _vf168(); // nullsub, params unknown - - // State Functions - virtual void dieFumi_Begin(); // does something involving looping thruogh players - virtual void dieFumi_Execute(); // does movement and some other stuff - virtual void dieFumi_End(); // nullsub - virtual void dieFall_Begin(); // does something involving looping thruogh players - virtual void dieFall_Execute(); // does movement and some other stuff - virtual void dieFall_End(); // nullsub - virtual void dieBigFall_Begin(); // calls vf178 [dieFall_Begin] - virtual void dieBigFall_Execute(); // does movement and some other stuff (but less than 170 and 17C) - virtual void dieBigFall_End(); // calls vf180 [dieFall_End] - virtual void dieSmoke_Begin(); // spawns Wm_en_burst_m effect and then removeMyActivePhysics - virtual void dieSmoke_Execute(); // deletes actor with r4=1 - virtual void dieSmoke_End(); // nullsub - virtual void dieYoshiFumi_Begin(); // spawns Wm_mr_yoshistep effect and then removeMyActivePhysics - virtual void dieYoshiFumi_Execute(); // deletes actor with r4=1 - virtual void dieYoshiFumi_End(); // nullsub - virtual void dieIceVanish_Begin(); // lots of weird stuff - virtual void dieIceVanish_Execute(); // deletes actor with r4=1 - virtual void dieIceVanish_End(); // nullsub - virtual void dieGoal_Begin(); // nullsub - virtual void dieGoal_Execute(); // nullsub - virtual void dieGoal_End(); // nullsub - virtual void dieOther_Begin(); // deletes actor with r4=1 - virtual void dieOther_Execute(); // nullsub - virtual void dieOther_End(); // nullsub - virtual void eatIn_Begin(); // nullsub - virtual void eatIn_Execute(); // changes to EatNow on one condition, otherwise calls vfAC - virtual void eatIn_End(); // nullsub - virtual void eatNow_Begin(); // nullsub - virtual void eatNow_Execute(); // nullsub - virtual void eatNow_End(); // nullsub - virtual void eatOut_Begin(); // nullsub - virtual void eatOut_Execute(); // nullsub - virtual void eatOut_End(); // nullsub - virtual void hitSpin_Begin(); // nullsub - virtual void hitSpin_Execute(); // nullsub - virtual void hitSpin_End(); // nullsub - virtual void ice_Begin(); // does stuff with Class484 and lots of vf's - virtual void ice_Execute(); // tons of stuff with Class484 - virtual void ice_End(); // sets a field in Class484 to 0 - - virtual void spawnHitEffectAtPosition(Vec2 pos); - virtual void doSomethingWithHardHitAndSoftHitEffects(Vec pos); - virtual void playEnemyDownSound2(); - virtual void add2ToYSpeed(); - virtual bool _vf218(); // stuff with floats and camera - virtual void _vf21C(); // does stuff with the speeds - virtual void _vf220(void *other); // some type of actor, PlBase? calls vf3F4 on other with r4=this, r5=0 - virtual void _vf224(); // stores a couple of values into the struct at 464 - virtual void _vf228(); // more fun stuff with 464 and floats - virtual bool _vf22C(); // does stuff involving ICE_ACTORs and arrays - virtual void _vf230(); // "relatedToPlayerOrYoshiCollision" apparently. nullsub, params unknown for now. - virtual void _vf234(); // nullsub, params unknown - virtual void _vf238(); // calls vf34 on class394, params unknown - virtual void _vf23C(); // nullsub, params unknown - virtual void _vf240(); // nullsub, params unknown - virtual int _vf244(); // returns 0. might be bool. params unknown - virtual int _vf248(int something); // does some math involving field510 and [7,7,4,0] and param - virtual void _vf24C(void *other); // deals with something in the class involving the bahp flag - virtual void _vf250(void *other); - virtual void _vf254(void *other); - virtual void _vf258(void *other); - virtual void _vf25C(void *other); // calls vf250 - virtual void _vf260(void *other); // AcPy/PlBase? plays the SE_EMY_FUMU_%d sounds based on some value - virtual void _vf264(dStageActor_c *other); // if other is player or yoshi, do Wm_en_hit and a few other things - virtual void _vf268(void *other); // AcPy/PlBase? plays the SE_EMY_DOWN_SPIN_%d sounds based on some value - virtual void spawnHitEffectAtPositionAgain(Vec2 pos); - virtual void playMameStepSound(); // SE_EMY_MAME_STEP at actor position - virtual void _vf274(); // nullsub, params unknown - virtual void _vf278(void *other); // AcPy/PlBase? plays the SE_EMY_YOSHI_FUMU_%d sounds based on some value - virtual void _vf27C(); // nullsub, params unknown - - ~dEn_c(); -}; - - -class daEnBlockMain_c : public dEn_c { -public: - Physics physics; - float _618, _61C, _620; - u32 _624, _628, _62C; - float initialY; - float _634, _638, _63C, _640; - u32 countdown, _648, _64C; - u32 _650, _654, _658, _65C; - u16 _660; - u8 _662, _663, _664, _665, _666, _667; - u8 _668, _669, _66A, _66B, _66C, _66D, _66E, _66F; - u8 _670, _671, _672, _673; - u8 _674; - u8 _675, _676, _677, _678, _679, _67A, _67B, _67C; - u8 _67D, _67E, _67F, _680; - u32 _684; - u8 _688, isGroundPound, anotherFlag, _68B, _68C, _68D, _68E, _68F; - u32 _690; - u8 _694; - - // Regular methods - void blockInit(float initialY); - void blockUpdate(); - u8 blockResult(); - - virtual void calledWhenUpMoveBegins(); - virtual void calledWhenDownMoveBegins(); - - virtual void calledWhenUpMoveExecutes(); - virtual void calledWhenUpMoveDiffExecutes(); - virtual void calledWhenDownMoveExecutes(); - virtual void calledWhenDownMoveEndExecutes(); - virtual void calledWhenDownMoveDiffExecutes(); - virtual void calledWhenDownMoveDiffEndExecutes(); - - virtual void updateScale(bool movingDown); - - // State functions - virtual void upMove_Begin(); - virtual void upMove_Execute(); - virtual void upMove_End(); - virtual void downMove_Begin(); - virtual void downMove_Execute(); - virtual void downMove_End(); - virtual void downMoveEnd_Begin(); - virtual void downMoveEnd_Execute(); - virtual void downMoveEnd_End(); - virtual void upMove_Diff_Begin(); - virtual void upMove_Diff_Execute(); - virtual void upMove_Diff_End(); - virtual void downMove_Diff_Begin(); - virtual void downMove_Diff_Execute(); - virtual void downMove_Diff_End(); - virtual void downMove_DiffEnd_Begin(); - virtual void downMove_DiffEnd_Execute(); - virtual void downMove_DiffEnd_End(); - - static void *PhysicsCallback1; - static void *PhysicsCallback2; - static void *PhysicsCallback3; - static void *OPhysicsCallback1; - static void *OPhysicsCallback2; - static void *OPhysicsCallback3; - - static State<daEnBlockMain_c> StateID_UpMove; - static State<daEnBlockMain_c> StateID_DownMove; - static State<daEnBlockMain_c> StateID_DownMoveEnd; - static State<daEnBlockMain_c> StateID_UpMove_Diff; - static State<daEnBlockMain_c> StateID_DownMove_Diff; - static State<daEnBlockMain_c> StateID_DownMove_DiffEnd; - - ~daEnBlockMain_c(); -}; - - -class dBgGm_c { -public: - // TODO TODO TODO TODO TODO - static dBgGm_c *instance; - - TileRenderer::List *getTileRendererList(int index); -}; - - -class dPlayerModelBase_c { - // dunno what's public and what's private here - // don't really care -public: - dPlayerModelBase_c(u8 player_id); // 800D5420 - virtual ~dPlayerModelBase_c(); // 800D55D0 - - char allocator[28]; // actually a mHeapAllocatorSubclass but I don't have that - u32 _20; - u32 _24; - char someAnimation[2][0x38]; // actually PlayerAnim's - char yetAnotherAnimation[40]; // actually m3d::banm_c afaics -- is it even 40 bytes? - Vec someVector[2]; // maybe not an array - Vec headOffs; - Vec scale; - u8 player_id_1; - u8 player_id_2; - u8 powerup_id; - u8 powerup_tex; - int current_anim; - int last_anim_maybe; - u32 _15C; - int someFlags; - u32 _164; - u32 _168; // related to jump_strings - u32 _16C; - u32 _170; - u32 _174; - u8 _178; - char padding[3]; // not needed? - u32 model_visibility_flags_maybe; - u32 mode_maybe; - float _184; - float _188; - u32 _18C; - char someArray[6][12]; // some unknown class/struct - char _1D8[0x24]; - short _1FC; - short _1FE; - short _200; - char padding_[2]; // not needed? - u32 _204; - u32 _208; - - virtual int _vf0C(); // 800D6DA0 - virtual void prepare(); // 800D5720 - virtual void finaliseModel(); // 800D5740 - virtual void update(); // 800D5750 - virtual void update3DStuff(); // 800D5760 - virtual void _vf20(); // 800D6D90 - virtual void draw(); // 800D5C70 - virtual int getCurrentModel(); // 800D5870 - virtual int getCurrentResFile(); // 800D62D0 - virtual void setPowerup(u8 powerup_id); // 800D5730 - virtual void setPowerupTexture(); // 800D5CC0 - virtual void _vf38(); // 800D6D80 - virtual void _vf3C(); // 800BD750 - virtual void _vf40(); // 800D6D70 - virtual void _vf44(); // 800D6D60 - virtual void _vf48(); // 800BD740 - virtual void _vf4C(); // 800BD730 - virtual void getModelMatrix(u32 unk, MtxPtr dest); // 800D5820 - virtual int _vf54(); // 80318D0C - virtual bool _vf58(int type, char *buf, bool unk); // 800D6930 - virtual void startAnimation(int id, float frame, float unk, float updateRate); // 800D5EC0 - virtual int _vf60(); // 800D6920 - virtual void _vf64(int id, float unk1, float unk2, float unk3); // 800D62F0 - virtual void _vf68(int id, float unk); // 800D63E0 - virtual void _vf6C(); // 800D62E0 - virtual void _vf70(); // 800D6690 - virtual void _vf74(); // 800D66A0 - virtual void _vf78(); // 800D66B0 - virtual void SomethingRelatedToPenguinAnims(); // 800D66C0 - virtual void _vf80(); // 800D6A20 - virtual void _vf84(float frame); // 800D5D00 - virtual void _vf88(float frame); // 800D5D70 - virtual void _vf8C(float updateRate); // 800D5D80 - virtual void setUpdateRateForAnim1(float updateRate); // 800D5DF0 - virtual void _vf94(); // 800D6D40 - virtual int _vf98(); // 800D6D30 - virtual void _vf9C(); // 800D6D20 - virtual int _vfA0(); // 800D6D10 - virtual void _vfA4(); // 800D6D00 - virtual int _vfA8(); // 800D6CF0 - virtual void _vfAC(bool blah); // 800BD720 - - // I won't even bother with non-virtual functions.... -}; - - -class dPlayerModelHandler_c { -public: - dPlayerModelHandler_c(u8 player_id); // 800D6DB0 - virtual ~dPlayerModelHandler_c(); // 800D6EF0 - - dPlayerModelBase_c *mdlClass; // might be dPlayerModel_c ? - - int loadModel(u8 player_id, int powerup_id, int unk); // 800D6EE0 - void update(); // 800D6F80 - void setMatrix(Mtx matrix); // 800D6FA0 - void setSRT(Vec position, S16Vec rotation, Vec scale); // 800D7030 - void callVF20(); // 800D70F0 - void draw(); // 800D7110 - -private: - int hasMatrix; // might be bool ? - - void allocPlayerClass(u8 player_id); // 800D6E00 -}; - - -class mTexture_c { -public: - mTexture_c(); // 802C0D20 - mTexture_c(u16 width, u16 height, GXTexFmt format); // 802C0D70 - - // vtable is at 80350450 - virtual ~mTexture_c(); // 802C0DB0 - virtual void setFlagTo1(); // 802C0E20 - - void setImageBuffer(void *buffer); // 802C0E30 - void load(GXTexMapID id); // 802C0E50 - void makeTexObj(GXTexObj *obj); // 802C0E90 - void flushDC(); // 802C0F10 - - void makeRadialGradient(); // 802C0F60 parameters unknown yet - void makeLinearGradient(int type, char size, u16 startPos, u16 endPos, - GXColor begin, GXColor end, bool startAtCenter); // 802C1120 - // "type" should be enum once I figure it out - // reverse might not be accurate - - void allocateBuffer(/* EGG::Heap */void *heap = 0); // 802C14D0 - - void plotPixel(u16 x, u16 y, GXColor pixel); // 802C1570 - - - u16 width; - u16 height; - u8 flags; - u8 format; - u8 wrapS; - u8 wrapT; - u8 minFilter; - u8 magFilter; - -private: - void *buffer; - void *myBuffer; -}; - - -class dDvdLoader_c { -public: - dDvdLoader_c(); // 8008F140 - virtual ~dDvdLoader_c(); // 8008F170 - - void *load(const char *filename, u8 unk = 0, void *heap = 0); // 8008F1B0 - - bool close(); // 8008F2B0 -- Frees command, DON'T USE THIS unless you free the buffer yourself - bool unload(); // 8008F310 -- Frees command and buffer, USE THIS - - int size; - void *command; // really mDvd_toMainRam_c - void *heap; // really EGG::Heap - void *buffer; - -private: - virtual void freeBuffer(); // 8008F380 - void freeCommand(); // 8008F3F0 -}; - - - -namespace nw4r { - namespace ut { - class CharWriter { - public: - CharWriter(); - ~CharWriter(); - - void SetupGX(); - - void SetFontSize(float w, float h); - void SetFontSize(float v); - float GetFontWidth() const; - float GetFontHeight() const; - float GetFontAscent() const; - float GetFontDescent() const; - - // returns width - float Print(ushort character); - - void PrintGlyph(float, float, float, /* nw4r::ut::Glyph const & */ void*); - - void UpdateVertexColor(); - - private: - void SetupGXWithColorMapping(Color c1, Color c2); - - public: - Color colors[8]; // todo: document - u32 modeOfSomeKind; - float scaleX; - float scaleY; - float posX; - float posY; - float posZ; - GXTexFilter minFilt; - GXTexFilter magFilt; - u16 completelyUnknown; - u8 alpha; - u8 isFixedWidth; - float fixedWidthValue; - /* ResFont* */ void *font; - }; - - // actually TextWriterBase<w>, but ... - class TextWriter : public CharWriter { - public: - TextWriter(); - ~TextWriter(); - - float GetLineHeight() const; - - // left out most of these to avoid all the format string vararg bullshit - float CalcStringWidth(wchar_t const *string, int length) const; - - float Print(wchar_t const *string, int length); - - float CalcLineWidth(wchar_t const *string, int length); - - float GetLineSpace() const; - - bool IsDrawFlagSet(ulong, ulong) const; - - float _4C; - float charSpace; - float somethingRelatedToLineHeight; - u32 _58; - u32 drawFlag; - void *tagProcessorMaybe; - }; - } -} - -// More layout crap -// This file REALLY needs to be reorganised. - -namespace nw4r { -namespace lyt { - - class ResourceAccessor { - public: - ResourceAccessor(); - virtual ~ResourceAccessor(); - - virtual void *GetResource(u32 dirKey, const char *filename, u32 *sizePtr) = 0; - virtual void *GetFont(const char *name); - }; - - class ArcResourceAccessor : public ResourceAccessor { - public: - ArcResourceAccessor(); - ~ArcResourceAccessor(); - - bool Attach(void *data, const char *rootDirName); - void *GetResource(u32 dirKey, const char *filename, u32 *sizePtr); - void *GetFont(const char *name); - - ARCHandle arc; - u32 unk_20; - ut::LinkList list; // 0x24 - char rootDirName[0x80]; // 0x30 - // class ends at 0xB0 - }; - -} -} - -namespace m2d { - class ResAcc_c { - public: - ResAcc_c(); - virtual ~ResAcc_c(); - virtual void initialSetup(); - - nw4r::lyt::ResourceAccessor *resAccPtr; // 0x04 - u32 unk_08; // 0x08 - nw4r::lyt::ArcResourceAccessor resAcc; // 0x0C - // class ends at 0xBC - }; - - class ResAccLoader_c : public ResAcc_c { - public: - ResAccLoader_c(); - ~ResAccLoader_c(); - - void *buffer; - dDvdLoader_c loader; // 0xC0 - // ends at 0xD4 - - bool loadArc(const char *path); - bool loadArc(const char *path, u8 unk); - void free(); - }; - - class EmbedLayoutBase_c : public Base_c { - public: - EmbedLayoutBase_c(); - ~EmbedLayoutBase_c(); - - void draw(); // don't call this directly - - virtual void update(); - virtual bool build(const char *brlytPath, ResAcc_c *resAcc = 0); - - nw4r::lyt::Pane *getRootPane(); - nw4r::lyt::Pane *findPaneByName(const char *name) const; - nw4r::lyt::TextBox *findTextBoxByName(const char *name) const; - nw4r::lyt::Pane *findPictureByName(const char *name) const; // TODO: change to others - nw4r::lyt::Pane *findWindowByName(const char *name) const; - - void animate(); - void calculateMtx(); - - nw4r::lyt::Layout layout; // 0x10 -- actually m2d::Layout_c but I'll add that later - nw4r::lyt::DrawInfo drawInfo; // 0x30 - void *unk_84; // 0x84 -- a ResAcc? referenced in Build() - float posX; // 0x88 - float posY; // 0x8C - float clipX; // 0x90 - float clipY; // 0x94 - float clipWidth; // 0x98 - float clipHeight; // 0x9C - bool clippingEnabled; // 0xA0 - u32 hasAnimations; // 0xA4 - u32 unk_A8; // 0xA8 - }; - - class EmbedLayout_c : public EmbedLayoutBase_c { - public: - EmbedLayout_c(); - ~EmbedLayout_c(); - - bool build(const char *brlytPath, ResAcc_c *resAcc = 0); - - bool loadArc(const char *name, bool isLangSpecific); - bool loadArc(const char *name, u8 unk, bool isLangSpecific); - - bool loadArcForRegion(const char *name); // uses EU/Layout/$name - - // there's also a NedEU one, but should it really be listed here...? - - bool free(); - - // does NSMBW even use consts? I have no idea. maybe not - - void getPanes(const char **names, nw4r::lyt::Pane *output, int count) const; - void getWindows(const char **names, nw4r::lyt::Pane *output, int count) const; // TODO: change to others - void getPictures(const char **names, nw4r::lyt::Pane *output, int count) const; - void getTextBoxes(const char **names, nw4r::lyt::TextBox *output, int count) const; - - void setLangStrings(const char **names, const int *msgIDs, int category, int count); - - void loadAnimations(const char **names, int count); - void loadGroups(const char **names, int *animLinkIDs, int count); - - void enableNonLoopAnim(int num, bool goToLastFrame = false); - void enableLoopAnim(int num); - void resetAnim(int num, bool goToLastFrame = false); - void disableAnim(int num); - void disableAllAnimations(); - - bool isAnimOn(int num = -1); - bool isAnyAnimOn(); - - void execAnimations(); - - ResAccLoader_c loader; // 0xAC - void *brlanHandlers; // 0x180 - void *grpHandlers; // 0x184 - bool *animsEnabled; // 0x188 - int brlanCount; // 0x18C - int grpCount; // 0x190 - int lastAnimTouched; // 0x194 - - private: - void fixTextBoxesRecursively(nw4r::lyt::Pane *pane); - }; -} - - - -/* Tilemap related stuff */ -class TilemapClass { - public: - virtual ~TilemapClass(); - - u16 *allocatedBlocks[256]; - u32 _404; - - u8 blockLookup[2048]; - - u16 blockCount; - - u32 _C0C; - u32 ts1ID, ts2ID, ts3ID, layerID, areaID, frmHeap, is2Castle; - - // Only the public API is listed - u16 *getPointerToTile(int x, int y, u32 *blockNum = 0, bool unkBool = 0); - // TODO: more? -}; - -class BGDatClass { - public: - BGDatClass(); - virtual ~BGDatClass(); - - u8 *bgData[4][3]; - TilemapClass *tilemaps[4][3]; - u8 *tsObjIndexData[4][4]; - u8 *tsObjData[4][4]; - char tsNames[4][4][0x20]; - // this is fucked up! - // the parent heap is frmHeaps[0][0] - // each tileset's heap is frmHeaps[AREA][LAYER+1] - void *frmHeaps[4][4]; - - static BGDatClass *instance; // 8042A0D0 - - // I've only listed the public API because other stuff isn't really needed atm. - const char *getTilesetName(int area, int number); - // TODO: more? -}; - -struct BGRender { - u8 unk[0xC00]; - u8 *objectData; - u8 _C04, _C05; - u16 _C06, _C08; - u16 blockNumber; - u16 curX, curY; - u16 tileToPlace; - u16 objDataOffset, objType, objX, objY, objWidth, objHeight; - u16 tileNumberWithinBlock, areaID; -}; - -#endif - +#ifndef __KAMEK_GAME_H
+#define __KAMEK_GAME_H
+
+//#define offsetof(type, member) ((__std(size_t)) &(((type *) 0)->member))
+
+#include <common.h>
+#include <rvl/mtx.h>
+#include <rvl/GXEnum.h>
+#include <rvl/vifuncs.h>
+#include <rvl/arc.h>
+#define offsetof(type, member) ((u32) &(((type *) 0)->member))
+
+
+extern "C" {
+int strlen(const char *str);
+
+float atan(float x);
+float atan2(float y, float x);
+
+float cos(float x);
+float sin(float x);
+}
+
+bool DVD_Start();
+bool DVD_End();
+bool DVD_StillLoading(void *dvdclass2);
+void DVD_LoadFile(void *dvdclass, char *folder, char *file, void *callbackData);
+void DVD_FreeFile(void *dvdclass2, char *file);
+
+extern void *DVDClass;
+
+inline void *GetDVDClass() {
+ return DVDClass;
+}
+
+inline void *GetDVDClass2() {
+ return (void*)(((u32)GetDVDClass())+4);
+}
+
+void *DVD_GetFile(void *dvdclass2, const char *arc, const char *file);
+void *DVD_GetFile(void *dvdclass2, const char *arc, const char *file, u32 *length);
+
+int MakeRandomNumber(int count);
+int MakeRandomNumberForTiles(int count);
+
+
+extern int Player_Active[4];
+extern int Player_ID[4];
+extern int Player_Powerup[4];
+extern int Player_Flags[4];
+extern int Player_Lives[4];
+extern int Player_Coins[4];
+
+struct StartLevelInfo {
+ int maybeUnused;
+ unsigned char unk1; // 0x04
+ unsigned char unk2; // 0x05
+ unsigned char unk3; // 0x06
+ unsigned char unk4; // 0x07
+ unsigned int purpose; // 0x08
+ unsigned char world1; // 0x0C
+ unsigned char level1; // 0x0D
+ unsigned char world2; // 0x0E
+ unsigned char level2; // 0x0F
+};
+
+extern void *GameMgr;
+inline void *GetGameMgr() {
+ return GameMgr;
+}
+
+bool QueryPlayerAvailability(int id);
+void DoStartLevel(void *gameMgr, StartLevelInfo *sl);
+void SetSomeConditionShit(int world, int level, unsigned int bits);
+
+bool IsWideScreen();
+
+#define GAMEMGR_GET_AFC(gmgr) (*((bool*)(((u32)(gmgr))+0xAFC)))
+
+
+#define COND_COIN1 1
+#define COND_COIN2 2
+#define COND_COIN3 4
+#define COND_NORMAL 0x10
+#define COND_SECRET 0x20
+#define COND_SGNORMAL 0x80
+#define COND_SGSECRET 0x100
+
+class SaveFirstBlock {
+public:
+ char titleID[4]; // 0x00
+ u8 field_00; // 0x04
+ u8 field_01; // 0x05
+ u8 current_file; // 0x06
+ u8 field_03; // 0x07
+ u16 freemode_fav[10][0x2A]; // 0x08
+ u16 coinbtl_fav[10][0x2A]; // 0x350
+ u16 bitfield; // 0x698
+ u16 field_69A; // 0x69A
+ u32 checksum; // 0x69C
+};
+
+class SaveBlock {
+public:
+ u8 field_00; // 0x00
+ u8 field_01; // 0x01
+ u8 bitfield; // 0x02
+ u8 current_world; // 0x03
+ u8 field_04; // 0x04
+ u8 current_path_node; // 0x05
+ u8 field_06; // 0x06
+ u8 switch_on; // 0x07
+ u8 field_08; // 0x08
+ u8 powerups_available[7]; // 0x09
+ u8 toad_level_idx[10]; // 0x10
+ u8 player_continues[4]; // 0x1A
+ u8 player_coins[4]; // 0x1E
+ u8 player_lives[4]; // 0x22
+ u8 player_flags[4]; // 0x26
+ u8 player_type[4]; // 0x2A
+ u8 player_powerup[4]; // 0x2E
+ u8 worlds_available[10]; // 0x32
+ u32 ambush_countdown[10]; // 0x3C
+ u16 field_64; // 0x64
+ u16 credits_hiscore; // 0x66
+ u16 score; // 0x68
+ u32 completions[10][0x2A]; // 0x6C
+ u8 hint_movie_bought[70]; // 0x6FC
+ u8 toad_location[10]; // 0x742
+ u8 field_74C[10][4]; // 0x74C
+ u8 field_774[10][4]; // 0x774
+ u8 field_79C[10][4]; // 0x79C
+ u8 death_counts[10][0x2A]; // 0x7C4
+ u8 death_count_3_4_switch; // 0x968
+ u8 pad[0x13]; // 0x969
+ u32 checksum; // 0x97C
+
+ u32 GetLevelCondition(int world, int level);
+ bool CheckLevelCondition(int world, int level, int cond);
+ bool CheckIfCoinCollected(int world, int level, int num);
+};
+
+class SaveFile {
+public:
+ u32 field_00;
+ u32 field_04;
+ u32 field_08;
+ u32 field_0C;
+ u32 field_10;
+ u32 field_14;
+ u32 field_18;
+ u32 field_1C;
+
+ // Real Savefile starts here
+ SaveFirstBlock header;
+ SaveBlock blocks[3];
+ SaveBlock quickSave[3];
+
+ SaveBlock *GetBlock(int id);
+ SaveBlock *GetQSBlock(int id);
+
+ bool CheckIfWriting(); // 0x800E0540
+};
+
+class SaveHandler {
+public:
+ u8 unknown[0x70];
+ u32 CurrentState;
+ u32 CurrentError;
+ u32 field_7C;
+};
+
+extern SaveFile *SaveFileInstance;
+extern SaveHandler *SaveHandlerInstance;
+
+inline SaveFile *GetSaveFile() {
+ return SaveFileInstance;
+}
+
+inline SaveHandler *GetSaveHandler() {
+ return SaveHandlerInstance;
+}
+
+#define WPAD_DOWN 0x0001 // Actually Left, but rotated
+#define WPAD_UP 0x0002 // Actually Right, but rotated
+#define WPAD_RIGHT 0x0004 // Actually Down, but rotated
+#define WPAD_LEFT 0x0008 // Actually Up, but rotated
+#define WPAD_PLUS 0x0010
+#define WPAD_TWO 0x0100
+#define WPAD_ONE 0x0200
+#define WPAD_B 0x0400
+#define WPAD_A 0x0800
+#define WPAD_MINUS 0x1000
+#define WPAD_HOME 0x8000
+
+struct RemoconMngClass {
+ void *vtable;
+ void *controllers[4];
+};
+
+/*
+ * Ok, here's how the remocon/wiimote shit works:
+ * Remocon is a NSMB-specific class, it handles the different control methods
+ * and D-pad directions and such automatically.
+ *
+ * Wiimote is a generic class (part of EGG) -- well it's not actually called
+ * that, but who cares. It handles different types of controllers. Only
+ * query it if whatever you're accessing is control type dependent.
+ */
+
+extern RemoconMngClass *RemoconMng;
+extern int ActiveWiimoteID;
+extern void *ActiveWiimote;
+
+inline RemoconMngClass *GetRemoconMng() {
+ return RemoconMng;
+}
+
+inline int GetActiveWiimoteID() {
+ return ActiveWiimoteID;
+}
+
+inline void *GetActiveRemocon() {
+ return GetRemoconMng()->controllers[GetActiveWiimoteID()];
+}
+
+inline void *GetActiveWiimote() {
+ return ActiveWiimote;
+}
+
+inline unsigned int Remocon_GetButtons(void *self) {
+ return *((unsigned int*)((u32)self+0x18));
+}
+
+inline unsigned int Remocon_GetPressed(void *self) {
+ return *((unsigned int*)((u32)self+0x1C));
+}
+
+typedef bool (*__Wiimote_TestButtons_type)(void*, unsigned int);
+inline bool Wiimote_TestButtons(void *self, unsigned int btns) {
+ VF_BEGIN(__Wiimote_TestButtons_type, self, 8, 0)
+ return VF_CALL(self, btns);
+ VF_END;
+}
+
+int SearchForIndexOfPlayerID(int id);
+
+bool CheckIfContinueShouldBeActivated();
+
+bool CheckIfMenuShouldBeCancelledForSpecifiedWiimote(int num);
+
+void StartTitleScreenStage(bool realDemo, int sceneParam);
+
+bool CheckIfWeCantDoStuff();
+
+u32 QueryGlobal5758(u32 check);
+
+void SaveGame(void *classDoesntMatter, bool isQuick);
+
+#include <actors.h>
+void *CreateParentedObject(short classID, void *parent, int settings, char something);
+void *CreateChildObject(short classID, void *parent, int settings, int unk1, int unk2);
+
+
+#define WIPE_FADE 0
+#define WIPE_CIRCLE 1
+#define WIPE_BOWSER 2
+#define WIPE_WAVY 3
+#define WIPE_MARIO 4
+#define WIPE_CIRCLE_s 5
+
+void ActivateWipe(int type);
+
+typedef void (*ScreenDrawFunc)();
+
+extern ScreenDrawFunc *CurrentDrawFunc;
+void WorldMapDrawFunc();
+void GameSetupDrawFunc();
+
+void GameSetup__LoadScene(void *self); // 0x80919560
+void FreeScene(int id);
+
+void WpadShit(int unk); // 0x8016F780
+
+void *BgTexMng__LoadAnimTile(void *self, int tileset, short tile, char *name, char *delays, char reverse); // 0x80087B60
+
+extern void *GameHeaps[];
+
+
+class dFlagMgr_c {
+public:
+ dFlagMgr_c();
+
+ enum ActionFlag {
+ ACTIVATE = 1,
+ TICKS = 2
+ };
+
+ u64 flags;
+ float _8[64], _108[64];
+ u8 _208[64];
+ u64 _248[64];
+ u8 _448[64];
+
+ u32 ticksRemainingForAction[64];
+ u8 actionFlag[64];
+ u32 _5C8[64]; // somehow sound related?! assigned by last param to set(); only checked for == 0
+ u8 _6C8; // assigned -1 by FlagMgr, and other values by the Switch object, nothing else though
+
+ void setup(bool isNewLevel);
+ void applyAndClearAllTimedActions(); // only used when setup(true) is called
+ void execute();
+
+ void set(u8 number, int delay, bool activate, bool reverseEffect, bool makeNoise, u32 unknown=0);
+
+ u8 findLowestFlagInSet(u32 unk, u64 set);
+
+ void setSpecial(u8 number, float to8, float to108, u8 to208, u32 unk, u64 to248);
+ float get8(u8 number);
+ float get108(u8 number);
+ u8 get208(u8 number);
+ u64 get248(u8 number);
+ u8 get448(u8 number);
+
+ // convenience inline functions which may or may not actually exist in Nintendo's original code
+ u64 mask(u8 number) { return (u64)1 << number; }
+ bool active(u8 number) { return (flags & mask(number)) != 0; }
+ bool inactive(u8 number) { return (flags & mask(number)) == 0; }
+
+ static dFlagMgr_c *instance;
+};
+
+
+namespace nw4r {
+
+namespace ut {
+ // this isn't 100% accurate because it doesn't use templates
+ // or detail::LinkListImpl, but oh well
+ // I don't need the methods anyway.
+
+ class LinkListNode {
+ public:
+ LinkListNode *next;
+ LinkListNode *prev;
+ };
+
+ class LinkList {
+ public:
+ int count;
+ LinkListNode initialNode;
+ };
+
+ class Color : public GXColor { };
+
+ class Rect {
+ public:
+ f32 left;
+ f32 top;
+ f32 right;
+ f32 bottom;
+ };
+
+ template <class T>
+ class TagProcessorBase { };
+}
+
+namespace lyt {
+ class Pane; // forward declaration
+ class DrawInfo;
+
+ class AnimTransform; // I'll do these later
+ class AnimResource;
+ class AnimationLink;
+ class ResourceAccessor;
+ class GroupContainer;
+
+ class Layout {
+ public:
+ Layout();
+ virtual ~Layout();
+
+ virtual bool Build(const void *data, ResourceAccessor *resAcc);
+
+ virtual AnimTransform *CreateAnimTransform();
+ virtual AnimTransform *CreateAnimTransform(const void *data, ResourceAccessor *resAcc);
+ virtual AnimTransform *CreateAnimTransform(const AnimResource &res, ResourceAccessor *resAcc);
+
+ virtual void BindAnimation(AnimTransform *anim);
+ virtual void UnbindAnimation(AnimTransform *anim);
+ virtual void UnbindAllAnimation();
+ virtual bool BindAnimationAuto(const AnimResource &res, ResourceAccessor *resAcc);
+
+ virtual void SetAnimationEnable(AnimTransform *anim, bool unk);
+
+ virtual void CalculateMtx(const DrawInfo &info);
+
+ virtual void/*?*/ Draw(const DrawInfo &info);
+ virtual void/*?*/ Animate(ulong flag);
+
+ virtual void/*?*/ SetTagProcessor(ut::TagProcessorBase<wchar_t> *tagProc);
+
+ ut::LinkList animations;
+
+ Pane *rootPane;
+ GroupContainer *groupContainer;
+
+ float width;
+ float height;
+ };
+
+
+ class DrawInfo {
+ public:
+ DrawInfo();
+ virtual ~DrawInfo();
+
+ Mtx matrix;
+ float left;
+ float top;
+ float right;
+ float bottom;
+ float scaleX;
+ float scaleY;
+ float alpha;
+ u8 _50; // this is actually a bitfield. todo: investigate how CW handles bitfields, and so on
+ };
+
+
+ class Material {
+ public:
+ // ...
+ };
+
+ class Pane {
+ public:
+ //Pane(nw4r::lyt::res::Pane const *); // todo: this struct
+ Pane(void *);
+ virtual ~Pane();
+
+ virtual void *GetRuntimeTypeInfo() const;
+ virtual void CalculateMtx(const DrawInfo &info);
+
+ virtual void Draw(const DrawInfo &info);
+ virtual void DrawSelf(const DrawInfo &info);
+ virtual void Animate(ulong flag);
+ virtual void AnimateSelf(ulong flag);
+
+ virtual ut::Color GetVtxColor(ulong id) const;
+ virtual void SetVtxColor(ulong id, ut::Color color);
+ virtual uchar GetColorElement(ulong id) const;
+ virtual void SetColorElement(ulong id, uchar value);
+ virtual uchar GetVtxColorElement(ulong id) const;
+ virtual void SetVtxColorElement(ulong id, uchar value);
+
+ virtual Pane *FindPaneByName(const char *name, bool recursive);
+ virtual Material *FindMaterialByName(const char *name, bool recursive);
+
+ virtual void/*?*/ BindAnimation(AnimTransform *anim, bool unk1, bool unk2);
+ virtual void UnbindAnimation(AnimTransform *anim, bool unk);
+ virtual void UnbindAllAnimation(bool unk);
+ virtual void UnbindAnimationSelf(AnimTransform *anim);
+
+ virtual ut::LinkListNode *FindAnimationLinkSelf(AnimTransform *anim);
+ virtual ut::LinkListNode *FindAnimationLinkSelf(const AnimResource &anim);
+
+ virtual void SetAnimationEnable(AnimTransform *anim, bool unk1, bool unk2);
+ virtual void SetAnimationEnable(const AnimResource &anim, bool unk1, bool unk2);
+
+ virtual ulong GetMaterialNum() const;
+ virtual Material *GetMaterial() const;
+ virtual Material *GetMaterial(ulong id) const;
+
+ virtual void LoadMtx(const DrawInfo &info);
+
+ void AppendChild(Pane *child);
+
+ ut::Rect GetPaneRect(const DrawInfo &info) const;
+
+ ut::LinkListNode *AddAnimationLink(AnimationLink *link);
+
+ Vec2 GetVtxPos() const;
+
+
+ ut::LinkListNode parentLink;
+ Pane *parent;
+
+ ut::LinkList children;
+ ut::LinkList animations;
+
+ Material *material;
+
+ Vec trans;
+ Vec rotate;
+ Vec2 scale;
+ Vec2 size;
+
+ Mtx calcMtx;
+ Mtx effectiveMtx;
+
+ float _B4;
+
+ u8 alpha;
+ u8 effectiveAlpha;
+ u8 origin;
+ u8 flag;
+
+ char name[0x11];
+ char userdata[8];
+
+ u8 _D5;
+ u8 paneIsOwnedBySomeoneElse;
+ u8 _D7;
+ };
+
+ class TextBox : public Pane {
+ public:
+ TextBox(void *, void *); // todo: TextBox((res::TextBox const *,ResBlockSet const &))
+ ~TextBox();
+
+ void *GetRuntimeTypeInfo() const;
+
+ void DrawSelf(const DrawInfo &info);
+
+ ut::Color GetVtxColor(ulong id) const;
+ void SetVtxColor(ulong id, ut::Color color);
+ uchar GetVtxColorElement(ulong id) const;
+ void SetVtxColorElement(ulong id, uchar value);
+
+ virtual void LoadMtx(const DrawInfo &info);
+
+ virtual void AllocStringBuffer(u16 size);
+ virtual void FreeStringBuffer();
+
+ virtual u16 SetString(const wchar_t *str, u16 destOffset = 0);
+ virtual u16 SetString(const wchar_t *str, u16 destOffset, u16 length);
+
+ wchar_t *stringBuf;
+
+ ut::Color colour1, colour2;
+ void *font; // actually a ut::ResFont or whatever
+
+ float fontSizeX, fontSizeY;
+ float lineSpace, charSpace;
+
+ void *tagProc; // actually a TagProcessor
+
+ u16 bufferLength;
+ u16 stringLength;
+
+ u8 alignment;
+ u8 flags;
+ };
+}
+
+
+
+namespace g3d {
+struct CameraData
+{
+enum Flag
+ {
+FLAG_CAMERA_LOOKAT = 0x00000001,
+FLAG_CAMERA_ROTATE = 0x00000002,
+FLAG_CAMERA_AIM = 0x00000004,
+MASK_CAMERA = 0x00000007,
+
+FLAG_CMTX_VALID = 0x00000008,
+
+FLAG_PROJ_FLUSTUM = 0x00000010,
+FLAG_PROJ_PERSP = 0x00000020,
+FLAG_PROJ_ORTHO = 0x00000040,
+MASK_PROJ = 0x00000070,
+
+FLAG_PMTX_VALID = 0x00000080,
+
+FLAG_VIEWPORT_JITTER_ABOVE = 0x00000100
+ };
+
+Mtx cameraMtx;
+Mtx44 projMtx;
+
+u32 flags;
+
+VEC3 cameraPos;
+VEC3 cameraUp;
+VEC3 cameraTarget;
+VEC3 cameraRotate;
+f32 cameraTwist;
+
+GXProjectionType projType;
+f32 projFovy;
+f32 projAspect;
+f32 projNear;
+f32 projFar;
+f32 projTop;
+f32 projBottom;
+f32 projLeft;
+f32 projRight;
+
+f32 lightScaleS;
+f32 lightScaleT;
+f32 lightTransS;
+f32 lightTransT;
+
+VEC2 viewportOrigin;
+VEC2 viewportSize;
+f32 viewportNear;
+f32 viewportFar;
+
+u32 scissorX;
+u32 scissorY;
+u32 scissorWidth;
+u32 scissorHeight;
+
+s32 scissorOffsetX;
+s32 scissorOffsetY;
+};
+
+/* Correct camera
+cameraMtx:
+1.0 0.0 0.0 -0.0
+0.0 1.0 0.0 -0.0
+0.0 0.0 1.0 -6000.0
+
+projMtx:
+0.002345 0.000000 0.000000 -1.000000
+0.000000 0.004386 0.000000 -1.000000
+0.000000 0.000000 -0.000005 -0.500000
+0.000000 0.000000 0.000000 1.000000
+
+flags: 000000C9 : FLAG_CAMERA_LOOKAT | FLAG_CMTX_VALID | FLAG_PROJ_ORTHO | FLAG_PMTX_VALID
+
+cameraPos: {0, 0, 15}
+cameraUp: {0, 1, 0}
+cameraTarget: {0, 0, 0}
+cameraRotate: {0, 0, 0}
+cameraTwist: 0
+
+projType: 1
+projFovy: 60
+projAspect: 1.333333
+projNear: -100000
+projFar: 100000
+projTop: 456
+projBottom: 0
+projLeft: 0
+projRight: 853
+
+lightScaleS: 0.5
+lightScaleT: 0.5
+lightTransS: 0.5
+lightTransT: 0.5
+
+viewportOrigin: {0,0}
+viewportSize: {640,456}
+viewportNear: 0
+viewportFar: 1
+
+scissorX: 0
+scissorY: 0
+scissorWidth: 0x280
+scissorHeight: 0x1C8
+
+scissorOffsetX: 0
+scissorOffsetY: 0
+*/
+
+class Camera {
+public:
+ enum PostureType { POSTURE_LOOKAT, POSTURE_ROTATE, POSTURE_AIM };
+ struct PostureInfo
+ {
+ PostureType tp;
+ VEC3 cameraUp;
+ VEC3 cameraTarget;
+ VEC3 cameraRotate;
+ f32 cameraTwist;
+ };
+private:
+ CameraData *data;
+public:
+ Camera(CameraData *pCamera);
+ void Init();
+ void Init(u16 efbWidth, u16 efbHeight, u16 xfbWidth, u16 xfbHeight, u16 viWidth, u16 viHeight);
+ //void SetPosition(f32 x, f32 y, f32 z);
+ void SetPosition(const VEC3 &pos);
+ //void GetPosition(f32 *px, f32 *py, f32 *pz) const;
+ void GetPosition(VEC3 *pPos) const;
+ void SetPosture(const PostureInfo &info);
+ //void GetPosture(PostureInfo *info) const;
+ void SetCameraMtxDirectly(const Mtx &mtx);
+ void GetCameraMtx(Mtx *pMtx) const;
+ void SetOrtho(f32 top, f32 bottom, f32 left, f32 right, f32 near, f32 far);
+ //void SetFrustum(f32 top, f32 bottom, f32 left, f32 right, f32 near, f32 far);
+ void SetPerspective(f32 fovy, f32 aspect, f32 near, f32 far);
+ void SetProjectionMtxDirectly(const Mtx44 *pMtx);
+ void GetProjectionMtx(Mtx44 *pMtx) const;
+ //GXProjectionType GetProjectionType() const;
+ void SetScissor(u32 xOrigin, u32 yOrigin, u32 width, u32 height);
+ void SetScissorBoxOffset(s32 xOffset, s32 yOffset);
+ //void GetScissor(u32 *xOrigin, u32 *yOrigin, u32 *width, u32 *height);
+ void SetViewport(f32 xOrigin, f32 yOrigin, f32 width, f32 height);
+ //void SetViewport(f32 xOrigin, f32 yOrigin, f32 width, f32 height, f32 near, f32 far);
+ void SetViewportZRange(f32 near, f32 far);
+ void SetViewportJitter(u32 field);
+ //void SetViewportJitter(f32 xOrigin, f32 yOrigin, f32 width, f32 height, f32 near, f32 far, u32 field);
+ void GetViewport(f32 *xOrigin, f32 *yOrigin, f32 *width, f32 *height, f32 *near, f32 *far) const;
+ void GXSetViewport() const;
+ void GXSetProjection() const;
+ void GXSetScissor() const;
+ void GXSetScissorBoxOffset() const;
+};
+
+namespace G3DState {
+ GXRenderModeObj *GetRenderModeObj();
+}
+}
+}
+
+
+nw4r::g3d::CameraData *GetCameraByID(int id);
+
+int GetCurrentCameraID(); // 80164C80
+void SetCurrentCameraID(int id); // 80164C90
+
+void LinkScene(int id); // 80164D50
+void UnlinkScene(int id); // 80164CD0
+
+void SceneCalcWorld(int sceneID); // 80164E10
+void SceneCameraStuff(int sceneID); // 80164EA0
+
+void CalcMaterial(); // 80164E90
+void DrawOpa(); // 80164F70
+void DrawXlu(); // 80164F80
+
+bool ChangeAlphaUpdate(bool enable); // 802D3270
+
+void DoSpecialDrawing1(); // 8006CAE0
+void DoSpecialDrawing2(); // 8006CB40
+
+void SetupLYTDrawing(); // 80163360
+void ClearLayoutDrawList(); // 801632B0
+
+void DrawAllLayoutsBeforeX(int x); // 80163440
+void DrawAllLayoutsAfterX(int x); // 801634D0
+void DrawAllLayoutsAfterXandBeforeY(int x, int y); // 80163560
+
+void RenderEffects(int v1, int v2); // 80093F10
+
+void RemoveAllFromScnRoot(); // 80164FB0
+void Reset3DState(); // 80165000
+
+extern "C" void GXDrawDone(); // 801C4FE0
+
+
+
+namespace m2d {
+ class Base_c /*: public nw4r::ut::Link what's this? */ {
+ public:
+ u32 _00;
+ u32 _04;
+
+ Base_c();
+ virtual ~Base_c();
+ virtual void draw(); // don't call this directly
+
+ void scheduleForDrawing();
+
+ u8 drawOrder;
+ };
+
+ class Simple_c : public Base_c {
+ public:
+ nw4r::lyt::Layout layout;
+ nw4r::lyt::DrawInfo drawInfo;
+
+ u32 _84;
+ float _88;
+ float _8C;
+ float _90;
+ u32 _94;
+
+ Simple_c();
+ ~Simple_c();
+
+ void draw();
+ virtual void _vf10();
+ virtual void _vf14();
+ };
+}
+
+
+
+namespace EGG {
+ class Frustum {
+ public:
+ GXProjectionType projType;
+ int isCentered;
+ float width;
+ float height;
+ float fovy;
+ float dunno;
+ float near;
+ float far;
+ float center_x_maybe;
+ float center_y_maybe;
+ float x_direction;
+ float unk2;
+ float unk3;
+ short some_flag_bit;
+
+
+ // isCentered might actually be isNotCentered, dunno
+ Frustum(GXProjectionType projType, Vec2 size, bool isCentered, float near, float far); // 802C6D20
+ Frustum(Frustum &f); // 802C6D90
+ virtual ~Frustum(); // 802C75F0
+
+ virtual void loadDirectly(); // 802C7050
+ virtual void loadIntoCamera(nw4r::g3d::Camera cam); // 802C7070
+
+ void setOrtho(float top, float bottom, float left, float right, float near, float far); // 802C6DD0
+
+ void setFovy(float newFovy); // 802C6F60
+
+ void getCenterPointsBasedOnPos(float x, float y, float *destX, float *destY); // 802C6FD0
+
+ // no idea what this does
+ float getSomethingForPerspective(float blah); // 802C7020
+
+
+ protected:
+ // not all of these might be protected, dunno
+
+ void copyAllFields(Frustum &f); // 802C6EE0
+
+ void saveSomething(float f1, float f2, float f3, float f4); // 802C70C0
+ void loadSomething(float *f1, float *f2, float *f3, float *f4); // 802C70E0
+
+ void loadPerspective(); // 802C7110
+ void loadOrtho(); // 802C7140
+
+ void setCameraPerspective(nw4r::g3d::Camera cam); // 802C7170
+ void setCameraOrtho(nw4r::g3d::Camera cam); // 802C71E0
+
+ void getPerspectiveProjMtx(Mtx44 *mtx); // 802C7250
+ void getPerspectiveProjv(float *ptr); // 802C72E0
+ void getOrthoProjv(float *ptr); // 802C73A0
+
+ void getOrthoVars(float *top, float *bottom, float *left, float *right); // 802C7480
+ };
+}
+
+
+class TileRenderer {
+public:
+ TileRenderer();
+ ~TileRenderer();
+
+ TileRenderer *list1, *list2;
+ u16 tileNumber;
+ u8 unkFlag, someBool;
+ float x, y, z;
+ float scale;
+ s16 rotation;
+ u8 unkByte;
+
+ u16 getTileNum();
+ bool getSomeBool();
+ void setSomeBool(u8 value);
+
+ float getX();
+ float getY();
+ float getZ();
+ void setPosition(float x, float y);
+ void setPosition(float x, float y, float z);
+
+ u8 getUnkFlag();
+
+ void setVars(float scale); // sets unkFlag=1, rotation=0, unkByte=0
+ void setVars(float scale, s16 rotation); // sets unkFlag=2, unkByte=0
+
+ float getScale();
+ float getRotationFloat();
+ s16 getRotation();
+
+ u8 getUnkByte();
+
+ class List {
+ public:
+ u32 count;
+ TileRenderer *first, *last; // order?
+
+ void add(TileRenderer *r);
+ void remove(TileRenderer *r);
+ void removeAll();
+
+ List();
+ ~List();
+ };
+};
+
+class dActor_c; // forward declaration
+
+class Physics {
+public:
+ struct Unknown {
+ Unknown();
+ ~Unknown();
+
+ float x, y;
+ };
+
+ struct Info {
+ float x1, y1, x2, y2; // Might be distance to center/edge like APhysics
+ void *otherCallback1, *otherCallback2, *otherCallback3;
+ };
+
+ Physics();
+ ~Physics();
+
+ dActor_c *owner;
+ Physics *next, *prev;
+ u32 _C, _10, _14, _18, _1C, _20, _24, _28, _2C, _30, _34, _38, _3C;
+ void *otherCallback1, *otherCallback2, *otherCallback3;
+ void *callback1, *callback2, *callback3;
+ float lastX, lastY;
+ Unknown unkArray[4];
+ float x, y;
+ float _88, _8C, _90;
+ Vec lastActorPosition;
+ float _A0, _A4, last_A0, last_A4, _B0, _B4;
+ u32 _B8;
+ s16 *ptrToRotationShort;
+ s16 currentRotation;
+ s16 rotDiff;
+ s16 rotDiffAlt;
+ u32 isRound;
+ u32 _CC;
+ u32 flagsMaybe;
+ u32 _D4, _D8;
+ u8 isAddedToList, _DD, layer;
+ u32 id;
+
+ void addToList();
+ void removeFromList();
+
+ void baseSetup(dActor_c *actor, u32 t_40, u32 t_44, u32 t_48, u8 t_DD, u8 layer);
+
+ // note: Scale can be a null pointer (in that case, it'll use 1.0)
+ void setup(dActor_c *actor,
+ float x1, float y1, float x2, float y2,
+ void *otherCB1, void *otherCB2, void *otherCB3,
+ u8 t_DD, u8 layer, Vec2 *scale = 0);
+
+ void setup(dActor_c *actor,
+ Vec2 *p1, Vec2 *p2,
+ void *otherCB1, void *otherCB2, void *otherCB3,
+ u8 t_DD, u8 layer, Vec2 *scale = 0);
+
+ void setup(dActor_c *actor, Info *pInfo, u8 t_DD, u8 layer, Vec2 *scale = 0);
+
+ // radius might be diameter? dunno
+ void setupRound(dActor_c *actor,
+ float x, float y, float radius,
+ void *otherCB1, void *otherCB2, void *otherCB3,
+ u8 t_DD, u8 layer);
+
+ void setRect(float x1, float y1, float x2, float y2, Vec2 *scale = 0);
+ void setRect(Vec2 *p1, Vec2 *p2, Vec2 *scale = 0);
+
+ void setX(float value);
+ void setY(float value);
+ void setWidth(float value);
+ void setHeight(float value);
+
+ void setPtrToRotation(s16 *ptr);
+
+ void update();
+
+ // todo: more stuff that might not be relevant atm
+};
+
+
+class ActivePhysics {
+public:
+ struct Info; // forward declaration
+ typedef void (*Callback)(Info *self, Info *other);
+
+ struct Info {
+ float xDistToCenter;
+ float yDistToCenter;
+ float xDistToEdge;
+ float yDistToEdge;
+ u8 category1;
+ u8 category2;
+ u32 bitfield1;
+ u32 bitfield2;
+ u16 unkShort1C;
+ Callback callback;
+ };
+
+ ActivePhysics();
+ virtual ~ActivePhysics();
+
+ dActor_c *owner; // should be dStageActor? dunno
+ u32 _8;
+ u32 _C;
+ ActivePhysics *listPrev, *listNext;
+ u32 _18;
+ Info info;
+ u32 _40, _44, _48, _4C;
+ float firstFloatArray[8];
+ float secondFloatArray[8];
+ Vec2 positionOfLastCollision;
+ u16 result1;
+ u16 result2;
+ u16 result3;
+ u8 collisionCheckType;
+ u8 chainlinkMode;
+ u8 layer;
+ u8 someFlagByte;
+ u8 isLinkedIntoList;
+
+ void clear();
+ void addToList();
+ void removeFromList();
+
+ void initWithStruct(dActor_c *owner, Info *info);
+ void initWithStruct(dActor_c *owner, Info *info, u8 clMode);
+
+ u16 checkResult1(u16 param);
+ u16 checkResult3(u16 param);
+
+ float top();
+ float bottom();
+ float yCenter();
+ float right();
+ float left();
+ float xCenter();
+
+ // Plus more stuff that isn't needed in the public API, I'm pretty sure.
+};
+
+
+#include <statelib.h>
+
+class dActorState_c;
+class dActorMultiState_c;
+
+
+class AcStateMgrBase {
+public:
+ virtual ~AcStateMgrBase();
+
+ u32 cls1, cls2, cls3;
+ dActorMultiState_c *owner;
+ u32 unkZero;
+
+ StateMgr<dActorMultiState_c> manager;
+
+ // All these are passed straight through to the manager
+ virtual void _vfC();
+ virtual void _vf10();
+ virtual void _vf14();
+ virtual void _vf18();
+ virtual void _vf1C();
+ virtual void _vf20();
+ virtual void _vf24();
+ virtual void _vf28();
+ virtual void _vf2C();
+};
+
+class AcStateMgr : public AcStateMgrBase {
+public:
+ ~AcStateMgr();
+};
+
+class MultiStateMgrBase {
+public:
+ virtual ~MultiStateMgrBase();
+
+ AcStateMgr s1, s2;
+ AcStateMgr *ptrToStateMgr;
+
+ virtual void _vfC(); // calls vfC on ptrToStateMgr
+ virtual void execute(); // calls vf10 on ptrToStateMgr
+ virtual void _vf14(); // if (isSecondStateMgr()) { disableSecond(); } else { ptrToStateMgr->_vf14(); }
+ virtual void setState(StateBase *state); // calls vf18 on ptrToStateMgr
+ virtual void _vf1C(); // calls vf1C on ptrToStateMgr
+ virtual void _vf20(); // calls vf20 on ptrToStateMgr
+ virtual void _vf24(); // calls vf24 on ptrToStateMgr
+ virtual StateBase *getCurrentState(); // calls vf28 on ptrToStateMgr
+ virtual void _vf2C(); // calls vf2C on ptrToStateMgr
+ virtual void enableSecond(); // sets ptrToStateMgr to s2, calls vf18 on it
+ virtual void disableSecond(); // if (isSecondStateMgr()) { ptrToStateMgr->vf14(); ptrToStateMgr = &s1; }
+ virtual bool isSecondStateMgr();
+ virtual void _vf3C(); // calls vf28 on s1
+};
+
+class MultiStateMgr : public MultiStateMgrBase {
+public:
+ // what the fuck does this do
+ ~MultiStateMgr();
+};
+
+
+struct LinkListEntry {
+ LinkListEntry *prev;
+ LinkListEntry *next;
+ void *owned_obj;
+};
+
+
+struct LinkList {
+ LinkListEntry *first;
+ LinkListEntry *last;
+ // PTMF goes here, but I don't know how to represent it
+};
+
+
+struct OrderedLinkListEntry : LinkListEntry {
+ u16 order;
+ u16 _;
+};
+
+
+struct TreeNode {
+ TreeNode *parent;
+ TreeNode *child;
+ TreeNode *prev;
+ TreeNode *next;
+ void *owned_obj;
+};
+
+
+struct Tree {
+ TreeNode *firstNode;
+ // PTMF goes here, but I don't know how to represent it
+};
+
+
+typedef bool (*ChainedFunc)(void*);
+
+class FunctionChain {
+public:
+ ChainedFunc *functions;
+ u16 count;
+ u16 current;
+
+ void setup(ChainedFunc *functions, u16 count); // 8015F740
+};
+
+
+class fBase_c {
+public:
+ u32 id;
+ u32 settings;
+ u16 name;
+ u8 _A;
+ u8 _B;
+ u8 _C;
+ u8 _D;
+ u8 base_type;
+ u8 _F;
+ TreeNode link_connect;
+ OrderedLinkListEntry link_execute;
+ OrderedLinkListEntry link_draw;
+ LinkListEntry link_IDlookup;
+ u32 _50;
+ u32 _54;
+ u32 _58;
+ u32 heap;
+
+ fBase_c();
+
+ virtual int onCreate();
+ virtual int beforeCreate();
+ virtual int afterCreate(int);
+
+ virtual int onDelete();
+ virtual int beforeDelete();
+ virtual int afterDelete(int);
+
+ virtual int onExecute();
+ virtual int beforeExecute();
+ virtual int afterExecute(int);
+
+ virtual int onDraw();
+ virtual int beforeDraw();
+ virtual int afterDraw(int);
+
+ virtual void willBeDeleted();
+
+ virtual bool moreHeapShit(u32 size, void *parentHeap);
+ virtual bool createHeap(u32 size, void *parentHeap);
+ virtual void heapCreated();
+
+ virtual ~fBase_c();
+
+ void Delete();
+
+ fBase_c *GetParent();
+ fBase_c *GetChild();
+ fBase_c *GetNext();
+
+ bool hasUninitialisedProcesses(); // 80162B60
+};
+
+class dBase_c : public fBase_c {
+public:
+ u32 _64;
+ const char *explanation_string;
+ const char *name_string;
+
+ dBase_c();
+
+ int beforeCreate();
+ int afterCreate(int);
+ int beforeDelete();
+ int afterDelete(int);
+ int beforeExecute();
+ int afterExecute(int);
+ int beforeDraw();
+ int afterDraw(int);
+
+ ~dBase_c();
+
+ virtual const char *GetExplanationString();
+};
+
+class dScene_c : public dBase_c {
+public:
+ FunctionChain *ptrToInitChain;
+
+ dScene_c();
+
+ int beforeCreate();
+ int afterCreate(int);
+ int beforeDelete();
+ int afterDelete(int);
+ int beforeExecute();
+ int afterExecute(int);
+ int beforeDraw();
+ int afterDraw(int);
+
+ ~dScene_c();
+
+
+ void setInitChain(FunctionChain &initChain) {
+ ptrToInitChain = &initChain;
+ }
+};
+
+class dActor_c : public dBase_c {
+public:
+ LinkListEntry link_actor;
+ Mtx matrix;
+ Vec pos;
+ Vec last_pos;
+ Vec pos_delta;
+ Vec _D0;
+ Vec scale;
+ Vec speed;
+ Vec max_speed;
+ S16Vec rot;
+ S16Vec _106;
+ u32 _10C;
+ u32 _110;
+ float y_speed_inc;
+ u32 _118;
+ float x_speed_inc;
+ u32 _120;
+ bool visible;
+
+ dActor_c();
+
+ virtual void specialDraw1();
+ virtual void specialDraw2();
+ virtual int _vf58();
+ virtual void _vf5C();
+
+ ~dActor_c();
+};
+
+class dStageActor_c : public dActor_c {
+public:
+ u8 _125;
+ u32 _128, _12C, _130, _134, _138, _13C;
+ float _140;
+ u32 _144;
+ ActivePhysics aPhysics;
+ u8 classAt1EC[236];
+ u32 _2D8;
+ u8 classAt2DC[0x34];
+ u32 _310, _314;
+ float spriteSomeRectX, spriteSomeRectY;
+ float _320, _324, _328, _32C, _330, _334, _338, _33C, _340, _344;
+ u8 direction;
+ u8 currentZoneID;
+ u8 _34A, _34B;
+ u8 *spriteByteStorage;
+ u16 *spriteShortStorage;
+ u16 spriteEventNum;
+ u64 spriteEventMask;
+ u32 _360;
+ u16 spriteSomeFlag;
+ u8 _366, _367;
+ u32 _368;
+ u8 _36C, _36D;
+ Vec somethingRelatedToScale;
+ u32 _37C, _380, _384, _388;
+ u8 _38C, _38D, enableFlag, currentLayerID;
+ u8 _390, _391, _392, _padding;
+
+ dStageActor_c();
+
+ int beforeCreate();
+ int afterCreate(int);
+ int beforeDelete();
+ int afterDelete(int);
+ int beforeExecute();
+ int afterExecute(int);
+ int beforeDraw();
+ int afterDraw(int);
+
+ const char *GetExplanationString();
+
+ virtual bool _vf60(); // does stuff with BG_GM
+ virtual void kill(); // nullsub here, defined in StageActor. probably no params
+ virtual int _vf68(); // params unknown. return (1) might be bool
+ virtual u8 *_vf6C(); // returns byte 0x38D
+ virtual Vec2 _vf70(); // returns Vec Actor.pos + Vec Actor.field_D0
+ virtual int _vf74(); // params unknown. return (1) might be bool
+ virtual void _vf78(); // params unknown. nullsub
+ virtual void _vf7C(); // params unknown. nullsub
+ virtual void eatIn(); // copies Actor.scale into StageActor.somethingRelatedToScale
+ virtual void disableEatIn(); // params unknown. nullsub
+ virtual void _vf88(); // params unknown. nullsub
+ virtual bool _vf8C(void *other); // dAcPy_c/daPlBase_c? return (1) is probably bool. seems related to EatOut. uses vfA4
+ virtual bool _vf90(dStageActor_c *other); // does something with scores
+ virtual void _vf94(void *other); // dAcPy_c/daPlBase_c? modifies This's position
+ virtual void removeMyActivePhysics();
+ virtual void addMyActivePhysics();
+ virtual void returnRegularScale(); // the reverse of vf80, yay
+ virtual void _vfA4(void *other); // AcPy/PlBase? similar to vf94 but not quite the same
+ virtual float _vfA8(void *other); // AcPy/PlBase? what DOES this do...? does a bit of float math
+ virtual void _vfAC(void *other); // copies somethingRelatedToScale into scale, then multiplies scale by vfA8's return
+ virtual void _vfB0(); // plays Wm_en_burst_s at actor position
+ virtual void _vfB4(); // params unknown. nullsub
+ virtual void _vfB8(); // params unknown. nullsub
+ virtual void _vfBC(); // params unknown. nullsub
+ virtual void _vfC0(); // params unknown. nullsub
+ virtual void _vfC4(); // params unknown. nullsub
+ virtual void _vfC8(Vec2 *p); // does stuff including effects and playing PLAYER_SE_OBJ/GROUP_BOOT/SE_OBJ_CMN_SPLASH
+ virtual void _vfCC(Vec2 *p); // mostly same as vfC8, but uses PLAYER_SE_OBJ/GROUP_BOOT/SE_OBJ_CMN_SPLASH_LAVA
+ virtual void _vfD0(Vec2 *p); // mostly same as vfC8, but uses PLAYER_SE_OBJ/GROUP_BOOT/SE_OBJ_CMN_SPLASH_POISON
+
+ // I'll add methods as I need them
+ void checkZoneBoundaries(u32 flags); // I think this method is for that, anyway
+
+ ~dStageActor_c();
+
+
+ static void create(Actors type, u32 settings, Vec *pos, S16Vec *rot, u8 layer);
+ static void createChild(Actors type, u32 settings, Vec *pos, S16Vec *rot, u8 layer);
+};
+
+
+/* TODO
+class dActorState_c : public dStageActor_c {
+public:
+ ~dActorState_c();
+
+ virtual void _vfD4();
+ virtual void _vfD8();
+ virtual void _vfDC();
+};
+*/
+
+
+class dActorMultiState_c : public dStageActor_c {
+public:
+ ~dActorMultiState_c();
+
+ MultiStateMgr acState;
+
+ virtual void doStateChange(StateBase *state); // might return bool? overridden by dEn_c
+ virtual void _vfD8(); // nullsub ??
+ virtual void _vfDC(); // nullsub ??
+ virtual void _vfE0(); // nullsub ??
+};
+
+
+class dEn_c : public dActorMultiState_c {
+public:
+ float _414, _418, _41C, _420;
+ void *nextState;
+ u32 _428, _42C;
+ u8 _430, _431, isDead;
+ u32 _434;
+ u16 _438;
+ u32 _43C;
+ Vec velocity1, velocity2;
+ u8 _458, _459, _45A, _45B, _45C, _45D, _45E;
+ u32 _460;
+ Vec initialScale;
+ float _470;
+ u32 _474, _478;
+ dEn_c *_47C;
+ u32 _480;
+ u8 classAt484[0x4EC - 0x484];
+ u32 _4EC;
+ float _4F0, _4F4, _4F8;
+ u32 flags_4FC;
+ u16 counter_500, counter_502;
+ u16 counter_504[4];
+ u16 counter_50C;
+ u32 _510, _514, _518;
+ void *_51C;
+ dEn_c *_520;
+ u32 _524;
+
+ dEn_c();
+
+ int afterCreate(int);
+ int beforeExecute(int);
+ int afterExecute(int);
+ int beforeDraw(int);
+
+ void kill();
+
+ void eatIn();
+ void disableEatIn();
+ bool _vf8C(void *other); // AcPy/PlBase?
+ void _vfAC();
+ void _vfCC(Vec2 *p);
+ void _vfD0(Vec2 *p);
+
+ void doStateChange(StateBase *state); // might return bool, dunno
+
+ // Now here's where the fun starts.
+
+ virtual bool preSpriteCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual bool prePlayerCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual bool preYoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+
+ virtual bool stageActorCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+
+ virtual void spriteCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void yoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+
+ // WHAT A MESS
+ virtual void collisionCat3_StarPower(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat5_Mario(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void _vf108(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCatD_GroundPound(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void _vf110(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat8_FencePunch(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat7_WMWaggleWaterYoshi(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void _vf120(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCatA_PenguinMario(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat11_PipeCannon(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther);
+
+ virtual void _vf140(dStageActor_c *actor);
+ virtual void _vf144(int something);
+ virtual void _vf148(); // deletes actors held by Class484 and other stuff
+ virtual void _vf14C(); // deletes actors held by Class484 and makes an En Coin Jump
+ virtual u32 _vf150(); // reads some bits from a value in Class1EC
+ virtual void eatenByYoshiProbably(); // nullsub, params unknown
+ virtual void playHpdpSound1(); // plays PLAYER_SE_EMY/GROUP_BOOT/SE_EMY_DOWN_HPDP_S or _H
+ virtual void playEnemyDownSound1();
+ virtual void playEnemyDownComboSound(void *player); // AcPy_c/daPlBase_c?
+ virtual void playHpdpSound2(); // plays PLAYER_SE_EMY/GROUP_BOOT/SE_EMY_DOWN_HPDP_S or _H
+ virtual void _vf168(); // nullsub, params unknown
+
+ // State Functions
+ virtual void dieFumi_Begin(); // does something involving looping thruogh players
+ virtual void dieFumi_Execute(); // does movement and some other stuff
+ virtual void dieFumi_End(); // nullsub
+ virtual void dieFall_Begin(); // does something involving looping thruogh players
+ virtual void dieFall_Execute(); // does movement and some other stuff
+ virtual void dieFall_End(); // nullsub
+ virtual void dieBigFall_Begin(); // calls vf178 [dieFall_Begin]
+ virtual void dieBigFall_Execute(); // does movement and some other stuff (but less than 170 and 17C)
+ virtual void dieBigFall_End(); // calls vf180 [dieFall_End]
+ virtual void dieSmoke_Begin(); // spawns Wm_en_burst_m effect and then removeMyActivePhysics
+ virtual void dieSmoke_Execute(); // deletes actor with r4=1
+ virtual void dieSmoke_End(); // nullsub
+ virtual void dieYoshiFumi_Begin(); // spawns Wm_mr_yoshistep effect and then removeMyActivePhysics
+ virtual void dieYoshiFumi_Execute(); // deletes actor with r4=1
+ virtual void dieYoshiFumi_End(); // nullsub
+ virtual void dieIceVanish_Begin(); // lots of weird stuff
+ virtual void dieIceVanish_Execute(); // deletes actor with r4=1
+ virtual void dieIceVanish_End(); // nullsub
+ virtual void dieGoal_Begin(); // nullsub
+ virtual void dieGoal_Execute(); // nullsub
+ virtual void dieGoal_End(); // nullsub
+ virtual void dieOther_Begin(); // deletes actor with r4=1
+ virtual void dieOther_Execute(); // nullsub
+ virtual void dieOther_End(); // nullsub
+ virtual void eatIn_Begin(); // nullsub
+ virtual void eatIn_Execute(); // changes to EatNow on one condition, otherwise calls vfAC
+ virtual void eatIn_End(); // nullsub
+ virtual void eatNow_Begin(); // nullsub
+ virtual void eatNow_Execute(); // nullsub
+ virtual void eatNow_End(); // nullsub
+ virtual void eatOut_Begin(); // nullsub
+ virtual void eatOut_Execute(); // nullsub
+ virtual void eatOut_End(); // nullsub
+ virtual void hitSpin_Begin(); // nullsub
+ virtual void hitSpin_Execute(); // nullsub
+ virtual void hitSpin_End(); // nullsub
+ virtual void ice_Begin(); // does stuff with Class484 and lots of vf's
+ virtual void ice_Execute(); // tons of stuff with Class484
+ virtual void ice_End(); // sets a field in Class484 to 0
+
+ virtual void spawnHitEffectAtPosition(Vec2 pos);
+ virtual void doSomethingWithHardHitAndSoftHitEffects(Vec pos);
+ virtual void playEnemyDownSound2();
+ virtual void add2ToYSpeed();
+ virtual bool _vf218(); // stuff with floats and camera
+ virtual void _vf21C(); // does stuff with the speeds
+ virtual void _vf220(void *other); // some type of actor, PlBase? calls vf3F4 on other with r4=this, r5=0
+ virtual void _vf224(); // stores a couple of values into the struct at 464
+ virtual void _vf228(); // more fun stuff with 464 and floats
+ virtual bool _vf22C(); // does stuff involving ICE_ACTORs and arrays
+ virtual void _vf230(); // "relatedToPlayerOrYoshiCollision" apparently. nullsub, params unknown for now.
+ virtual void _vf234(); // nullsub, params unknown
+ virtual void _vf238(); // calls vf34 on class394, params unknown
+ virtual void _vf23C(); // nullsub, params unknown
+ virtual void _vf240(); // nullsub, params unknown
+ virtual int _vf244(); // returns 0. might be bool. params unknown
+ virtual int _vf248(int something); // does some math involving field510 and [7,7,4,0] and param
+ virtual void _vf24C(void *other); // deals with something in the class involving the bahp flag
+ virtual void _vf250(void *other);
+ virtual void _vf254(void *other);
+ virtual void _vf258(void *other);
+ virtual void _vf25C(void *other); // calls vf250
+ virtual void _vf260(void *other); // AcPy/PlBase? plays the SE_EMY_FUMU_%d sounds based on some value
+ virtual void _vf264(dStageActor_c *other); // if other is player or yoshi, do Wm_en_hit and a few other things
+ virtual void _vf268(void *other); // AcPy/PlBase? plays the SE_EMY_DOWN_SPIN_%d sounds based on some value
+ virtual void spawnHitEffectAtPositionAgain(Vec2 pos);
+ virtual void playMameStepSound(); // SE_EMY_MAME_STEP at actor position
+ virtual void _vf274(); // nullsub, params unknown
+ virtual void _vf278(void *other); // AcPy/PlBase? plays the SE_EMY_YOSHI_FUMU_%d sounds based on some value
+ virtual void _vf27C(); // nullsub, params unknown
+
+ ~dEn_c();
+
+
+ static void collisionCallback(ActivePhysics::Info *one, ActivePhysics::Info *two);
+};
+
+
+class daEnBlockMain_c : public dEn_c {
+public:
+ u32 _528, _52C, _530;
+ Physics physics;
+ float _618, _61C, _620;
+ u32 _624, _628, _62C;
+ float initialY;
+ float _634, _638, _63C, _640;
+ u32 countdown, _648, _64C;
+ u32 _650, _654, _658, _65C;
+ u16 _660;
+ u8 _662, _663, _664, _665, _666, _667;
+ u8 _668, _669, _66A, _66B, _66C, _66D, _66E, _66F;
+ u8 _670, _671, _672, _673;
+ u8 _674;
+ u8 _675, _676, _677, _678, _679, _67A, _67B, _67C;
+ u8 _67D, _67E, _67F, _680;
+ u32 _684;
+ u8 _688, isGroundPound, anotherFlag, _68B, _68C, _68D, _68E, _68F;
+ u32 _690;
+ u8 _694;
+
+ // Regular methods
+ void blockInit(float initialY);
+ void blockUpdate();
+ u8 blockResult();
+
+ virtual void calledWhenUpMoveBegins();
+ virtual void calledWhenDownMoveBegins();
+
+ virtual void calledWhenUpMoveExecutes();
+ virtual void calledWhenUpMoveDiffExecutes();
+ virtual void calledWhenDownMoveExecutes();
+ virtual void calledWhenDownMoveEndExecutes();
+ virtual void calledWhenDownMoveDiffExecutes();
+ virtual void calledWhenDownMoveDiffEndExecutes();
+
+ virtual void updateScale(bool movingDown);
+
+ // State functions
+ virtual void upMove_Begin();
+ virtual void upMove_Execute();
+ virtual void upMove_End();
+ virtual void downMove_Begin();
+ virtual void downMove_Execute();
+ virtual void downMove_End();
+ virtual void downMoveEnd_Begin();
+ virtual void downMoveEnd_Execute();
+ virtual void downMoveEnd_End();
+ virtual void upMove_Diff_Begin();
+ virtual void upMove_Diff_Execute();
+ virtual void upMove_Diff_End();
+ virtual void downMove_Diff_Begin();
+ virtual void downMove_Diff_Execute();
+ virtual void downMove_Diff_End();
+ virtual void downMove_DiffEnd_Begin();
+ virtual void downMove_DiffEnd_Execute();
+ virtual void downMove_DiffEnd_End();
+
+ static void *PhysicsCallback1;
+ static void *PhysicsCallback2;
+ static void *PhysicsCallback3;
+ static void *OPhysicsCallback1;
+ static void *OPhysicsCallback2;
+ static void *OPhysicsCallback3;
+
+ static State<daEnBlockMain_c> StateID_UpMove;
+ static State<daEnBlockMain_c> StateID_DownMove;
+ static State<daEnBlockMain_c> StateID_DownMoveEnd;
+ static State<daEnBlockMain_c> StateID_UpMove_Diff;
+ static State<daEnBlockMain_c> StateID_DownMove_Diff;
+ static State<daEnBlockMain_c> StateID_DownMove_DiffEnd;
+
+ ~daEnBlockMain_c();
+};
+
+
+class dBgGm_c {
+public:
+ // TODO TODO TODO TODO TODO
+ static dBgGm_c *instance;
+
+ TileRenderer::List *getTileRendererList(int index);
+};
+
+
+class dPlayerModelBase_c {
+ // dunno what's public and what's private here
+ // don't really care
+public:
+ dPlayerModelBase_c(u8 player_id); // 800D5420
+ virtual ~dPlayerModelBase_c(); // 800D55D0
+
+ char allocator[28]; // actually a mHeapAllocatorSubclass but I don't have that
+ u32 _20;
+ u32 _24;
+ char someAnimation[2][0x38]; // actually PlayerAnim's
+ char yetAnotherAnimation[40]; // actually m3d::banm_c afaics -- is it even 40 bytes?
+ Vec someVector[2]; // maybe not an array
+ Vec headOffs;
+ Vec scale;
+ u8 player_id_1;
+ u8 player_id_2;
+ u8 powerup_id;
+ u8 powerup_tex;
+ int current_anim;
+ int last_anim_maybe;
+ u32 _15C;
+ int someFlags;
+ u32 _164;
+ u32 _168; // related to jump_strings
+ u32 _16C;
+ u32 _170;
+ u32 _174;
+ u8 _178;
+ char padding[3]; // not needed?
+ u32 model_visibility_flags_maybe;
+ u32 mode_maybe;
+ float _184;
+ float _188;
+ u32 _18C;
+ char someArray[6][12]; // some unknown class/struct
+ char _1D8[0x24];
+ short _1FC;
+ short _1FE;
+ short _200;
+ char padding_[2]; // not needed?
+ u32 _204;
+ u32 _208;
+
+ virtual int _vf0C(); // 800D6DA0
+ virtual void prepare(); // 800D5720
+ virtual void finaliseModel(); // 800D5740
+ virtual void update(); // 800D5750
+ virtual void update3DStuff(); // 800D5760
+ virtual void _vf20(); // 800D6D90
+ virtual void draw(); // 800D5C70
+ virtual int getCurrentModel(); // 800D5870
+ virtual int getCurrentResFile(); // 800D62D0
+ virtual void setPowerup(u8 powerup_id); // 800D5730
+ virtual void setPowerupTexture(); // 800D5CC0
+ virtual void _vf38(); // 800D6D80
+ virtual void _vf3C(); // 800BD750
+ virtual void _vf40(); // 800D6D70
+ virtual void _vf44(); // 800D6D60
+ virtual void _vf48(); // 800BD740
+ virtual void _vf4C(); // 800BD730
+ virtual void getModelMatrix(u32 unk, MtxPtr dest); // 800D5820
+ virtual int _vf54(); // 80318D0C
+ virtual bool _vf58(int type, char *buf, bool unk); // 800D6930
+ virtual void startAnimation(int id, float frame, float unk, float updateRate); // 800D5EC0
+ virtual int _vf60(); // 800D6920
+ virtual void _vf64(int id, float unk1, float unk2, float unk3); // 800D62F0
+ virtual void _vf68(int id, float unk); // 800D63E0
+ virtual void _vf6C(); // 800D62E0
+ virtual void _vf70(); // 800D6690
+ virtual void _vf74(); // 800D66A0
+ virtual void _vf78(); // 800D66B0
+ virtual void SomethingRelatedToPenguinAnims(); // 800D66C0
+ virtual void _vf80(); // 800D6A20
+ virtual void _vf84(float frame); // 800D5D00
+ virtual void _vf88(float frame); // 800D5D70
+ virtual void _vf8C(float updateRate); // 800D5D80
+ virtual void setUpdateRateForAnim1(float updateRate); // 800D5DF0
+ virtual void _vf94(); // 800D6D40
+ virtual int _vf98(); // 800D6D30
+ virtual void _vf9C(); // 800D6D20
+ virtual int _vfA0(); // 800D6D10
+ virtual void _vfA4(); // 800D6D00
+ virtual int _vfA8(); // 800D6CF0
+ virtual void _vfAC(bool blah); // 800BD720
+
+ // I won't even bother with non-virtual functions....
+};
+
+
+class dPlayerModelHandler_c {
+public:
+ dPlayerModelHandler_c(u8 player_id); // 800D6DB0
+ virtual ~dPlayerModelHandler_c(); // 800D6EF0
+
+ dPlayerModelBase_c *mdlClass; // might be dPlayerModel_c ?
+
+ int loadModel(u8 player_id, int powerup_id, int unk); // 800D6EE0
+ void update(); // 800D6F80
+ void setMatrix(Mtx matrix); // 800D6FA0
+ void setSRT(Vec position, S16Vec rotation, Vec scale); // 800D7030
+ void callVF20(); // 800D70F0
+ void draw(); // 800D7110
+
+private:
+ int hasMatrix; // might be bool ?
+
+ void allocPlayerClass(u8 player_id); // 800D6E00
+};
+
+
+class mTexture_c {
+public:
+ mTexture_c(); // 802C0D20
+ mTexture_c(u16 width, u16 height, GXTexFmt format); // 802C0D70
+
+ // vtable is at 80350450
+ virtual ~mTexture_c(); // 802C0DB0
+ virtual void setFlagTo1(); // 802C0E20
+
+ void setImageBuffer(void *buffer); // 802C0E30
+ void load(GXTexMapID id); // 802C0E50
+ void makeTexObj(GXTexObj *obj); // 802C0E90
+ void flushDC(); // 802C0F10
+
+ void makeRadialGradient(); // 802C0F60 parameters unknown yet
+ void makeLinearGradient(int type, char size, u16 startPos, u16 endPos,
+ GXColor begin, GXColor end, bool startAtCenter); // 802C1120
+ // "type" should be enum once I figure it out
+ // reverse might not be accurate
+
+ void allocateBuffer(/* EGG::Heap */void *heap = 0); // 802C14D0
+
+ void plotPixel(u16 x, u16 y, GXColor pixel); // 802C1570
+
+
+ u16 width;
+ u16 height;
+ u8 flags;
+ u8 format;
+ u8 wrapS;
+ u8 wrapT;
+ u8 minFilter;
+ u8 magFilter;
+
+private:
+ void *buffer;
+ void *myBuffer;
+};
+
+
+class dDvdLoader_c {
+public:
+ dDvdLoader_c(); // 8008F140
+ virtual ~dDvdLoader_c(); // 8008F170
+
+ void *load(const char *filename, u8 unk = 0, void *heap = 0); // 8008F1B0
+
+ bool close(); // 8008F2B0 -- Frees command, DON'T USE THIS unless you free the buffer yourself
+ bool unload(); // 8008F310 -- Frees command and buffer, USE THIS
+
+ int size;
+ void *command; // really mDvd_toMainRam_c
+ void *heap; // really EGG::Heap
+ void *buffer;
+
+private:
+ virtual void freeBuffer(); // 8008F380
+ void freeCommand(); // 8008F3F0
+};
+
+
+
+namespace nw4r {
+ namespace ut {
+ class CharWriter {
+ public:
+ CharWriter();
+ ~CharWriter();
+
+ void SetupGX();
+
+ void SetFontSize(float w, float h);
+ void SetFontSize(float v);
+ float GetFontWidth() const;
+ float GetFontHeight() const;
+ float GetFontAscent() const;
+ float GetFontDescent() const;
+
+ // returns width
+ float Print(ushort character);
+
+ void PrintGlyph(float, float, float, /* nw4r::ut::Glyph const & */ void*);
+
+ void UpdateVertexColor();
+
+ private:
+ void SetupGXWithColorMapping(Color c1, Color c2);
+
+ public:
+ Color colors[8]; // todo: document
+ u32 modeOfSomeKind;
+ float scaleX;
+ float scaleY;
+ float posX;
+ float posY;
+ float posZ;
+ GXTexFilter minFilt;
+ GXTexFilter magFilt;
+ u16 completelyUnknown;
+ u8 alpha;
+ u8 isFixedWidth;
+ float fixedWidthValue;
+ /* ResFont* */ void *font;
+ };
+
+ // actually TextWriterBase<w>, but ...
+ class TextWriter : public CharWriter {
+ public:
+ TextWriter();
+ ~TextWriter();
+
+ float GetLineHeight() const;
+
+ // left out most of these to avoid all the format string vararg bullshit
+ float CalcStringWidth(wchar_t const *string, int length) const;
+
+ float Print(wchar_t const *string, int length);
+
+ float CalcLineWidth(wchar_t const *string, int length);
+
+ float GetLineSpace() const;
+
+ bool IsDrawFlagSet(ulong, ulong) const;
+
+ float _4C;
+ float charSpace;
+ float somethingRelatedToLineHeight;
+ u32 _58;
+ u32 drawFlag;
+ void *tagProcessorMaybe;
+ };
+ }
+}
+
+// More layout crap
+// This file REALLY needs to be reorganised.
+
+namespace nw4r {
+namespace lyt {
+
+ class ResourceAccessor {
+ public:
+ ResourceAccessor();
+ virtual ~ResourceAccessor();
+
+ virtual void *GetResource(u32 dirKey, const char *filename, u32 *sizePtr) = 0;
+ virtual void *GetFont(const char *name);
+ };
+
+ class ArcResourceAccessor : public ResourceAccessor {
+ public:
+ ArcResourceAccessor();
+ ~ArcResourceAccessor();
+
+ bool Attach(void *data, const char *rootDirName);
+ void *GetResource(u32 dirKey, const char *filename, u32 *sizePtr);
+ void *GetFont(const char *name);
+
+ ARCHandle arc;
+ u32 unk_20;
+ ut::LinkList list; // 0x24
+ char rootDirName[0x80]; // 0x30
+ // class ends at 0xB0
+ };
+
+}
+}
+
+namespace m2d {
+ class ResAcc_c {
+ public:
+ ResAcc_c();
+ virtual ~ResAcc_c();
+ virtual void initialSetup();
+
+ nw4r::lyt::ResourceAccessor *resAccPtr; // 0x04
+ u32 unk_08; // 0x08
+ nw4r::lyt::ArcResourceAccessor resAcc; // 0x0C
+ // class ends at 0xBC
+ };
+
+ class ResAccLoader_c : public ResAcc_c {
+ public:
+ ResAccLoader_c();
+ ~ResAccLoader_c();
+
+ void *buffer;
+ dDvdLoader_c loader; // 0xC0
+ // ends at 0xD4
+
+ bool loadArc(const char *path);
+ bool loadArc(const char *path, u8 unk);
+ void free();
+ };
+
+ class EmbedLayoutBase_c : public Base_c {
+ public:
+ EmbedLayoutBase_c();
+ ~EmbedLayoutBase_c();
+
+ void draw(); // don't call this directly
+
+ virtual void update();
+ virtual bool build(const char *brlytPath, ResAcc_c *resAcc = 0);
+
+ nw4r::lyt::Pane *getRootPane();
+ nw4r::lyt::Pane *findPaneByName(const char *name) const;
+ nw4r::lyt::TextBox *findTextBoxByName(const char *name) const;
+ nw4r::lyt::Pane *findPictureByName(const char *name) const; // TODO: change to others
+ nw4r::lyt::Pane *findWindowByName(const char *name) const;
+
+ void animate();
+ void calculateMtx();
+
+ nw4r::lyt::Layout layout; // 0x10 -- actually m2d::Layout_c but I'll add that later
+ nw4r::lyt::DrawInfo drawInfo; // 0x30
+ void *unk_84; // 0x84 -- a ResAcc? referenced in Build()
+ float posX; // 0x88
+ float posY; // 0x8C
+ float clipX; // 0x90
+ float clipY; // 0x94
+ float clipWidth; // 0x98
+ float clipHeight; // 0x9C
+ bool clippingEnabled; // 0xA0
+ u32 hasAnimations; // 0xA4
+ u32 unk_A8; // 0xA8
+ };
+
+ class EmbedLayout_c : public EmbedLayoutBase_c {
+ public:
+ EmbedLayout_c();
+ ~EmbedLayout_c();
+
+ bool build(const char *brlytPath, ResAcc_c *resAcc = 0);
+
+ bool loadArc(const char *name, bool isLangSpecific);
+ bool loadArc(const char *name, u8 unk, bool isLangSpecific);
+
+ bool loadArcForRegion(const char *name); // uses EU/Layout/$name
+
+ // there's also a NedEU one, but should it really be listed here...?
+
+ bool free();
+
+ // does NSMBW even use consts? I have no idea. maybe not
+
+ void getPanes(const char **names, nw4r::lyt::Pane *output, int count) const;
+ void getWindows(const char **names, nw4r::lyt::Pane *output, int count) const; // TODO: change to others
+ void getPictures(const char **names, nw4r::lyt::Pane *output, int count) const;
+ void getTextBoxes(const char **names, nw4r::lyt::TextBox *output, int count) const;
+
+ void setLangStrings(const char **names, const int *msgIDs, int category, int count);
+
+ void loadAnimations(const char **names, int count);
+ void loadGroups(const char **names, int *animLinkIDs, int count);
+
+ void enableNonLoopAnim(int num, bool goToLastFrame = false);
+ void enableLoopAnim(int num);
+ void resetAnim(int num, bool goToLastFrame = false);
+ void disableAnim(int num);
+ void disableAllAnimations();
+
+ bool isAnimOn(int num = -1);
+ bool isAnyAnimOn();
+
+ void execAnimations();
+
+ ResAccLoader_c loader; // 0xAC
+ void *brlanHandlers; // 0x180
+ void *grpHandlers; // 0x184
+ bool *animsEnabled; // 0x188
+ int brlanCount; // 0x18C
+ int grpCount; // 0x190
+ int lastAnimTouched; // 0x194
+
+ private:
+ void fixTextBoxesRecursively(nw4r::lyt::Pane *pane);
+ };
+}
+
+
+
+/* Tilemap related stuff */
+class TilemapClass {
+ public:
+ virtual ~TilemapClass();
+
+ u16 *allocatedBlocks[256];
+ u32 _404;
+
+ u8 blockLookup[2048];
+
+ u16 blockCount;
+
+ u32 _C0C;
+ u32 ts1ID, ts2ID, ts3ID, layerID, areaID, frmHeap, is2Castle;
+
+ // Only the public API is listed
+ u16 *getPointerToTile(int x, int y, u32 *blockNum = 0, bool unkBool = 0);
+ // TODO: more?
+};
+
+class BGDatClass {
+ public:
+ BGDatClass();
+ virtual ~BGDatClass();
+
+ u8 *bgData[4][3];
+ TilemapClass *tilemaps[4][3];
+ u8 *tsObjIndexData[4][4];
+ u8 *tsObjData[4][4];
+ char tsNames[4][4][0x20];
+ // this is fucked up!
+ // the parent heap is frmHeaps[0][0]
+ // each tileset's heap is frmHeaps[AREA][LAYER+1]
+ void *frmHeaps[4][4];
+
+ static BGDatClass *instance; // 8042A0D0
+
+ // I've only listed the public API because other stuff isn't really needed atm.
+ const char *getTilesetName(int area, int number);
+ // TODO: more?
+};
+
+struct BGRender {
+ u8 unk[0xC00];
+ u8 *objectData;
+ u8 _C04, _C05;
+ u16 _C06, _C08;
+ u16 blockNumber;
+ u16 curX, curY;
+ u16 tileToPlace;
+ u16 objDataOffset, objType, objX, objY, objWidth, objHeight;
+ u16 tileNumberWithinBlock, areaID;
+};
+
+// A HACK
+extern void *DVDClass;
+extern "C" u8 *GetRes(void *Something, const char *arcname, const char *filename);
+
+// Use THESE instead, until I write something up for dRes or dRes_c or whatever the fuck it's called
+
+inline u8 *getResource(const char *arcName, const char *fileName) {
+ return GetRes((void*)(((u8*)DVDClass)+4), arcName, fileName);
+}
+
+#endif
+
diff --git a/kamek_ntsc.x b/kamek_ntsc.x index ab702c3..dab4502 100644 --- a/kamek_ntsc.x +++ b/kamek_ntsc.x @@ -19,6 +19,17 @@ SECTIONS { GenerateRandomNumber = 0x800B2EE0; OneofManySoundPlayers = 0x800CE8C0; BombExplodeState = 0x80B12A68; + NoFreezie = 0x800A0B08; + +/* Mr Sun Related */ + + BubbleModel = 0x809D0CA0; + BubbleDraw = 0x809D0830; + ActivePhysics_InitWithStruct = 0x8008C3E0; + ActivePhysics_AddToList = 0x8008C330; + + + _savefpr_14 = 0x802DCCA8; _savefpr_15 = 0x802DCCAC; diff --git a/kamek_ntsc2.x b/kamek_ntsc2.x index f803db3..8307ebc 100644 --- a/kamek_ntsc2.x +++ b/kamek_ntsc2.x @@ -19,6 +19,17 @@ SECTIONS { GenerateRandomNumber = 0x800B2EE0; OneofManySoundPlayers = 0x800CE8C0; BombExplodeState = 0x80B12A88; + NoFreezie = 0x800A0B08; + +/* Mr Sun Related */ + + BubbleModel = 0x809D0CC0; + BubbleDraw = 0x809D0850; + ActivePhysics_InitWithStruct = 0x8008C3E0; + ActivePhysics_AddToList = 0x8008C330; + + + _savefpr_14 = 0x802DCCA8; _savefpr_15 = 0x802DCCAC; diff --git a/kamek_pal2.x b/kamek_pal2.x index f9f8a9a..8621496 100644 --- a/kamek_pal2.x +++ b/kamek_pal2.x @@ -19,6 +19,17 @@ SECTIONS { GenerateRandomNumber = 0xDEADBEEF; OneofManySoundPlayers = 0xDEADBEEF; BombExplodeState = 0xDEADBEEF; + NoFreezie = 0xDEADBEEF; + +/* Mr Sun Related */ + + BubbleModel = 0xDEADBEEF; + BubbleDraw = 0xDEADBEEF; + ActivePhysics_InitWithStruct = 0xDEADBEEF; + ActivePhysics_AddToList = 0xDEADBEEF; + + + _savefpr_14 = 0xDEADBEEF; _savefpr_15 = 0xDEADBEEF; @@ -6,12 +6,12 @@ hooks: - name: MrSun_Create type: add_func_pointer src_addr_pal: 0x80B0DFB8 - target_func: 'MrSun_Create(MrSun *self)' + target_func: 'MrSun_Create(MrSun *)' - name: MrSun_Execute type: add_func_pointer src_addr_pal: 0x80B0DFD0 - target_func: 'MrSun_Execute(MrSun *self)' + target_func: 'MrSun_Execute(MrSun *)' - name: MrSun_Draw type: patch diff --git a/src/mrsun.cpp b/src/mrsun.cpp index 6d3eccb..b246131 100755 --- a/src/mrsun.cpp +++ b/src/mrsun.cpp @@ -1,107 +1,31 @@ #include <common.h> +#include <g3dhax.h> #include <game.h> -struct MrSun { - u32 id; // 0x00 - u32 settings; // 0x04 - u16 name; // 0x08 - u8 _0A[6]; // 0x0A - u8 _10[0x9C]; // 0x10 - float x; // 0xAC - float y; // 0xB0 - float z; // 0xB4 - float last_x; - float last_y; - float last_z; - float x_delta; - float y_delta; - float z_delta; - float d0; - float d4; - float d8; - float scale_x; - float scale_y; - float scale_z; - float speed_x; - float speed_y; - float speed_z; - float maxspeed_x; - float maxspeed_y; - float maxspeed_z; - u16 rot_x; - u16 rot_y; - u16 rot_z; - u8 _106[0x42]; // 0x106 - u8 _148[0x288]; - - // Any variables you add to the class go here; starting at offset 0x3D0 - u64 eventFlag; - u32 location; - u8 damage; - u8 respawn; -}; - -struct EventTable_t { - u64 events; -}; +class dMrSun_c : public dEn_c { + int onCreate(); + int onDelete(); + int onExecute(); + int onDraw(); -struct VEC { - float x; - float y; - float z; -}; + mHeapAllocator_c allocator; -struct APInfo { - float xDistToCenter; // 0 - float yDistToCenter; // 4 - float xDistToEdge; // 8 - float yDistToEdge; // C - u8 category1; // 10 - u8 category2; // 11 - u16 nulls; // 12 - u32 bitfield1; // 14 - u16 bitfield2; // 18 - u16 unkShort; // 1C - u32 callback; // 20 + static dMrSun_c *build(); }; - -extern EventTable_t *EventTable; -extern "C" dStageActor_c *CreateActor(u16 classID, int settings, VEC pos, char rot, char layer); -extern "C" dStageActor_c *Actor_SearchByID(u32 actorID); - -extern "C" void *BubbleModel(MrSun *self); -extern "C" void *ActivePhysics_InitWithStruct(u8 *thing, MrSun *self, APInfo physstruct); -extern "C" void *ActivePhysics_AddToList(u8 *thing); - - - -bool MrSun_Execute(MrSun *self); -bool MrSun_Create(MrSun *self); - #define ACTIVATE 1 #define DEACTIVATE 0 - - - -bool MrSun_Create(MrSun *self) { - +int dMrSun_c::onCreate() { OSReport("Creating the Mr.Sun Model"); - BubbleModel(self); - OSReport("Setting Mr.Sun's Size to 4.0"); - - self->scale_x = 4.0; - self->scale_y = 4.0; - self->scale_z = 4.0; - + this->scale = (Vec){4.0, 4.0, 4.0}; OSReport("Creating Mr.Sun's Physics Struct"); - APInfo HitMeBaby; + ActivePhysics::Info HitMeBaby; HitMeBaby.xDistToCenter = 0.0; HitMeBaby.yDistToCenter = 0.0; HitMeBaby.xDistToEdge = 8.0; @@ -110,25 +34,30 @@ bool MrSun_Create(MrSun *self) { HitMeBaby.category2 = 0x0; HitMeBaby.bitfield1 = 0x4F; HitMeBaby.bitfield2 = 0x820C; - HitMeBaby.unkShort = 0; - HitMeBaby.callback = 0x80095950; + HitMeBaby.unkShort1C = 0; + HitMeBaby.callback = &dEn_c::collisionCallback; OSReport("Making the Physics Class and adding to the list"); - - ActivePhysics_InitWithStruct(self->_148, self, HitMeBaby); - ActivePhysics_AddToList(self->_148); - + this->aPhysics.initWithStruct(this, &HitMeBaby); + this->aPhysics.addToList(); OSReport("Going to Execute Mr.Sun"); - - MrSun_Execute(self); + this->onExecute(); return true; } -bool MrSun_Execute(MrSun *self) { +int dMrSun_c::onDelete() { + return true; +} + +int dMrSun_c::onExecute() { OSReport("Oh Mr.Sun, Sun, Mr.Golden Sun"); return true; } +int dMrSun_c::onDraw() { + return true; +} + |