#ifndef _COMMON_STRUCTS_H_ #define _COMMON_STRUCTS_H_ #include "macros.h" #include "ultra64.h" #include "types.h" #include "si.h" #include "enums.h" struct ScriptInstance; typedef ApiStatus(*ApiFunc)(struct ScriptInstance*, s32); typedef struct { u8 r, g, b, a; } Color_RGBA8; typedef struct Vec2b { /* 0x00 */ s8 x; /* 0x01 */ s8 y; } Vec2b; // size = 0x02 typedef struct Vec2bu { /* 0x00 */ u8 x; /* 0x01 */ u8 y; } Vec2bu; // size = 0x02 typedef struct Vec3b { /* 0x00 */ s8 x; /* 0x01 */ s8 y; /* 0x02 */ s8 z; } Vec3b; // size = 0x03 typedef struct Vec3f { /* 0x00 */ f32 x; /* 0x04 */ f32 y; /* 0x08 */ f32 z; } Vec3f; // size = 0x0C typedef struct Vec3i { /* 0x00 */ s32 x; /* 0x04 */ s32 y; /* 0x08 */ s32 z; } Vec3i; // size = 0x0C typedef struct Vec2s { /* 0x00 */ s16 x; /* 0x02 */ s16 y; } Vec2s; // size = 0x04 typedef struct Vec3s { /* 0x00 */ s16 x; /* 0x02 */ s16 y; /* 0x04 */ s16 z; } Vec3s; // size = 0x06 typedef struct Vec4f { /* 0x00 */ f32 x; /* 0x04 */ f32 y; /* 0x08 */ f32 z; /* 0x0C */ f32 yaw; } Vec4f; // size = 0x10 typedef f32 Matrix4f[4][4]; // size = 0x40 typedef struct Matrix4s { /* 0x00 */ s16 whole[4][4]; /* 0x20 */ s16 frac[4][4]; } Matrix4s; // size = 0x40 typedef struct CamPosSettings { /* 0x00 */ f32 boomYaw; /* 0x04 */ f32 boomLength; /* 0x08 */ f32 boomPitch; /* 0x0C */ f32 viewPitch; /* 0x10 */ Vec3f position; } CamPosSettings; // size = 0x1C typedef struct PartnerData { /* 0x00 */ u8 enabled; /* 0x01 */ s8 level; /* 0x02 */ s16 unk_02[3]; } PartnerData; // size = 0x08 typedef struct HeapNode { /* 0x00 */ UNK_PTR next; /* 0x04 */ s32 length; /* 0x08 */ s16 allocated; /* 0x0A */ s16 entryID; /* 0x0C */ s32 capacity; } HeapNode; // size = 0x10 /// Ring buffer of an NPC's position over the past 20 frames. typedef struct BlurBuffer { /* 0x00 */ s8 unk_00; /* 0x01 */ s8 index; ///< Current blur ring buffer index /* 0x02 */ char unk_02[2]; // padding? /* 0x04 */ f32 x[20]; /* 0x54 */ f32 y[20]; /* 0xA4 */ f32 z[20]; } BlurBuffer; // size = 0xF4 typedef s32 Palette16[16]; // size = 0x40 typedef struct Npc { /* 0x000 */ s32 flags; /* 0x004 */ void (*onUpdate)(struct Npc*); ///< Run before anything else for this NPC in update_npcs() /* 0x008 */ void (*onRender)(struct Npc*); ///< Run after the display list for this NPC is built /* 0x00C */ f32 yaw; /* 0x010 */ f32 planarFlyDist; /* also used for speech, temp0? */ /* 0x014 */ f32 jumpScale; /* also used for speech, temp1? */ /* 0x018 */ f32 moveSpeed; /* 0x01C */ f32 jumpVelocity; /* 0x020 */ struct BlurBuffer* blurBuf; ///< Null unless flag 0x100000 is set. /* 0x024 */ s32 spriteInstanceID; /* 0x028 */ u32 currentAnim; /* 0x02C */ char unk_2C[4]; /* 0x030 */ f32 animationSpeed; /* 0x034 */ f32 renderYaw; /* 0x038 */ Vec3f pos; /* 0x044 */ Vec3f rotation; /* 0x050 */ f32 rotationVerticalPivotOffset; /* 0x054 */ Vec3f scale; /* 0x060 */ Vec3f moveToPos; /* 0x06C */ Vec3f colliderPos; /* used during collision with player */ /* 0x078 */ s32 shadowIndex; /* 0x07C */ f32 shadowScale; /* 0x080 */ s32 unk_80; /* 0x084 */ u16 unk_84; /* 0x086 */ u16 unk_86; /* 0x088 */ s16 isFacingAway; /* 0x08A */ s16 yawCamOffset; /* 0x08C */ s16 turnAroundYawAdjustment; /* 0x08E */ s16 duration; // TODO: name less vaguely /* 0x090 */ Vec3s homePos; /* 0x096 */ char unk_96[12]; /* 0x0A2 */ u16 unk_A2; /* 0x0A4 */ s8 npcID; /* 0x0A5 */ char unk_A5; /* 0x0A6 */ s16 collisionRadius; /* 0x0A8 */ s16 collisionHeight; /* 0x0AA */ u8 renderMode; /* 0x0AB */ s8 unk_AB; /* 0x0AC */ u8 alpha; /* 0x0AD */ u8 alpha2; ///< Multiplied with Npc::alpha /* 0x0AE */ char unk_AD[2]; /* 0x0B0 */ s32** extraAnimList; /* 0x0B4 */ s8 unk_B4; // some kind of rendering type, 0..4 inclusive /* 0x0B5 */ char unk_B5[13]; /* 0x0C1 */ s8 paletteCount; /* 0x0C2 */ char unk_C2[2]; /* 0x0C4 */ UNK_PTR spritePaletteList; /* 0x0C8 */ Palette16 localPaletteData[16]; /* 0x2C8 */ Palette16* localPalettes[16]; /* 0x308 */ char unk_308[0x50]; /* 0x318 */ f32 screenSpaceOffset2D[2]; /* 0x320 */ f32 verticalStretch; /* 0x324 */ struct EffectInstance* decorations[2]; /* 0x32C */ s8 decorationType[2]; /* 0x32E */ s8 changedDecoration; /* 0x32F */ char unk_32F; /* 0x330 */ s8 decorationInitialised[2]; /* 0x332 */ char unk_332[14]; } Npc; // size = 0x340 typedef Npc* NpcList[MAX_NPCS]; typedef struct PlayerData { /* 0x000 */ s8 bootsLevel; /* 0x001 */ s8 hammerLevel; /* 0x002 */ s8 curHP; /* 0x003 */ s8 curMaxHP; /* 0x004 */ u8 hardMaxHP; /* 0x005 */ s8 curFP; /* 0x006 */ s8 curMaxFP; /* 0x007 */ u8 hardMaxFP; /* 0x008 */ u8 maxBP; /* 0x009 */ u8 level; /* 0x00A */ s8 hasActionCommands; /* 0x00B */ char unk_0B; /* 0x00C */ s16 coins; /* 0x00E */ s8 fortressKeyCount; /* 0x00F */ u8 starPieces; /* 0x010 */ s8 starPoints; /* 0x011 */ char unk_11; /* 0x012 */ s8 currentPartner; /* 0x013 */ char unk_13; /* 0x014 */ struct PartnerData partners[12]; /* 0x074 */ s16 keyItems[32]; /* 0x0B4 */ s16 badges[128]; /* 0x1B4 */ s16 invItems[10]; /* 0x1C8 */ s16 storedItems[32]; /* 0x208 */ s16 equippedBadges[64]; /* 0x288 */ char unk_288; /* 0x289 */ u8 merleeSpellType; /* 0x28A */ s8 merleeCastsLeft; /* 0x28B */ char unk_28B; /* 0x28C */ s16 merleeTurnCount; /* 0x28E */ s8 maxStarPower; /* 0x28F */ char unk_28F; /* 0x290 */ s16 specialBarsFilled; /* 0x292 */ char unk_292[2]; /* 0x294 */ s16 otherHitsTaken; /* 0x296 */ s16 unk_296; /* 0x298 */ s16 hitsTaken; /* 0x29A */ s16 hitsBlocked; /* 0x29C */ s16 playerFirstStrikes; /* 0x29E */ s16 enemyFirstStrikes; /* 0x2A0 */ s16 powerBounces; /* 0x2A2 */ s16 battlesCount; /* 0x2A4 */ s16 unk_2A4[4]; /* 0x2AC */ s32 unk_2AC; /* 0x2B0 */ s32 unk_2B0; /* 0x2B4 */ u32 totalCoinsEarned; /* 0x2B8 */ s16 idleFrameCounter; /* frames with no inputs, overflows ever ~36 minutes of idling */ /* 0x2BA */ char unk_2BA[2]; /* 0x2BC */ u32 frameCounter; /* increases by 2 per frame */ /* 0x2C0 */ s16 quizzesAnswered; /* 0x2C2 */ s16 quizzesCorrect; /* 0x2C4 */ s32 unk_2C4[12]; /* 0x2F4 */ s32 unk_2F4[12]; /* 0x324 */ s32 tradeEventStartTime; /* 0x328 */ s32 unk_328; /* 0x32C */ s16 starPiecesCollected; /* 0x32E */ s16 jumpGamePlays; /* 0x330 */ s32 jumpGameTotal; /* all-time winnings, max = 99999 */ /* 0x334 */ s16 jumpGameRecord; /* 0x336 */ s16 smashGamePlays; /* 0x338 */ s32 smashGameTotal; /* all-time winnings, max = 99999 */ /* 0x33C */ s16 smashGameRecord; /* 0x33E */ char unk_33E[2]; } PlayerData; // size = 0x340 typedef union { struct { /* 0x0 */ s16 genericFlagIndex; /* 0x2 */ char unk_2; } bytes; s32 flags; } TriggerFlags; typedef struct Trigger { /* 0x00 */ TriggerFlags flags; /* 0x04 */ s32 params1; /* 0x08 */ s32 params2; /* 0x0C */ UNK_FUN_PTR(functionHandler); /* 0x10 */ Bytecode* scriptStart; /* 0x14 */ struct ScriptInstance* runningScript; /* 0x18 */ s32 priority; /* 0x1C */ s32 scriptVars[3]; /* 0x28 */ char unk_28[4]; /* 0x2C */ s32 unk_2C; /* 0x30 */ u8 unk_30; /* 0x31 */ char unk_31[3]; /* 0x34 */ ScriptID runningScriptID; } Trigger; // size = 0x38 typedef Trigger* TriggerList[MAX_TRIGGERS]; typedef union X32 { s32 s; f32 f; } X32; typedef struct ScriptInstance { /* 0x000 */ u8 state; /* 0x001 */ u8 currentArgc; /* 0x002 */ u8 currentOpcode; /* 0x003 */ u8 priority; /* 0x004 */ u8 groupFlags; /* 0x005 */ s8 blocked; /* 1 = blocking */ /* 0x006 */ s8 loopDepth; /* how many nested loops we are in, >= 8 hangs forever */ /* 0x007 */ s8 switchDepth; /* how many nested switches we are in, max = 8 */ /* 0x008 */ Bytecode* ptrNextLine; /* 0x00C */ Bytecode* ptrReadPos; /* 0x010 */ s8 labelIndices[16]; /* 0x020 */ UNK_PTR labelPositions[16]; /* 0x060 */ UNK_PTR userData; /* unknown pointer; allocated on the heap, free'd in kill_script() */ /* 0x064 */ struct ScriptInstance* blockingParent; /* parent? */ /* 0x068 */ struct ScriptInstance* childScript; /* 0x06C */ struct ScriptInstance* parentScript; /* brother? */ /* 0x070 */ X32 functionTemp[4]; /* 0x080 */ ApiFunc callFunction; /* 0x084 */ s32 varTable[16]; /* 0x0C4 */ s32 varFlags[3]; /* 0x0D0 */ s32 loopStartTable[8]; /* 0x0F0 */ s32 loopCounterTable[8]; /* 0x110 */ s8 switchBlockState[8]; /* 0x118 */ s32 switchBlockValue[8]; /* 0x138 */ s32* buffer; /* 0x13C */ s32* array; /* 0x140 */ s32* flagArray; /* 0x144 */ ScriptID id; /* 0x148 */ union { s32 enemyID; ActorID actorID; struct Enemy* enemy; ///< For overworld scripts owned by an Npc struct Actor* actor; ///< For battle scripts } owner1; ///< Initially -1 /* 0x14C */ union { NpcID npcID; s32 triggerID; struct Npc* npc; ///< For overworld scripts owned by an Npc struct Trigger* trigger; } owner2; ///< Initially -1 /* 0x150 */ f32 timeScale; /* 0x154 */ f32 frameCounter; /* 0x158 */ s32 unk_158; /* 0x15C */ Bytecode* ptrFirstLine; /* 0x160 */ Bytecode* ptrSavedPosition; /* 0x164 */ Bytecode* ptrCurrentLine; } ScriptInstance; // size = 0x168 typedef ScriptInstance* ScriptList[MAX_SCRIPTS]; typedef struct Entity { /* 0x00 */ s32 flags; /* 0x04 */ u8 listIndex; /* 0x05 */ char unk_05; /* 0x06 */ u8 unk_06; /* 0x07 */ s8 unk_07; /* 0x08 */ char unk_08[2]; /* 0x0A */ u8 unk_0A; /* 0x0B */ u8 alpha; /* 0x0C */ Vec3s aabb; /* 0x12 */ char unk_12[2]; /* 0x14 */ s16 virtualModelIndex; /* 0x16 */ s16 shadowIndex; /* 0x18 */ char unk_18[8]; /* 0x20 */ UNK_PTR buildMatrixOverride; /* 0x24 */ char unk_24[4]; /* 0x28 */ Bytecode* boundScript; /* 0x2C */ char unk_2C[12]; /* 0x38 */ struct StaticEntityData* staticData; /* 0x3C */ UNK_PTR unk_3C; // pointer to draw func(?) /* 0x40 */ void* dataBuf; /* 0x44 */ Mtx* vertexData; /* 0x48 */ Vec3f position; /* 0x54 */ Vec3f scale; /* 0x60 */ Vec3f rotation; /* 0x6C */ char unk_6C[4]; /* 0x70 */ Matrix4f* inverseTransformMatrix; /* world-to-local */ /* 0x74 */ char unk_74[60]; /* 0xB0 */ float effectiveSize; /* 0xB4 */ char unk_B4[4]; /* 0xB8 */ Matrix4s transformMatrix; } Entity; // size = 0xF8 typedef Entity* EntityList[MAX_ENTITIES]; typedef struct DynamicEntity { /* 0x00 */ s32 flags; /* 0x04 */ void (*update)(void); /* 0x08 */ void (*draw)(void); } DynamicEntity; typedef DynamicEntity* DynamicEntityList[MAX_DYNAMIC_ENTITIES]; typedef struct StaticEntityData { /* 0x00 */ s16 flags; /* 0x02 */ s16 argSize; /* 0x04 */ UNK_PTR unk_04; /* 0x08 */ char unk_08[4]; /* 0x0C */ UNK_FUN_PTR(unk_data_func); /* 0x10 */ UNK_PTR unk_data_ptr1; /* 0x14 */ UNK_PTR unk_data_ptr2; /* 0x18 */ s32 dmaStart; /* 0x1C */ s32 dmaEnd; /* 0x20 */ u8 entityType; /* 0x21 */ char unk_21[3]; } StaticEntityData; // size = 0x24 typedef struct MusicSettings { /* 0x00 */ u16 flags; /* 0x02 */ u16 unk_02; /* 0x04 */ s32 fadeOutTime; /* 0x08 */ s32 fadeInTime; /* 0x0C */ s16 unk_0C; /* 0x0E */ s16 unk_0E; /* 0x10 */ s32 songID; /* 0x14 */ s32 variation; /* 0x18 */ s32 songName; /* 0x1C */ s32 unk_1C; /* 0x20 */ s32 unk_20; /* 0x24 */ s32 unk_24; /* 0x28 */ s32 unk_28; /* 0x2C */ s32 unk_2C; } MusicSettings; // size = 0x30 typedef struct MenuIcon { /* 0x00 */ u32 flags; /* 0x04 */ u32* readPos; /* 0x08 */ u32* startReadPos; /* 0x0C */ u32* ptrPropertyList; /* 0x10 */ u32* imageAddr; /* 0x14 */ u32* paletteAddr; /* 0x18 */ u32 memOffset; /* 0x1C */ char unk_1C[24]; /* 0x34 */ f32 widthScaleF; /* X.10 fmt (divide by 1024.0 to get float) */ /* 0x38 */ f32 heightScaleF; /* X.10 fmt (divide by 1024.0 to get float) */ /* 0x3C */ s16 renderPosX; /* 0x3E */ s16 renderPosY; /* 0x40 */ u8 screenPosOffset[2]; /* 0x42 */ u8 worldPosOffset[3]; /* 0x45 */ char unk_45[2]; /* 0x47 */ u8 updateTimer; /* 0x48 */ u8 sizeX; /* screen size? */ /* 0x49 */ u8 sizeY; /* screen size? */ /* 0x4A */ char unk_4A[10]; } MenuIcon; // size = 0x54 typedef struct UiStatus { /* 0x00 */ s32 hpIconIndexes[2]; /* 0x08 */ s32 fpIconIndexes[2]; /* 0x10 */ s32 coinIconIndex; /* 0x14 */ s32 coinIconIndex2; /* purpose? */ /* 0x18 */ s32 starpointsIconIndex; /* 0x1C */ s32 starpointsIconIndex2; /* purpose? */ /* 0x20 */ s32 iconIndex8; /* 0x24 */ s32 iconIndex9; /* 0x28 */ s32 iconIndexA; /* 0x2C */ s32 iconIndexB; /* 0x30 */ s32 iconIndexC; /* 0x34 */ s16 drawPosX; /* overall x-offset for whole UI */ /* 0x36 */ s16 drawPosY; /* modulated as it appears, goes away */ /* 0x38 */ s16 showTimer; /* 0x3A */ s8 hidden; /* 0x3B */ s8 unk_3B[2]; /* 0x3D */ u8 displayHP; /* 0x3E */ u8 displayFP; /* 0x3F */ char unk_3F; /* 0x40 */ s16 displayCoins; /* 0x42 */ s16 displayStarpoints; /* 0x44 */ s8 ignoreChanges; /* set != 0 to prevent automatic opening from HP/FP changes */ /* 0x45 */ s8 unk_45[2]; /* 0x47 */ s8 disabled; /* set != 0 for menu to be disabled completely */ /* 0x48 */ s16 displaySP; /* 0x4A */ s8 hpBlinking; /* bool */ /* 0x4B */ u8 hpBlinkCounter; /* 0x4C */ u8 hpBlinkTimer; /* until stop */ /* 0x4D */ s8 fpBlinking; /* bool */ /* 0x4E */ u8 fpBlinkCounter; /* 0x4F */ u8 fpBlinkTimer; /* until stop */ /* 0x50 */ s8 spBlinking; /* 0x51 */ u8 spBlinkCounter; /* 0x52 */ s8 starpointsBlinking; /* bool */ /* 0x53 */ u8 starpointsBlinkCounter; /* 0x54 */ s8 coinsBlinking; /* bool */ /* 0x55 */ u8 coinsBlinkCounter; /* 0x56 */ u8 coinsBlinkTimer; /* until stop */ /* 0x57 */ char unk_57[3]; /* 0x5A */ u8 spBarsToBlink; /* how many sp bars to blink */ /* 0x5B */ char unk_5B; /* 0x5C */ s32 iconIndex10; /* 0x60 */ s32 iconIndex11; /* 0x64 */ s32 iconIndex12; /* 0x68 */ s32 iconIndex13; /* 0x6C */ s8 unk_6C[4]; } UiStatus; // size = 0x70 typedef struct Collider { /* 0x00 */ s32 flags; /* 0x04 */ s16 nextSibling; /* 0x06 */ s16 firstChild; /* 0x08 */ s16 parentModelIndex; /* 0x0A */ s16 numTriangles; /* 0x0C */ struct ColliderTriangle* triangleTable; /* 0x10 */ struct ColliderBoundingBox* aabb; /* 0x14 */ char unk_14[4]; /* 0x18 */ f32* vertexTable[3]; } Collider; // size = 0x1C typedef struct Camera { /* 0x000 */ s16 flags; /* 0x002 */ s16 moveFlags; /* 0x004 */ s16 mode; /* 0x006 */ u16 unk_06; /* 0x008 */ u16 unk_08; /* 0x00A */ s16 viewportW; /* 0x00C */ s16 viewportH; /* 0x00E */ s16 viewportStartX; /* 0x010 */ s16 viewportStartY; /* 0x012 */ s16 nearClip; /* 0x014 */ s16 farClip; /* 0x016 */ char unk_16[2]; /* 0x018 */ f32 vfov; /* 0x01C */ s16 unk_1C; /* 0x01E */ s16 unk_1E; /* 0x020 */ s16 unk_20; /* 0x022 */ s16 unk_22; /* 0x024 */ s16 unk_24; /* 0x026 */ s16 unk_26; /* 0x028 */ s16 unk_28; /* 0x02A */ s16 zoomPercent; /* 0x02C */ s16 backgroundColor[3]; /* 0x032 */ s16 targetScreenCoords[3]; /* 0x038 */ s16 perspNorm; /* 0x03A */ char unk_3A[2]; /* 0x03C */ f32 lookAt_eye[3]; /* 0x048 */ Vec3f lookAt_obj; /* 0x054 */ f32 unk_54; /* 0x058 */ f32 unk_58; /* 0x05C */ f32 unk_5C; /* 0x060 */ Vec3f targetPos; /* 0x06C */ f32 currentYaw; /* 0x070 */ char unk_70[4]; /* 0x074 */ f32 currentBoomYaw; /* 0x078 */ f32 currentBoomLength; /* 0x07C */ f32 currentYOffset; /* 0x080 */ char unk_80[4]; /* 0x084 */ f32 trueRotation[3]; /* 0x090 */ f32 currentBlendedYawNegated; /* 0x094 */ f32 currentPitch; /* 0x098 */ char unk_98[8]; /* 0x0A0 */ Vp viewport; /* 0x0B0 */ char unk_B0[0x24]; /* 0x0D4 */ Matrix4f perspectiveMatrix; /* 0x114 */ Matrix4f viewMtxPlayer; /* centers on player */ /* 0x154 */ Matrix4f viewMtxLeading; /* leads player slightly */ /* 0x194 */ Matrix4f viewMtxShaking; /* used while ShakeCam is active */ /* 0x1D4 */ char unk_1D4[48]; /* 0x204 */ struct Matrix4s* unkMatrix; /* 0x208 */ char unk_208[572]; /* 0x444 */ struct Zone* prevZone; /* 0x448 */ struct Zone* currentZone; /* 0x44C */ struct CamPosSettings initialSettings; /* for start of blend between zones */ /* 0x468 */ struct CamPosSettings targetSettings; /* goal for blend between zones */ /* 0x484 */ f32 sinInterpAlpha; /* 0x488 */ f32 linearInterp; /* 0x48C */ f32 linearInterpScale; /* 3.0? */ /* 0x490 */ f32 moveSpeed; /* 0x494 */ char unk_494[0x8]; /* 0x49C */ f32 unk_49C; /* 0x4A0 */ char unk_4A0[0x10]; /* 0x4B0 */ Vec3f movePos; /* 0x4BC */ char unk_4BC[28]; /* 0x4D8 */ s32 controllerType; /* 0x4DC */ f32 controllerBoomLen; /* 0x4E0 */ f32 controllerBoomPitch; /* 0x4E4 */ Vec3f posA; /* 0x4F0 */ Vec3f posB; /* 0x4FC */ f32 controllerViewPitch; /* 0x500 */ s32 unk_500; /* 0x504 */ s16 boolTargetPlayer; /* 0x506 */ u16 unk_506; /* 0x508 */ f32 panPhase; /* 0x50C */ f32 leadAmount; /* 0x510 */ char unk_510[16]; /* 0x520 */ f32 unk_520; /* 0x524 */ char unk_524[16]; /* 0x534 */ struct ColliderBoundingBox* aabbForZoneBelow; /* 0x538 */ char unk_538[32]; } Camera; // size = 0x558 typedef struct BattleStatusUnkInner { /* 0x00 */ char unk_00[0x10]; /* 0x10 */ s16 unk_10; /* 0x12 */ char unk_12[8]; /* 0x1A */ s16 unk_1A; /* 0x1C */ char unk_1C[8]; /* 0x24 */ s16 unk_24; } BattleStatusUnkInner; // size = unknown typedef struct BattleStatusUnk { /* 0x00 */ char unk_00[0xC]; /* 0x0C */ BattleStatusUnkInner* unk_0C; } BattleStatusUnk; // size = unknown typedef struct FGModelData { /* 0x00 */ char unk_00[0x18]; /* 0x18 */ s32* idList; } FGModelData; // size = unknown typedef struct BattleStatus { /* 0x000 */ s32 flags1; /* 0x004 */ s32 flags2; /* 0x008 */ s32 varTable[16]; /* 0x048 */ u8 currentSubmenu; /* 0x049 */ char unk_49[3]; /* 0x04C */ s8 unk_4C; /* 0x04D */ s8 unk_4D; /* 0x04E */ s8 unk_4E; /* 0x04F */ s8 unk_4F; /* 0x050 */ s8 unk_50; /* 0x051 */ s8 unk_51; /* 0x052 */ s8 unk_52; /* 0x053 */ s8 stratsLastCursorPos; /* 0x054 */ char unk_54[8]; /* 0x05C */ s8 unk_5C; /* 0x05D */ s8 unk_5D; /* 0x05E */ char unk_5E[4]; /* 0x062 */ s8 unk_62; /* 0x063 */ s8 unk_63; /* 0x064 */ char unk_64[12]; /* 0x070 */ s16 unk_70; /* 0x072 */ char unk_72[2]; /* 0x074 */ s32 unk_74; /* 0x078 */ u8 totalStarPoints; /* 0x079 */ u8 pendingStarPoints; /* how many to add */ /* 0x07A */ u8 incrementStarPointDelay; /* related to star points, set to 0x28 when they are dropped */ /* 0x07B */ u8 damageTaken; /* 0x07C */ u8 changePartnerAllowed; /* 0x07D */ char unk_7D[4]; /* 0x081 */ s8 actionSuccess; /* 0x082 */ char unk_82; /* 0x083 */ s8 unk_83; /* 0x084 */ s8 unk_84; /* 0x085 */ s8 unk_85; /* 0x086 */ s8 unk_86; /* 0x087 */ s8 blockResult; /* 0 = fail, 1 = success, -1 = mashed */ /* 0x088 */ u8 itemUsesLeft; /* set to 2 for doublke dip, 3 for triple */ /* 0x089 */ u8 hpDrainCount; /* 0x08A */ char unk_8A; /* 0x08B */ u8 hustleTurns; /* numTurns from hustle drink, normally 0 */ /* 0x08C */ char unk_8C; /* 0x08D */ s8 unk_8D; /* 0x08E */ u8 initialEnemyCount; /* used for SP award bonus */ /* 0x08F */ char unk_8F[3]; /* 0x092 */ s8 unk_92; /* 0x093 */ char unk_93; /* 0x094 */ s8 unk_94; /* 0x095 */ char unk_95; /* 0x096 */ s8 hammerCharge; /* 0x097 */ s8 jumpCharge; /* 0x098 */ char unk_98; /* 0x099 */ u8 dangerFlags; /* 1 = danger, 2 = peril */ /* 0x09A */ s8 outtaSightActive; /* 0x09B */ s8 turboChargeTurnsLeft; /* 0x09C */ u8 turboChargeAmount; /* unused? */ /* 0x09D */ s8 waterBlockTurnsLeft; /* 0x09E */ u8 waterBlockAmount; /* unused? */ /* 0x09F */ char unk_9F; /* 0x0A0 */ s32* unk_A0; /* 0x0A4 */ s8 cloudNineTurnsLeft; /* 0x0A5 */ u8 cloudNineDodgeChance; /* = 50% */ /* 0x0A6 */ char unk_A6[2]; /* 0x0A8 */ s32 cloudNineEffect; /* 0x0AC */ char unk_AC[2]; /* 0x0AE */ u8 hammerLossTurns; /* 0x0AF */ u8 jumpLossTurns; /* 0x0B0 */ u8 itemLossTurns; /* 0x0B1 */ char unk_B1[3]; /* 0x0B4 */ UNK_FUN_PTR(preUpdateCallback); /* 0x0B8 */ char unk_B8[4]; /* 0x0BC */ struct ScriptInstance* controlScript; /* control handed over to this when changing partners */ /* 0x0C0 */ ScriptID controlScriptID; /* 0x0C4 */ struct ScriptInstance* camMovementScript; /* 0x0C8 */ ScriptID camMovementScriptID; /* 0x0CC */ char unk_CC[12]; /* 0x0D8 */ struct Actor* playerActor; /* 0x0DC */ struct Actor* partnerActor; /* 0x0E0 */ struct Actor* enemyActors[24]; /* 0x140 */ s16 enemyIDs[24]; /* 0x170 */ char unk_170; /* 0x171 */ u8 numEnemyActors; /* 0x172 */ char unk_172[6]; /* 0x178 */ s8 moveCategory; /* 0x179 */ char unk_179; /* 0x17A */ s16 selectedItemID; /* 0x17C */ s16 selectedMoveID; /* 0x17E */ s16 currentAttackDamage; /* 0x180 */ s16 lastAttackDamage; /* 0x182 */ char unk_182[2]; /* 0x184 */ s32 currentTargetListFlags; /* set when creating a target list, also obtain from the flags field of moves */ /* 0x188 */ s32 currentAttackElement; /* 0x18C */ s32 currentAttackEventSuppression; /* 0x190 */ s32 currentAttackStatus; /* 0x194 */ u8 statusChance; /* 0x195 */ u8 statusDuration; /* 0x196 */ char unk_196; /* 0x197 */ u8 targetHomeIndex; /* some sort of home idnex used for target list construction */ /* 0x198 */ u8 powerBounceCounter; /* 0x199 */ s8 wasStatusInflicted; /* during last attack */ /* 0x19A */ u8 unk_19A; /* 0x19B */ char unk_19B[5]; /* 0x1A0 */ s16 currentTargetID; /* selected? */ /* 0x1A2 */ u8 currentTargetPart; /* selected? */ /* 0x1A3 */ char unk_1A3; /* 0x1A4 */ s16 currentTargetID2; /* 0x1A6 */ u8 currentTargetPart2; /* 0x1A7 */ s8 battlePhase; /* 0x1A8 */ s16 attackerActorID; /* 0x1AA */ char unk_1AA[4]; /* 0x1AE */ s16 submenuIcons[24]; /* icon IDs */ /* 0x1DE */ u8 submenuMoves[24]; /* move IDs */ /* 0x1F6 */ u8 submenuEnabled[24]; /* 0x20E */ u8 submenuMoveCount; /* 0x20F */ char unk_20F; /* 0x210 */ s32 currentButtonsDown; /* 0x214 */ s32 currentButtonsPressed; /* 0x218 */ s32 currentButtonsHeld; /* 0x21C */ s32 stickX; /* 0x220 */ s32 stickY; /* 0x224 */ s32 inputBitmask; /* 0x228 */ s32 dpadX; /* 0-360 */ /* 0x22C */ s32 dpadY; /* 0-60 */ /* 0x230 */ s32 holdInputBuffer[64]; /* 0x330 */ s32 pushInputBuffer[64]; /* 0x430 */ u8 holdInputBufferPos; /* 0x431 */ u8 inputBufferPos; /* 0x432 */ s8 unk_432; /* 0x433 */ char unk_433; /* 0x434 */ s32 unk_434; /* 0x438 */ FGModelData* foregroundModelData; /* 0x43C */ BattleStatusUnk* unk_43C; /* 0x440 */ u8 tattleFlags[27]; /* 0x45B */ char unk_45B[5]; /* 0x460 */ s32 unk_460; /* 0x464 */ s32 unk_464; /* 0x468 */ char unk_468[4]; /* 0x46C */ s32 battleState; /* 0 = load assets, 1 = create actors, 4 = start scripts, 7 & 8 = unk */ /* 0x470 */ s32 unk_470; /* 0x474 */ s32 unk_474; /* 0x478 */ s8 unk_478; /* 0x479 */ char unk_479; /* 0x47A */ u8 currentBattleSection; /* 0x47B */ u8 unk_47B; /* 0x47C */ s32 unk_47C; /* 0x480 */ s32 unk_480; /* 0x484 */ s32 unk_484; /* 0x488 */ s32 unk_488; /* 0x48C */ struct BattleList* unk_48C; } BattleStatus; // size = 0x490 typedef struct TextureHeader { /* 0x00 */ s8 name[32]; /* 0x20 */ s16 auxW; /* 0x22 */ s16 mainW; /* 0x24 */ s16 auxH; /* 0x26 */ s16 mainH; /* 0x28 */ char unk_28; /* 0x29 */ u8 extraTiles; /* 0x2A */ u8 colorCombine; /* 0x2B */ u8 fmt; /* 0x2C */ u8 bitDepth; /* 0x2D */ u8 wrapH; /* 0x2E */ u8 wrapV; /* 0x2F */ u8 filtering; } TextureHeader; // size = 0x30 typedef struct StaticMove { /* 0x00 */ s32 moveNameID; /* 0x04 */ s32 flags; /* 0x08 */ s32 worldDescID; /* 0x0C */ s32 menuDescID; /* 0x10 */ u8 battleSubmenu; /* 0x11 */ u8 costFP; /* 0x12 */ u8 costBP; /* 0x13 */ u8 actionCommandID; } StaticMove; // size = 0x14 typedef struct CollisionData { /* 0x00 */ f32* vertices; /* 0x04 */ Collider* collider_list; /* 0x08 */ struct ColliderBoundingBox** aabbs; /* 0x0C */ s16 numColliders; /* 0x0E */ char unk_0E[2]; } CollisionData; // size = 0x10 typedef struct Model { /* 0x00 */ u16 flags; /* 0x02 */ s16 modelID; /* 0x04 */ char unk_04[4]; /* 0x08 */ s32* modelNode; /* 0x0C */ struct ModelGroupData* groupData; /* 0x10 */ s32* currentSpecialMatrix; /* 0x14 */ char unk_14[4]; /* 0x18 */ struct Matrix4s specialMatrix; /* 0x58 */ Matrix4f transformMatrix; /* 0x98 */ f32 center[3]; /* 0xA4 */ u8 texPannerID; /* 0xA5 */ u8 specialDisplayListID; /* 0xA6 */ u8 renderMode; /* 0xA7 */ char unk_A7; /* 0xA8 */ u8 textureID; /* 0xA9 */ u8 unk_A9; /* 0xAA */ char unk_AA[6]; } Model; // size = 0xB0 typedef Model* ModelList[MAX_MODELS]; typedef struct AnimatedMesh { /* 0x000 */ s32 flags; /* 0x004 */ u8 renderMode; /* 0x005 */ char unk_05[3]; /* 0x008 */ u32* animation1; /* 0x00C */ u32* animation2; /* 0x010 */ char unk_10[136]; /* 0x098 */ struct Matrix4s mtx; /* 0x0D8 */ char unk_D8[500]; /* 0x2CC */ s32 time; /* 0x2D0 */ char unk_2D0[4]; /* 0x2D4 */ s32 unk_2D4; /* 0x2D8 */ s32 unk_2D8; /* 0x2DC */ char unk_2DC[4]; } AnimatedMesh; // size = 0x2E0 typedef AnimatedMesh* AnimatedMeshList[MAX_ANIMATED_MESHES]; typedef struct PrintHandle { /* 0x000 */ char unk_00[16]; /* 0x010 */ s8* printbuf; /* 0x014 */ char unk_14[1344]; } PrintHandle; // size = 0x554 typedef struct OtherPrint { /* 0x00 */ char unk_00[16]; /* 0x10 */ f32 stringScaleH; /* 0x14 */ f32 stringScaleW; /* 0x18 */ f32 characterScaleH; /* 0x1C */ f32 characterScaleW; /* 0x20 */ char unk_20[32]; /* 0x40 */ s32 currentPosX; /* 0x44 */ char unk_44[16]; } OtherPrint; // size = 0x54 typedef struct ColliderBoundingBox { /* 0x00 */ f32 min[3]; /* 0x0C */ f32 max[3]; /* 0x18 */ s32 flagsForCollider; } ColliderBoundingBox; // size = 0x1C typedef struct StaticItem { /* 0x00 */ s32 nameString; /* 0x04 */ s16 iconID; /* 0x06 */ s16 badgeSortPriority; /* 0x08 */ s32 targetFlags; /* 0x0C */ s16 sellValue; /* 0x0E */ char unk_0E[2]; /* 0x10 */ s32 menuString; /* 0x14 */ s32 itemString; /* 0x18 */ s16 typeFlags; /* 0x1A */ u8 moveID; /* 0x1B */ s8 potencyA; /* 0x1C */ s8 potencyB; /* 0x1D */ char unk_1D[3]; } StaticItem; // size = 0x20 typedef struct EffectInstance { /* 0x00 */ s32 flags; /* 0x04 */ s32 effectIndex; /* 0x08 */ s32 totalMatricies; /* 0x0C */ struct EffectInstanceData* data; /* 0x10 */ struct Effect* effect; } EffectInstance; typedef struct EffectBlueprint { /* 0x00 */ s32 unk_00; /* 0x04 */ s32 effectIndex; /* 0x08 */ void (*init)(EffectInstance* effectInst); /* 0x0C */ void (*update)(EffectInstance* effectInst); /* 0x10 */ void (*renderWorld)(EffectInstance* effectInst); /* 0x14 */ void (*unk_14)(EffectInstance* effectInst); } EffectBlueprint; // size = 0x18 typedef struct Effect { /* 0x00 */ s32 flags; /* 0x04 */ s32 effectIndex; /* 0x08 */ s32 instanceCounter; /* 0x0C */ s32 unk_0C; //? Maybe EffectInstanceData too ? /* 0x10 */ void (*update)(EffectInstance* effectInst); /* 0x14 */ void (*renderWorld)(EffectInstance* effectInst); /* 0x18 */ void (*unk_18)(EffectInstance* effectInst); /* 0x1C */ void* unk_1C; } Effect; // size = 0x20 typedef struct EffectTableEntry { /* 0x00 */ void (*entryPoint)(s32 arg0, s32 arg1, s32 arg2, s32 arg3, f32 x, f32 y, f32 z); /* 0x04 */ void* dmaStart; /* 0x08 */ void* dmaEnd; /* 0x0C */ void* dmaDest; /* 0x10 */ void* unkStartRom; /* 0x14 */ void* unkEndRom; } EffectTableEntry; // size = 0x18 typedef struct ItemEntity { /* 0x00 */ s32 flags; /* 0x04 */ s16 boundVar; /* see make_item_entity */ /* 0x06 */ char unk_06[2]; /* 0x08 */ Vec3f position; /* 0x14 */ struct ItemEntityPhysicsData* physicsData; /* 0x18 */ s16 itemID; /* into item table, also worldIconID */ /* 0x1A */ u8 state; /* 0x1B */ u8 type; /* 0x1C */ u8 pickupDelay; /* num frames before item can be picked up */ /* 0x1D */ char unk_1D; /* 0x1E */ s16 wsFaceAngle; /* < 0 means none */ /* 0x20 */ s16 shadowIndex; /* 0x22 */ char unk_22[2]; /* 0x24 */ u32* readPos; /* 0x28 */ u32* savedReadPos; /* 0x2C */ char unk_2C[2]; /* 0x2E */ u8 unkCounter; /* 0x2F */ s8 unk_2F; /* 0x30 */ f32 scale; /* 0x34 */ char unk_34[8]; /* 0x3C */ s32 framesLeft; /* 0x40 */ s32* currentState; /* 0x44 */ s32 unk_44; /* 0x48 */ s32* sequenceStart; /* 0x4C */ s32* unk_4C; /* 0x50 */ s32* unk_50; /* 0x54 */ s32 unk_54; /* 0x58 */ s32 unk_58; } ItemEntity; // size = 0x5C typedef struct ModelNode { /* 0x00 */ s32 type; /* 2 = model */ /* 0x04 */ UNK_PTR displayList; /* 0x08 */ s32 numProperties; /* 0x0C */ UNK_PTR propertyList; /* 0x10 */ struct ModelGroupData* groupData; } ModelNode; // size = 0x14 typedef struct StaticShadowData { /* 0x00 */ s16 flags; /* 0x02 */ char unk_02[34]; } StaticShadowData; // size = 0x24 typedef struct SpriteComponent { /* 0x00 */ char unk_00[8]; /* 0x08 */ s16** readPos; /* 0x0C */ f32 waitTime; /* 0x10 */ s32 loopCounter; /* 0x14 */ s32 currentRaster; /* 0x18 */ s32 currentPalette; /* 0x1C */ Vec3f posOffset; /* 0x28 */ Vec3f compPos; /* 0x34 */ Vec3f rotation; /* 0x40 */ Vec3f scale; /* 0x4C */ char unk_4C[4]; } SpriteComponent; // size = 0x50 typedef struct PrintContext { /* 0x000 */ s8* string; /* 0x004 */ s16 bufPos; /* 0x006 */ char unk_06[2]; /* 0x008 */ s32 stringID; /* 0x00C */ char unk_0C[4]; /* 0x010 */ u8 buffer[1024]; /* 0x410 */ char unk_410[68]; /* 0x454 */ u8 font; /* 0x455 */ char unk_455; /* 0x456 */ s16 startPosX; /* 0x458 */ s16 startPosY; /* 0x45A */ char unk_45A[45]; /* 0x487 */ u8 unkArraySize; /* 0x488 */ s16 unkArrayunkLength[4]; /* 0x490 */ char unk_490[0x58]; /* 0x4E8 */ u8 currentOption; /* 0x4E9 */ char unk_4E9[19]; /* 0x4FC */ s32 stateFlags; /* 0x500 */ char unk_500[9]; /* 0x509 */ u8 lerpElpasedTime; /* 0x50A */ s16 startX; /* 0x50C */ s16 startY; /* 0x50E */ char unk_50E[6]; /* 0x514 */ s16 sizeY; /* 0x516 */ s16 sizeX; /* 0x518 */ char unk_518[19]; /* 0x52B */ u8 currentImageIndex; /* 0x52C */ char unk_52C[10]; /* 0x536 */ s16 height; /* 0x538 */ s16 width; /* 0x53A */ char unk_53A[30]; } PrintContext; // size = 0x558 typedef struct GameStatus { /* 0x000 */ u32 currentButtons; /* 0x004 */ u32 altCurrentButtons; /* input used for batte when flag 80000 set */ /* 0x008 */ char unk_08[8]; /* 0x010 */ u32 pressedButtons; /* bits = 1 for frame of button press */ /* 0x014 */ u32 altPressedButtons; /* input used for batte when flag 80000 set */ /* 0x018 */ char unk_18[8]; /* 0x020 */ u32 heldButtons; /* bits = 1 every 4th frame during hold */ /* 0x024 */ u32 altHeldButtons; /* input used for batte when flag 80000 set */ /* 0x028 */ char unk_28[8]; /* 0x030 */ u32 prevButtons; /* from previous frame */ /* 0x034 */ char unk_34[12]; /* 0x040 */ s8 stickX; /* with deadzone */ /* 0x041 */ u8 altStickX; /* input used for batte when flag 80000 set */ /* 0x042 */ char unk_42[2]; /* 0x044 */ s8 stickY; /* with deadzone */ /* 0x045 */ u8 altStickY; /* input used for batte when flag 80000 set */ /* 0x046 */ char unk_46[2]; /* 0x048 */ s16 unk_48[4]; /* 0x050 */ s16 unk_50[4]; /* 0x058 */ s16 unk_58; /* 0x05A */ char unk_5A[6]; /* 0x060 */ s16 unk_60; /* 0x062 */ char unk_62[6]; /* 0x068 */ s16 demoButtonInput; /* 0x06A */ s8 demoStickX; /* 0x06B */ s8 demoStickY; /* 0x06C */ ScriptID mainScriptID; /* 0x070 */ s8 isBattle; /* 0x071 */ s8 demoState; /* (0 = not demo, 1 = map demo, 2 = demo map changing) */ /* 0x072 */ u8 nextDemoScene; /* which part of the demo to play next */ /* 0x073 */ u8 contBitPattern; /* 0x074 */ char unk_74; /* 0x075 */ s8 unk_75; /* 0x076 */ s8 unk_76; /* 0x077 */ char unk_77; /* 0x078 */ s8 disableScripts; /* 0x079 */ char unk_79; /* 0x07A */ s8 musicEnabled; /* 0x07B */ char unk_7B; /* 0x07C */ s8 unk_7C; /* 0x07D */ s8 unk_7D; /* 0x07E */ u8 peachFlags; /* (1 = isPeach, 2 = isTransformed, 4 = hasUmbrella) */ /* 0x07F */ s8 peachDisguise; /* (1 = koopatrol, 2 = hammer bros, 3 = clubba) */ /* 0x080 */ u8 peachAnimIdx; ///< @see world_action_idle_peachAnims /* 0x081 */ s8 unk_81; /* 0x082 */ s8 unk_82; /* 0x083 */ s8 unk_83; /* 0x084 */ s8 unk_84; /* 0x085 */ char unk_85; /* 0x086 */ s16 areaID; /* 0x088 */ s16 prevArea; /* 0x08A */ s16 didAreaChange; /* 0x08C */ s16 mapID; /* 0x08E */ s16 entryID; /* 0x090 */ u16 unk_90; /* 0x092 */ u16 unk_92; /* 0x094 */ f32 exitAngle; /* 0x098 */ Vec3f playerPos; /* 0x0A4 */ f32 playerYaw; /* 0x0A8 */ s8 unk_A8; /* 0x0A9 */ s8 unk_A9; /* 0x0AA */ s8 unk_AA; /* 0x0AB */ s8 unk_AB; /* 0x0AC */ s8 loadMenuState; /* 0x0AD */ s8 menuCounter; /* 0x0AE */ s8 bSkipIntro; /* 0x0AF */ char unk_AF[0x7]; /* 0x0B6 */ s16 bootAlpha; /* 0x0B8 */ s16 bootBlue; /* 0x0BA */ s16 bootGreen; /* 0x0BC */ s16 bootRed; /* 0x0BE */ char unk_BE[106]; /* 0x128 */ Vec3f playerTraceNormal; /* 0x134 */ u16 frameCounter; /* 0x136 */ char unk_136[2]; /* 0x138 */ s32 nextRNG; /* 0x13C */ s16 unk_13C; /* 0x13E */ char unk_13E[2]; /* 0x140 */ s32* shopItemData; /* 0x144 */ struct Shop* mapShop; /* 0x148 */ s16 enableBackground; /* (bit 2 is also used for something) */ /* 0x14A */ s16 backgroundMinW; /* 0x14C */ s16 backgroundMinH; /* 0x14E */ s16 backgroundMaxW; /* 0x150 */ s16 backgroundMaxH; /* 0x152 */ s16 backgroundXOffset; /* (used for parallax scroll) */ /* 0x154 */ UNK_PTR backgroundRaster; /* 0x158 */ UNK_PTR backgroundPalette; /* 0x15C */ s16 unk_15C; /* 0x15E */ u16 unk_15E; /* 0x160 */ Vec3s savedPos; /* 0x166 */ u8 saveSlot; /* 0x167 */ u8 loadType; /* (0 = from map, 1 = from main menu) */ /* 0x168 */ s32 saveCount; /* 0x16C */ char unk_16C[12]; } GameStatus; // size = 0x178 /* still; walk; jump; fall; fly; idle; run; talk; hurt; */ typedef struct PartnerAnimations { /* 0x00 */ UNK_PTR anims[9]; } PartnerAnimations; // size = 0x24 typedef struct Shadow { /* 0x00 */ s32 flags; /* 0x04 */ char unk_04[2]; /* 0x06 */ u8 unk_06; /* 0x07 */ char unk_07; /* 0x08 */ s16 unk_08; // entity model index? /* 0x0A */ char unk_0A[6]; /* 0x10 */ struct Vec3f position; /* 0x1C */ struct Vec3f scale; /* 0x28 */ struct Vec3f unk_28; /* 0x34 */ char unk_34[0x44]; } Shadow; // size = 0x78 typedef Shadow* ShadowList[MAX_SHADOWS]; typedef struct PushBlockGrid { /* 0x00 */ s8* cells; /* 0x04 */ u8 numCellsX; /* 0x05 */ u8 numCellsZ; /* 0x06 */ char unk_06[2]; /* 0x08 */ s32 centerPos[3]; /* 0x14 */ UNK_FUN_PTR(dropCallback); /* 0x18 */ char unk_18[4]; } PushBlockGrid; // size = 0x1C typedef struct ItemEntityPhysicsData { /* 0x00 */ f32 verticalVelocity; /* 0x04 */ f32 gravity; /* 2 = normal, 1 = low gravity, higher values never 'settle' */ /* 0x08 */ char unk_08[4]; /* 0x0C */ f32 constVelocity; /* 0x10 */ f32 velx; /* 0x14 */ f32 velz; /* 0x18 */ f32 moveAngle; /* 0x1C */ char unk_1C[8]; } ItemEntityPhysicsData; // size = 0x24 typedef struct RenderTask { /* 0x00 */ s32 renderMode; /* 0x04 */ s32 distance; /* value between 0 and -10k */ /* 0x08 */ void* appendGfxArg; /* 0x0C */ void (*appendGfx)(void*); } RenderTask; // size = 0x10 typedef struct SelectableTarget { /* 0x00 */ s16 actorID; /* 0x02 */ s16 partID; /* sometimes loaded as byte from 0x3 */ /* 0x04 */ s16 pos[3]; /* 0x0A */ char unk_0A[7]; /* 0x11 */ u8 homeCol; /* from xpos --> 0-3 */ /* 0x12 */ u8 homeRow; /* from ypos --> 0-3 */ /* 0x13 */ u8 layer; /* from zpos? --> 0-1 */ } SelectableTarget; // size = 0x14 typedef struct ActorPartMovement { /* 0x00 */ char unk_00[12]; /* 0x0C */ Vec3f goalPos; /* 0x18 */ char unk_18[12]; /* 0x24 */ f32 jumpScale; /* 0x28 */ f32 moveSpeed; /* 0x2C */ char unk_2C[32]; /* 0x4C */ s32 varTable[16]; } ActorPartMovement; // size = 0x8C typedef struct ActorPart { /* 0x00 */ s32 flags; /* 0x04 */ s32 targetFlags; /* initialized to 0 */ /* 0x08 */ struct ActorPartDesc* staticData; /* 0x0C */ struct ActorPart* nextPart; /* 0x10 */ struct ActorPartMovement* movement; /* 0x14 */ Vec3s partOffset; /* 0x1A */ Vec3s visualOffset; /* 0x20 */ Vec3f partOffsetFloat; /* 0x2C */ Vec3f absolutePosition; /* 0x38 */ Vec3f rotation; /* 0x44 */ Vec3s rotationPivotOffset; /* 0x4A */ char unk_4A[2]; /* 0x4C */ Vec3f scale; /* 0x58 */ Vec3f currentPos; /* 0x64 */ f32 yaw; /* 0x68 */ s16 unkOffset[2]; /* 0x6C */ Vec2s targetOffset; /* 0x70 */ s16 unk_70; /* 0x72 */ u8 size[2]; /* 0x74 */ u8 verticalStretch; /* 0x75 */ s8 unk_75; /* 0x76 */ s8 unk_76; /* 0x77 */ char unk_77[1]; /* 0x78 */ u32* defenseTable; /* 0x7C */ s32 eventFlags; /* 0x80 */ s32 partFlags3; /* 0x84 */ s32 unk_84; /* 0x88 */ s32 currentAnimation; /* 0x8C */ s32 unk_8C; /* 0x90 */ f32 animationRate; /* 0x94 */ u32* idleAnimations; /* 0x98 */ s16 opacity; /* 0x9A */ char unk_9A[2]; /* 0x9C */ struct Shadow* shadow; /* 0xA0 */ f32 shadowScale; /* 0xA4 */ s32 partTypeData[6]; /* 0xBC */ s16 actorTypeData2b[2]; /* 0xC0 */ struct DecorationTable* decorationTable; /* initialized to 0 */ } ActorPart; // size = 0xC4 typedef struct ColliderTriangle { /* 0x00 */ f32* v1[3]; /* note: the order of v1,2,3 is reversed from the ijk in the hit file */ /* 0x04 */ f32* v2[3]; /* 0x08 */ f32* v3[3]; /* 0x0C */ f32 e13[3]; /* = v3 - v1 */ /* 0x18 */ f32 e21[3]; /* = v1 - v2 */ /* 0x24 */ f32 e32[3]; /* = v2 - v3 */ /* 0x30 */ f32 normal[3]; /* 0x3C */ s16 oneSided; /* 1 = yes, 0 = no */ /* 0x3E */ char unk_3E[2]; } ColliderTriangle; // size = 0x40 typedef struct StaticPartner { /* 0x00 */ s32 dmaStart; /* 0x04 */ s32 dmaEnd; /* 0x08 */ s32 dmaDest; /* 0x0C */ s32 isFlying; /* 0x10 */ UNK_FUN_PTR(fpInit); /* 0x14 */ Bytecode* spScriptA; /* 0x18 */ Bytecode* spScriptB; /* 0x1C */ Bytecode* spScriptC; /* 0x20 */ Bytecode* spScriptD; /* 0x24 */ s32 idleAnim; /* 0x28 */ UNK_FUN_PTR(fpFuncA); /* 0x2C */ UNK_FUN_PTR(fpFuncB); /* 0x30 */ UNK_FUN_PTR(fpFuncC); /* 0x34 */ UNK_FUN_PTR(fpFuncD); /* 0x38 */ UNK_FUN_PTR(fpFuncE); /* 0x3C */ Bytecode* spScriptX; } StaticPartner; // size = 0x40 typedef struct FontRasterSet { /* 0x00 */ u8 sizeX; /* 0x01 */ u8 sizeY; /* 0x02 */ char unk_02[10]; } FontRasterSet; // size = 0x0C typedef s32(*TriggerHandlerFunc)(struct Trigger*); typedef struct TriggerDefinition { /* 0x00 */ s32 flags; /* 0x04 */ s16 colliderIndex; /* 0x06 */ char unk_06[2]; /* 0x08 */ s32 flagIndex; /* 0x0C */ TriggerHandlerFunc function; /* 0x10 */ char unk_10[4]; /* 0x14 */ s32 unk_14; /* 0x18 */ s32 inputArg3; /* 0x1C */ s32 unk_1C; } TriggerDefinition; // size = 0x20 typedef struct CollisionStatus { /* 0x00 */ s16 pushingAgainstWall; /* FFFF = none for all below VVV */ /* 0x02 */ s16 currentFloor; /* valid on touch */ /* 0x04 */ s16 lastTouchedFloor; /* valid after jump */ /* 0x06 */ s16 floorBelow; /* 0x08 */ s16 currentCeiling; /* valid on touching with head */ /* 0x0A */ s16 unk_0A; /* 0x0C */ s16 unk_0C; /* 0x0E */ s16 unk_0E; /* 0x10 */ s16 unk_10; /* 0x12 */ s16 currentWall; /* 0x14 */ s16 lastWallHammered; /* valid when smashing */ /* 0x16 */ s16 touchingWallTrigger; /* 0/1 */ /* 0x18 */ s16 bombetteExploded; /* 0 = yes, FFFF = no */ /* 0x1A */ char unk_1A[2]; /* 0x1C */ f32 bombetteExplositionPos[3]; } CollisionStatus; // size = 0x28 typedef struct DecorationTable { /* 0x000 */ char unk_00[1729]; /* 0x6C1 */ s8 unk_6C1; /* 0x6C2 */ char unk_6C2[11]; /* 0x6CD */ s8 unk_6CD; /* 0x6CE */ char unk_6CE[6]; /* 0x6D4 */ s32* unk_6D4; /* 0x6D8 */ char unk_6D8[120]; /* 0x750 */ s8 unk_750; /* 0x751 */ s8 unk_751; /* 0x752 */ s8 unk_752; /* 0x753 */ char unk_753[17]; /* 0x764 */ s8 unk_764; /* 0x765 */ s8 unk_765; /* 0x766 */ s8 unk_766; /* 0x767 */ s8 unk_767; /* 0x768 */ s8 unk_768; /* 0x769 */ char unk_769[3]; /* 0x76C */ s16 unk_76C[16]; /* 0x78C */ char unk_78C[76]; /* 0x7D8 */ s8 unk_7D8; /* 0x7D9 */ s8 unk_7D9; /* 0x7DA */ char unk_7DA; /* 0x7DB */ s8 unk_7DB; /* 0x7DC */ s16 scale[16]; /* 0x7FC */ s16 posX[16]; /* 0x81C */ s16 posY[16]; /* 0x83C */ s16 posZ[16]; /* 0x85C */ u8 rotationPivotOffsetX[16]; /* 0x86C */ u8 rotationPivotOffsetY[16]; /* 0x87C */ u8 rotX[16]; /* 0x88C */ u8 rotY[16]; /* 0x89C */ u8 rotZ[16]; /* 0x8AC */ u8 effectType; /* 0 = blur, 14 = none? */ /* 0x8AD */ char unk_8AD[3]; /* 0x8B0 */ struct Temp8025D160* unk_8B0[2]; /* 0x8B8 */ u8 decorationType[2]; /* 0x8BA */ u8 unk_8BA[2]; /* 0x8BC */ u8 unk_8BC[2]; /* 0x8C0 */ s16 unk_8C0[6]; /* 0x8BE */ char unk_8BE[30]; } DecorationTable; // size = 0x8E8 typedef struct Shop { /* 0x000 */ char unk_00[16]; /* 0x010 */ UNK_PTR owner; /* 0x014 */ UNK_PTR staticItemPositions; /* 0x018 */ UNK_PTR staticInventory; /* 0x01C */ UNK_PTR staticPriceList; /* 0x020 */ char unk_20[828]; } Shop; // size = 0x35C typedef struct Encounter { /* 0x00 */ s32 count; /* 0x04 */ struct Enemy* enemy[16]; /* 0x44 */ s16 battle; /* 0x46 */ s16 stage; /* 0x48 */ s16 encounterID; /* 0x4A */ char unk_4C[0x12]; } Encounter; // size = 0x5C typedef struct PlayerPathElement { /* 0x00 */ char unk_00[4]; /* 0x04 */ Vec3f pos; } PlayerPathElement; // size = 0x10 typedef struct AnimatedModel { /* 0x00 */ s32 animModelID; /* 0x04 */ Vec3f pos; /* 0x10 */ Vec3f rot; /* 0x1C */ Vec3f scale; /* 0x28 */ struct Matrix4s* mtx; /* 0x2C */ char unk_2C[60]; /* 0x68 */ u32 currentAnimData; /* 0x6C */ char unk_6C[4]; } AnimatedModel; // size = 0x70 typedef AnimatedModel* AnimatedModelList[MAX_ANIMATED_MODELS]; typedef struct CollisionHeader { /* 0x00 */ s16 numColliders; /* 0x02 */ char unk_02[2]; /* 0x04 */ s32 treeOffset; /* 0x08 */ s16 numVerts; /* 0x0A */ char unk_0A[2]; /* 0x0C */ s32 triangleTableOffset; /* 0x10 */ s16 bbTableSize; /* 0x12 */ char unk_12[2]; /* 0x14 */ s32 bbTableOffset; /* 0x18 */ char unk_18[8]; } CollisionHeader; // size = 0x20 typedef struct Zone { /* 0x00 */ s32 type; /* 0x04 */ f32 boomLength; /* 0x08 */ f32 boomPitch; /* 0x0C */ f32 pos[6]; /* 0x24 */ f32 viewPitch; /* 0x28 */ s32 flag; } Zone; // size = 0x2C typedef struct ActorMovement { /* 0x00 */ Vec3f currentPos; /* 0x0C */ Vec3f goalPos; /* 0x18 */ Vec3f unk_18; /* 0x24 */ char unk_24[24]; /* 0x3C */ f32 acceleration; /* 0x40 */ f32 speed; /* 0x44 */ f32 velocity; /* 0x48 */ f32 angle; /* 0x4C */ f32 distance; } ActorMovement; // size = 0x50; typedef struct Actor { /* 0x000 */ s32 flags; /* 0x004 */ char unk_04[4]; /* 0x008 */ struct ActorDesc* staticActorData; /* 0x00C */ ActorMovement walk; /* 0x05C */ f32 bounceDivisor; /* 0x060 */ char unk_60[4]; /* 0x064 */ s32 animJumpRise; /* 0x068 */ s32 animJumpFall; /* 0x06C */ s32 animJumpLand; /* 0x070 */ s16 moveTime; /* 0x072 */ s16 moveArcAmplitude; /* 0x074 */ char unk_74[3]; /* 0x077 */ u8 jumpPartIndex; /* 0x078 */ char unk_78[16]; /* 0x088 */ s32 varTable[16]; /* 0x0C8 */ ActorMovement fly; /* 0x118 */ f32 flyElapsed; /* 0x11C */ char unk_11C[4]; /* 0x120 */ s16 flyTime; /* 0x122 */ s16 flyArcAmplitude; /* 0x124 */ char unk_124[17]; /* 0x135 */ u8 footStepCounter; /* 0x136 */ u8 actorType; /* 0x137 */ char unk_137; /* 0x138 */ Vec3f homePos; /* 0x144 */ Vec3f currentPos; /* 0x150 */ Vec3s headOffset; /* 0x156 */ Vec3s healthBarPosition; /* 0x15C */ Vec3f rotation; /* 0x168 */ Vec3s rotationPivotOffset; /* 0x16E */ char unk_16E[2]; /* 0x170 */ Vec3f scale; /* 0x17C */ Vec3f scaleModifier; /* multiplies normal scale factors componentwise */ /* 0x188 */ f32 scalingFactor; /* 0x18C */ f32 yaw; /* 0x190 */ Vec2bu size; /* 0x192 */ s16 actorID; /* 0x194 */ s8 unk_194; /* 0x195 */ s8 unk_195; /* 0x196 */ s8 unk_196; /* 0x197 */ s8 unk_197; /* 0x198 */ Vec2b unk_198; /* 0x19A */ s8 unk_19A; /* 0x19B */ char unk_19B[1]; /* 0x19C */ s32 actorTypeData1[6]; /* 4 = jump sound */ /* 0x1B4 */ s16 actorTypeData1b[2]; /* 0x1B8 */ s8 currentHP; /* 0x1B9 */ s8 maxHP; /* 0x1BA */ char unk_1BA[2]; /* 0x1BC */ u8 hpFraction; /* used to render HP bar */ /* 0x1BD */ char unk_1BD[3]; /* 0x1C0 */ Bytecode* idleCode; /* 0x1C4 */ Bytecode* takeTurnCode; /* 0x1C8 */ Bytecode* onHitCode; /* 0x1CC */ Bytecode* onTurnChangeCode; /* 0x1D0 */ struct ScriptInstance* idleScript; /* 0x1D4 */ struct ScriptInstance* takeTurnScript; /* 0x1D8 */ struct ScriptInstance* onHitScript; /* 0x1DC */ struct ScriptInstance* onTurnChangeScript; /* 0x1E0 */ ScriptID idleScriptID; /* 0x1E4 */ ScriptID takeTurnID; /* 0x1E8 */ ScriptID onHitID; /* 0x1EC */ ScriptID onTurnChangeID; /* 0x1F0 */ s8 lastEventType; /* 0x1F1 */ u8 turnPriority; /* 0x1F2 */ u8 enemyIndex; /* actorID = this | 200 */ /* 0x1F3 */ u8 numParts; /* 0x1F4 */ struct ActorPart* partsTable; /* 0x1F8 */ s16 lastDamageTaken; /* 0x1FA */ s16 hpChangeCounter; /* 0x1FC */ s16 damageCounter; /* 0x1FE */ char unk_1FE[2]; /* 0x200 */ s32** unk_200; // Probably a struct but not sure what yet /* 0x204 */ char unk_204[3]; /* 0x207 */ u8 extraCoinBonus; /* 0x208 */ s8 unk_208; /* 0x209 */ char unk_209[3]; /* 0x20C */ u32* statusTable; /* 0x210 */ Status debuff; /* 0x211 */ s8 debuffDuration; /* 0x212 */ s8 staticStatus; /* 0B = yes */ /* 0x213 */ s8 staticDuration; /* 0x214 */ s8 stoneStatus; /* 0C = yes */ /* 0x215 */ s8 stoneDuration; /* 0x216 */ s8 koStatus; /* 0D = yes */ /* 0x217 */ s8 koDuration; /* 0x218 */ s8 transStatus; /* 0E = yes */ /* 0x219 */ s8 transDuration; /* 0x21A */ char unk_21A[2]; /* 0x21C */ u8 status; /* 0x21D */ char unk_21D[3]; /* 0x220 */ s8 isGlowing; /* 0x221 */ u8 attackBoost; /* 0x222 */ s8 defenseBoost; /* 0x223 */ u8 chillOutAmount; /* attack reduction */ /* 0x224 */ u8 chillOutTurns; /* 0x225 */ char unk_225[7]; /* 0x22C */ struct SelectableTarget targetData[24]; /* 0x40C */ s8 targetListLength; /* 0x40D */ s8 targetIndexList[24]; /* into targetData */ /* 0x425 */ s8 selectedTargetIndex; /* into target index list */ /* 0x426 */ s8 targetPartIndex; /* 0x427 */ char unk_427; /* 0x428 */ s16 targetActorID; /* 0x42A */ char unk_42A[2]; /* 0x42C */ struct Shadow* shadow; /* might be shadow ID */ /* 0x430 */ f32 shadowScale; /* = actor size / 24.0 */ /* 0x434 */ s16 renderMode; /* initially 0xD, set to 0x22 if any part is transparent */ /* 0x436 */ s16 unk_436; /* 0x438 */ s32 x[2]; /* ??? see FUN_80253974 */ /* 0x440 */ struct MenuIcon* ptrDefuffIcon; } Actor; // size = 0x444 typedef struct TileDescriptor { /* 0x00 */ s8 name[32]; /* 0x20 */ s16 auxW; /* 0x22 */ s16 mainW; /* 0x24 */ s16 auxH; /* 0x26 */ s16 mainH; /* 0x28 */ char unk_28; /* 0x29 */ u8 extraTiles; /* 0x2A */ u8 colorCombine; /* 0x2B */ u8 fmt; /* 0x2C */ u8 bitDepth; /* 0x2D */ u8 wrapH; /* 0x2E */ u8 wrapV; /* 0x2F */ u8 filtering; } TileDescriptor; // size = 0x30 typedef struct BackgroundHeader { /* 0x00 */ void* raster; /* 0x04 */ void* palette; /* 0x08 */ u16 startX; /* 0x0A */ u16 startY; /* 0x0C */ u16 width; /* 0x0E */ u16 height; } BackgroundHeader; // size = 0x10 typedef struct ModelGroupData { /* 0x00 */ UNK_PTR transformMatrix; /* 0x04 */ UNK_PTR lightingGroup; /* 0x08 */ s32 numLights; /* 0x0C */ s32 numChildren; /* 0x10 */ struct ModelNode** childList; } ModelGroupData; // size = 0x14 typedef struct FontData { /* 0x00 */ char unk_00[24]; } FontData; // size = 0x18 typedef struct Crash { /* 0x000 */ char unk_00[20]; /* 0x014 */ s32 threadID; /* 0x018 */ char unk_18[12]; /* 0x024 */ s64 AT; /* 0x02C */ s64 V0; /* 0x034 */ s64 V1; /* 0x03C */ s64 A0; /* 0x044 */ s64 A1; /* 0x04C */ s64 A2; /* 0x054 */ s64 A3; /* 0x05C */ char unk_5C[16]; /* 0x06C */ s32 T2; /* 0x070 */ char unk_70[168]; /* 0x118 */ s32 SR; /* 0x11C */ s32 PC; /* 0x120 */ s32 interrupt; /* 0x124 */ s32 VA; /* 0x128 */ char unk_128[208]; } Crash; // size = 0x1F8 typedef struct PlayerStatus { /* 0x000 */ s32 flags; /* 0x004 */ u32 animFlags; /* 0x008 */ s16 framesOnGround; /* Number of frames since last jump landed */ /* 0x00A */ char unk_0A[2]; /* 0x00C */ s8 peachDisguise; /* 0x00D */ s8 unk_0D; /* 0x00E */ u8 alpha1; /* 0x00F */ u8 alpha2; /* 0x010 */ s16 unk_10; /* 0x012 */ s16 moveFrames; /* 0x014 */ s8 enableCollisionOverlapsCheck; /* 0x015 */ s8 statusMenuCounterinputEnabledCounter; /* whether the C-up menu can appear */ /* 0x016 */ Vec3s lastGoodPosition; /* 0x01C */ Vec3f extraVelocity; /* 0x028 */ Vec3f position; /* 0x034 */ char unk_34[16]; /* 0x044 */ f32 decorationPos[2]; /* 0x04C */ char unk_4C[4]; /* 0x050 */ f32 jumpApexHeight; /* 0x054 */ f32 currentSpeed; /* 0x058 */ f32 walkSpeed; /* 0x05C */ f32 runSpeed; /* 0x060 */ char unk_60[4]; /* 0x064 */ f32 unk_64; /* 0x068 */ f32 normalPitch; /* 0x06C */ f32 unk_6C; /* 0x070 */ f32 gravityIntegrator[4]; /* 0x080 */ f32 targetYaw; /* 0x084 */ f32 currentYaw; /* 0x088 */ f32 unk_88; /* 0x08C */ f32 unk_8C; /* 0x090 */ f32 unk_90; /* 0x094 */ s32 unk_94; /* 0x098 */ s32 unk_98; /* 0x09C */ s32 unk_9C; /* 0x0A0 */ f32 heading; /* 0x0A4 */ s32 trueAnimation; ///< Encoding back-facing sprite /* 0x0A8 */ f32 spriteFacingAngle; /* angle of sprite, relative to camera, from 0 to 180 */ /* 0x0AC */ char unk_AC[4]; /* 0x0B0 */ s16 colliderHeight; /* 0x0B2 */ s16 colliderDiameter; /* 0x0B4 */ s8 actionState; /* 0x0B5 */ u8 prevActionState; /* 0x0B6 */ s8 fallState; ///< Also used as sleep state in Peach idle action /* 0x0B7 */ char unk_B7; /* 0x0B8 */ s32 anim; /* 0x0BC */ u16 unk_BC; /* 0x0BE */ s8 renderMode; /* 0x0BF */ s8 unk_BF; /* 0x0C0 */ s16 decorationList; /* 0x0C2 */ s16 unk_C2; /* 0x0C4 */ char unk_C4; /* 0x0C5 */ s8 unk_C5; /* 0x0C6 */ s16 unk_C6; /* 0x0C8 */ s32* unk_C8; /* 0x0CC */ s32 shadowID; /* 0x0D0 */ char unk_D0[8]; /* 0x0D8 */ UNK_PTR** unk_D8; /* 0x0DC */ s32 currentButtons; /* 0x0E0 */ s32 pressedButtons; /* 0x0E4 */ s32 heldButtons; /* 0x0E8 */ s32 stickAxis[2]; /* 0x0F0 */ s32 currentButtonsBuffer[10]; /* 0x118 */ s32 pressedButtonsBuffer[10]; /* 0x140 */ s32 heldButtonsBuffer[10]; /* 0x168 */ s32 stickXBuffer[10]; /* 0x190 */ s32 stickYBuffer[10]; /* 0x1B8 */ s32 inputBufPos; /* 0x1BC */ char unk_1BC[204]; } PlayerStatus; // size = 0x288 typedef struct AnimatedModelNode { /* 0x00 */ u32* displayList; /* 0x04 */ s16 rot[3]; /* range = -180,180 */ /* 0x0A */ char unk_0A[34]; } AnimatedModelNode; // size = 0x2C typedef struct EncounterStatus { /* 0x000 */ s32 flags; /* 0x004 */ u8 eFirstStrike; /* 0 = none, 1 = player, 2 = enemy */ /* 0x005 */ s8 hitType; /* 1 = none/enemy, 2 = jump */ /* 0x006 */ s8 hitTier; /* 0 = normal, 1 = super, 2 = ultra */ /* 0x007 */ char unk_07; /* 0x008 */ s8 unk_08; /* 0x009 */ s8 battleOutcome; /* 0 = won, 1 = lost */ /* 0x00A */ s8 unk_0A; /* 0x00B */ s8 merleeCoinBonus; /* triple coins when != 0 */ /* 0x00C */ u8 damageTaken; /* valid after battle */ /* 0x00D */ char unk_0D; /* 0x00E */ s16 coinsEarned; /* valid after battle */ /* 0x010 */ char unk_10; /* 0x011 */ u8 allowFleeing; /* 0x012 */ s8 unk_12; /* 0x013 */ u8 dropWhackaBump; /* 0x014 */ s32 songID; /* 0x018 */ s32 unk_18; /* 0x01C */ s8 numEncounters; /* number of encounters for current map (in list) */ /* 0x01D */ s8 currentAreaIndex; /* 0x01E */ u8 currentMapIndex; /* 0x01F */ u8 currentEntryIndex; /* 0x020 */ u8 mapID; /* 0x021 */ s8 resetMapEncounterFlags; /* 0x021 */ char unk_22[2]; /* 0x024 */ s32* npcGroupList; /* 0x028 */ struct Encounter* encounterList[24]; /* 0x088 */ struct Encounter* currentEncounter; /* 0x08C */ struct Enemy* currentEnemy; /* 0x090 */ s32 fadeOutAmount; /* 0x094 */ s32 unk_94; /* 0x098 */ s32 fadeOutAccel; /* 0x09C */ s32 battleStartCountdown; /* 0x0A0 */ char unk_A0[16]; /* 0x0B0 */ s32 defeatFlags[60][12]; /* 0xFB0 */ s16 recentMaps[2]; /* 0xFB4 */ char unk_FB4[4]; } EncounterStatus; // size = 0xFB8 typedef struct SaveData { /* 0x0000 */ char magicString[16]; /* "Mario Story 006" string */ /* 0x0010 */ s8 pad[32]; /* always zero */ /* 0x0030 */ s32 crc1; /* 0x0034 */ s32 crc2; /* 0x0038 */ s32 saveSlot; /* 0x003C */ s32 saveCount; /* 0x0040 */ struct PlayerData player; /* 0x0380 */ char unk_380[0xE0]; /* 0x0460 */ s32 starPoints; /* 0x0464 */ char unk_464[4]; /* 0x0468 */ s16 areaID; /* 0x046A */ s16 mapID; /* 0x046C */ s16 entryID; /* 0x046E */ char unk_46E[2]; /* 0x0470 */ s32 enemyDefeatFlags[720]; /* 0x0FB0 */ s32 globalFlags[64]; /* 0x10B0 */ s8 globalBytes[512]; /* 0x12B0 */ s32 areaFlags[8]; /* 0x12D0 */ s8 areaBytes[16]; /* 0x12E0 */ char unk_12E0[6]; /* 0x12E6 */ s16 savePos[3]; /* 0x12EC */ s32 unk_12EC; /* 0x12F0 */ s8 unk_12F0[12]; /* player name starts at 4th char */ /* 0x12FC */ s32 unk_12FC; /* 0x1300 */ s32 unk_1300; /* 0x1304 */ char unk_1304[0x7C]; } SaveData; // size = 0x1380 typedef struct { /* 0x00 */ s32 numVectors; /* 0x04 */ s32 unk_04; /* 0x08 */ Vec3f* staticVectorList; /* 0x0C */ Vec3f* vectors; /* 0x10 */ s32 timeElapsed; /* 0x14 */ s32 timeLeft; /* 0x18 */ s32 easingType; } Path; // size = 0x1C typedef struct { /* 0x00 */ s8 enabled; /* 0x01 */ u8 listStart; /* 0x02 */ u8 numCols; /* 0x03 */ u8 numRows; /* 0x04 */ s32 startIndex; /* 0x08 */ s32 count; } PauseItemPage; // size = 0xC typedef struct { /* 0x00 */ char unk_00[8]; /* 0x08 */ s8* unk_08; /* 0x0C */ void* fpInit; /* 0x10 */ void* fpHandleInput; /* 0x14 */ void* fpUpdate; /* 0x18 */ void* fpCleanup; } MenuTab; // size = 0x1C typedef struct { /* 0x00 */ s8 flags; /* 0x01 */ char unk_01; /* 0x02 */ s8 unk_02; // related to heirarchy somehow - sibling? group? /* 0x03 */ s8 parent; // ? /* 0x04 */ s32 unk_04; /* 0x08 */ UNK_PTR unk_08; /* 0x0C */ s16 posX; /* 0x0E */ s16 posY; /* 0x10 */ s16 width; /* 0x12 */ s16 height; /* 0x14 */ UNK_PTR fpDrawContents; /* 0x18 */ s32 unk_18; // MenuTab pointer for pause menu tabs /* 0x1C */ s8 unk_1C; /* 0x1D */ char unk_1D[3]; } UIPanel; // size = 0x20 // BEGIN ENTITY-SPECIFIC STRUCTS typedef struct struct802E2BA4 { /* 0x00 */ char unk_00[2]; /* 0x02 */ u16 unk_02[24][2]; } struct802E2BA4; // from 102c80, size unknown. typedef struct struct802E1400 { /* 0x000 */ Vec3f unk_00; /* 0x00C */ char unk_0C[4]; /* 0x010 */ s8 unk_10; /* 0x011 */ s8 unk_11; /* 0x014 */ Vec3f unk_14; /* 0x020 */ u16 unk_20; /* 0x022 */ s16 unk_22; /* 0x024 */ s16 unk_24; /* 0x028 */ Entity* attachedEntity; /* 0x02C */ char unk_2C[8]; /* 0x034 */ struct802E2BA4* unk_34; /* 0x038 */ f32 unk_38; /* 0x03C */ union { /* */ s16 s; /* */ s8 b[2]; } unk_3C; /* 0x03E */ char unk_3E[0x4D]; /* 0x08B */ u8 unk_8B[24]; /* 0x0A3 */ char unk_A3; // padding? /* 0x0A4 */ u8 unk_A4[24]; /* 0x0BC */ char unk_BC[4]; /* 0x0C0 */ f32 unk_C0[24]; /* 0x120 */ char unk_120[4]; /* 0x124 */ f32 unk_124[24]; /* 0x184 */ char unk_184[4]; /* 0x188 */ f32 unk_188[24]; } struct802E1400; // from 104940_len_dc0, size unknown // appears to belong to the hammer blocks(?) typedef struct struct802E3650 { /* 0x000 */ u8 unk_00; /* 0x001 */ char unk_01[2]; /* 0x003 */ s8 unk_03; /* 0x004 */ s16 unk_04; /* 0x006 */ s16 unk_06; /* 0x008 */ char unk_08[2]; /* 0x00A */ u16 unk_0A; /* 0x00C */ char unk_0C[2]; /* 0x00E */ s16 unk_0E; /* 0x010 */ s16 unk_10; /* 0x012 */ s16 unk_12; /* 0x014 */ f32 unk_14; /* 0x018 */ f32 unk_18; /* 0x01C */ char unk_1C[0x10C]; /* 0x128 */ UNK_PTR unk_128; /* 0x12C */ UNK_PTR unk_12C; } struct802E3650; // size unknown typedef struct struct802E4B10 { /* 0x00 */ u8 unk_00; /* 0x01 */ u8 unk_01; /* 0x02 */ s8 unk_02; /* 0x03 */ char unk_03[6]; /* 0x09 */ u8 unk_09; /* 0x0A */ u8 unk_0A; /* 0x0B */ char unk_0B; // padding? /* 0x0C */ s32 unk_0C; /* 0x10 */ s32 unk_10; /* 0x14 */ char unk_14[0xBC]; /* 0xD0 */ u16 unk_D0; /* 0xD4 */ f32 unk_D4[0]; } struct802E4B10; // END ENTITY-SPECIFIC STRUCTS typedef struct { /* 0x00000 */ LookAt lookAt[2]; /* 0x00030 */ Matrix4s camPerspMatrix[8]; // could only be length 4, unsure /* 0x00230 */ Gfx mainGfx[0x2080]; /* 0x10630 */ Gfx backgroundGfx[0x200]; // used by gfx_task_background /* 0x11630 */ Matrix4s matrixStack[0x200]; } DisplayContext; // size = 0x19630 typedef struct EffectInstanceData { /* 0x00 */ s32 unk_00; /* 0x04 */ Vec3f pos; /* 0x10 */ Vec3f rotation; /* 0x1C */ Vec3f scale; /* 0x28 */ char unk_28[0x4]; /* 0x2C */ s32 unk_2C; /* 0x30 */ f32 unk_30; /* 0x34 */ char unk_34[0x4C]; } EffectInstanceData; // size = 0x80 typedef struct Temp8010F250 { /* 0x00 */ s8 unk_00; /* 0x01 */ s8 unk_01; /* 0x02 */ char unk_02[5]; /* 0x07 */ s8 unk_07; /* 0x08 */ s32 unk_08; /* 0x0C */ s32 unk_0C; /* 0x10 */ char unk_10[0x20]; /* 0x30 */ SoundID unk_30; } Temp8010F250; // size = 0x34 typedef struct Temp8010EBB0 { /* 0x000 */ s8 unk_00; /* 0x001 */ s8 unk_01; /* 0x002 */ s8 unk_02; /* 0x003 */ s8 unk_03; /* 0x004 */ char unk_04[0x4]; /* 0x008 */ s32 unk_08; /* 0x009 */ s32 unk_0C; /* 0x010 */ char unk_10[0x4]; /* 0x014 */ s8 unk_14; /* 0x015 */ char unk_15[0x343]; /* 0x358 */ s32 unk_358; /* 0x35C */ char unk_35C[0x4]; } Temp8010EBB0; // size = 0x360 typedef struct Temp8025D160 { /* 0x00 */ s32 unk_00; /* 0x04 */ char unk_04[8]; /* 0x0C */ struct Temp8025D160_2* unk_0C; } Temp8025D160; // size = 0x10 (?) typedef struct Temp8025D160_2 { /* 0x00 */ s32 unk_00; /* 0x04 */ f32 unk_04; /* 0x08 */ f32 unk_08; /* 0x0C */ f32 unk_0C; /* 0x10 */ char unk_10[12]; /* 0x1C */ s32 unk_1C; /* 0x20 */ s32 unk_20; /* 0x24 */ char unk_24[8]; /* 0x2C */ s32 unk_2C; } Temp8025D160_2; // size = 0x30 (?) typedef struct EntityModel { /* 0x00 */ s32 flags; /* 0x04 */ u8 renderMode; /* 0x05 */ u8 unk_05; /* 0x06 */ u8 unk_06; /* 0x07 */ u8 unk_07; /* 0x08 */ f32 nextFrameTime; ///< Set to 1.0 after each update /* 0x0C */ f32 timeScale; ///< Default is 1.0 /* 0x10 */ s32* cmdListReadPos; /* 0x14 */ Gfx* displayList; /* 0x18 */ Matrix4s transform; /* 0x58 */ s32 cmdListSavedPos; /* 0x5C */ Vtx* vertexArray; /* 0x60 */ UNK_FUN_PTR(fpSetupGfxCallback); /* 0x64 */ s32 setupGfxCallbackArg0; } EntityModel; // size = 0x68 typedef EntityModel* EntityModelList[MAX_ENTITY_MODELS]; #endif