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; +} + | 
