#ifndef ENTITY_H #define ENTITY_H #include "common.h" typedef s32 EntityScript[]; typedef s32 EntityModelScript[]; extern s32 CreateEntityVarArgBuffer[4]; enum { ENTITY_SCRIPT_OP_End, ENTITY_SCRIPT_OP_Jump, ENTITY_SCRIPT_OP_Call, ENTITY_SCRIPT_OP_SetCallback, ENTITY_SCRIPT_OP_Goto, ENTITY_SCRIPT_OP_Label, ENTITY_SCRIPT_OP_RestartBoundScript, ENTITY_SCRIPT_OP_SetFlags, ENTITY_SCRIPT_OP_ClearFlags, ENTITY_SCRIPT_OP_PlaySound, }; enum { ENTITY_MODEL_SCRIPT_OP_End, ENTITY_MODEL_SCRIPT_OP_Draw, ENTITY_MODEL_SCRIPT_OP_Restart, ENTITY_MODEL_SCRIPT_OP_Loop, ENTITY_MODEL_SCRIPT_OP_SetRenderMode, ENTITY_MODEL_SCRIPT_OP_SetFlags, ENTITY_MODEL_SCRIPT_OP_ClearFlags, ENTITY_MODEL_SCRIPT_OP_DrawImage, }; #define es_End ENTITY_SCRIPT_OP_End, #define es_Jump(script) ENTITY_SCRIPT_OP_Jump, (s32)script, #define es_Call(func) ENTITY_SCRIPT_OP_Call, (s32)func, #define es_SetCallback(func, time) ENTITY_SCRIPT_OP_SetCallback, time, (s32)func, #define es_Goto(labelId) ENTITY_SCRIPT_OP_Goto, labelId, #define es_Restart ENTITY_SCRIPT_OP_Goto, 0, #define es_Label(labelId) ENTITY_SCRIPT_OP_Label, labelId, #define es_RestartBoundScript ENTITY_SCRIPT_OP_RestartBoundScript, #define es_SetFlags(flags) ENTITY_SCRIPT_OP_SetFlags, flags, #define es_ClearFlags(flags) ENTITY_SCRIPT_OP_ClearFlags, flags, #define es_PlaySound(soundId) ENTITY_SCRIPT_OP_PlaySound, soundId, #define ems_End ENTITY_MODEL_SCRIPT_OP_End, #define ems_Draw(dlist, holdTime) ENTITY_MODEL_SCRIPT_OP_Draw, holdTime, (s32)dlist, #define ems_Restart ENTITY_MODEL_SCRIPT_OP_Restart, #define ems_Loop ENTITY_MODEL_SCRIPT_OP_Loop, #define ems_SetRenderMode(mode) ENTITY_MODEL_SCRIPT_OP_SetRenderMode, mode, #define ems_SetFlags(flags) ENTITY_MODEL_SCRIPT_OP_SetFlags, flags, #define ems_ClearFlags(flags) ENTITY_MODEL_SCRIPT_OP_ClearFlags, flags, #define ems_DrawImage(raster, palette, width, height, holdTime) ENTITY_MODEL_SCRIPT_OP_DrawImage, holdTime, (s32)raster, (s32)palette, width, height, #define STANDARD_ENTITY_MODEL_SCRIPT(gfx, renderMode) \ { \ ems_SetRenderMode(renderMode) \ ems_Draw(gfx, 60) \ ems_Restart \ ems_End \ } #define ENTITY_ADDR(entity, type, data) (type)((s32)(entity->gfxBaseAddr) + ((s32)(data) & 0xFFFF)) #define ENTITY_ROM(name) { entity_model_##name##_ROM_START, entity_model_##name##_ROM_END } #define BLOCK_GRID_SIZE 25 #define TWEESTER_PATH_STOP 0x80000000 #define TWEESTER_PATH_LOOP 0x80000001 typedef struct SaveBlockData { /* 0x000 */ char unk_0[4]; /* 0x004 */ s16 angle; /* 0x006 */ char unk_6[0x1A]; } SaveBlockData; // size = 0x20 typedef struct SwitchData { /* 0x000 */ f32 fallVel; /* 0x004 */ f32 deltaScaleX; /* 0x008 */ f32 deltaScaleY; /* 0x00C */ char unk_0C[4]; /* 0x010 */ s8 animStateScaleX; /* 0x011 */ s8 animStateScaleY; /* 0x014 */ Vec3f baseScale; /* 0x020 */ u16 areaFlagIndex; /* 0x022 */ s16 greenMotionTimer; /* 0x024 */ s16 scaleAnimTimer; /* 0x028 */ struct Entity* linkedSwitch; } SwitchData; // size = 0x2C typedef struct ShatteringBlockData { /* 0x000 */ u16 fragmentFlags[25]; /* 0x034 */ Gfx** fragmentDisplayLists; /* 0x038 */ f32 originalPosY; /* 0x03C */ s16 alpha; /* 0x03E */ s16 fadeOutCounter; /* 0x040 */ s8 fragmentRebounds[25]; /* 0x059 */ s8 fragmentRotSpeed[25]; /* 0x072 */ u8 fragmentMoveAngle[25]; // scaled to map [0,255] -> [0,360] /* 0x08B */ u8 fragmentRotX[25]; // scaled to map [0,255] -> [0,360] /* 0x0A4 */ u8 fragmentRotY[25]; // scaled to map [0,255] -> [0,360] /* 0x0C0 */ f32 fragmentPosX[25]; /* 0x124 */ f32 fragmentPosY[25]; /* 0x188 */ f32 fragmentPosZ[25]; /* 0x1EC */ f32 fragmentFallSpeed[25]; } ShatteringBlockData; // size = 0x250 typedef struct BlockData { /* 0x000 */ u8 parentEntityIndex; // for block entities spawned by other block entities /* 0x001 */ char unk_01[2]; /* 0x003 */ s8 empty; /* 0x004 */ s16 coinsLeft; /* 0x006 */ s16 timeLeft; /* 0x008 */ char unk_08[2]; /* 0x00A */ u16 gameFlagIndex; /* 0x00C */ char unk_0C[2]; /* 0x00E */ s16 sinkingTimer; /* 0x010 */ s16 item; // for spawned item entities /* 0x012 */ s16 childEntityIndex; // for block entities that spawn other block entities /* 0x014 */ f32 initialY; /* 0x018 */ f32 recoilInterpPhase; /* 0x01C */ char unk_1C[0x4]; } BlockData; // size = 0x20 typedef struct SuperBlockContentData { /* 0x000 */ u8 parentEntityIndex; // for block entities spawned by other block entities /* 0x001 */ u8 unk_01; /* 0x002 */ s8 effectTimer; /* 0x003 */ s8 unk_03; /* 0x004 */ f32 unk_04; /* 0x008 */ u8 paletteTimer; /* 0x009 */ u8 paletteArrOffset; /* 0x00A */ u8 isHidden; /* 0x00B */ char unk_0B; // padding? /* 0x00C */ s32 unk_0C; /* 0x010 */ Mtx unk_10; /* 0x050 */ Mtx unk_50; /* 0x090 */ Mtx unk_90; /* 0x0D0 */ u16 yawBufferPos; /* 0x0D4 */ f32 yawBuffer[20]; /* 0x124 */ s32 unk_124; /* 0x128 */ Gfx* gfx1; /* 0x12C */ Gfx* gfx2; } SuperBlockContentData; // size = 0x130 // size unknown typedef struct HeartBlockContentData { /* 0x000 */ u8 parentEntityIndex; // for block entities spawned by other block entities /* 0x001 */ u8 state; /* 0x002 */ s8 sparkleTimer; /* 0x003 */ s8 sparkleTrailTimer; /* 0x004 */ f32 sparkleTrailPosY; /* 0x008 */ u8 heartbeatTimer; /* 0x009 */ u8 unk_09; /* 0x00A */ u8 sparkleEffectType; /* 0x00B */ char unk_0B; // padding? /* 0x00C */ s32 unk_0C; /* 0x010 */ s32 unk_10; /* 0x014 */ f32 riseVel; /* 0x018 */ f32 sparkleTrailAngle; /* 0x01C */ f32 sparkleTrailRadius; /* 0x020 */ f32 bouncePhase; /* 0x024 */ u16 yawBufferPos; /* 0x026 */ s16 unk_26; /* 0x028 */ f32 yawBuffer[10]; /* 0x050 */ f32 unk_50; /* 0x054 */ f32 rotRate; /* 0x058 */ Mtx unk_58; /* 0x098 */ Mtx unk_98; } HeartBlockContentData; // size = 0xD8 typedef struct WoodenCrateData { /* 0x000 */ s32 itemID; /* 0x004 */ u16 globalFlagIndex; /* 0x006 */ u8 unk_06[2]; /* 0x008 */ Gfx** fragmentsGfx; /* 0x00C */ f32 basePosY; /* 0x010 */ s8 fragmentRebounds[36]; /* 0x034 */ u8 fragmentMoveAngle[36]; // X,Z plane -- scaled to map [0,255] -> [0,360], also used as fragment alpha /* 0x058 */ u8 fragmentRotX[36]; // scaled to map [0,255] -> [0,360] /* 0x07C */ u8 fragmentRotY[36]; // scaled to map [0,255] -> [0,360] /* 0x0A0 */ u8 fragmentLateralSpeed[36]; // scaled to map [0,255] -> [0,25.5] /* 0x0C4 */ f32 fragmentRotSpeed[36]; /* 0x154 */ f32 fragmentPosX[36]; /* 0x1E4 */ f32 fragmentPosY[36]; /* 0x274 */ f32 fragmentPosZ[36]; /* 0x304 */ f32 fragmentFallSpeed[36]; } WoodenCrateData; // size = 0x394 // size unknown typedef struct ChestData { /* 0x00 */ u16 gameFlagIndex; /* 0x02 */ s16 giveItemTimer; /* 0x04 */ u8 state; /* 0x05 */ u8 openState; /* 0x06 */ s8 postLidAnimDelay; /* 0x07 */ s8 unk_07; /* 0x08 */ f32 lidAngle; /* 0x0C */ f32 lidAnimInterpPhase; /* 0x10 */ s32 itemID; /* 0x14 */ s32 itemEntityIndex; /* 0x18 */ Vec3f itemEntityPos; /* 0x24 */ f32 giveItemRadiusInterpPhase; /* 0x28 */ f32 giveItemHeightInterpPhase; /* 0x2C */ f32 itemVelY; /* 0x30 */ s8 gotItemDone; /* 0x31 */ char unk_31[3]; /* 0x34 */ struct EffectInstance* gotItemEffect; } ChestData; // size = 0x38 typedef struct BlueWarpPipeData { /* 0x00 */ s32 unk_00; // proably flags /* 0x04 */ s32 timer; /* 0x08 */ b32 isRaised; /* 0x0C */ s32 entryID; /* 0x10 */ EvtScript* onEnterPipeEvt; /* 0x14 */ s32 flagIndex; /* 0x18 */ f32 finalPosY; } BlueWarpPipeData; // size = 0x1C typedef struct SimpleSpringData { /* 0x00 */ s32 launchVel; } SimpleSpringData; // size = 0x04 typedef struct HiddenPanelData { /* 0x00 */ s8 state; // TODO: enum /* 0x01 */ s8 timer; /* 0x02 */ s8 unk_02; /* 0x03 */ s8 needSpawnItem; /* 0x04 */ s8 unk_04; /* 0x05 */ s8 unk_05; /* 0x06 */ u16 pickupVar; /* 0x08 */ s32 standingNpcIndex; /* 0x0C */ s32 npcFlags; /* 0x10 */ s32 itemID; /* 0x14 */ s32 spawnedItemIndex; /* 0x18 */ Vec3i spawnedItemPos; /* 0x24 */ f32 initialY; /* 0x28 */ f32 riseVel; /* 0x2C */ f32 riseInterpPhase; /* 0x30 */ f32 rotSpeed; /* 0x34 */ Matrix4f entityMatrix; /* 0x74 */ u16 modelID; /* 0x76 */ char unk_76[0x2]; /* 0x78 */ Gfx* renderDList; } HiddenPanelData; // size = 0x7C typedef struct SignpostData { /* 0x00 */ char unk_00[8]; } SignpostData; // size = 0x08 typedef struct PadlockData { /* 0x00 */ f32 pushSpeed; /* 0x04 */ f32 shacklePos; /* 0x08 */ f32 fallSpeed; /* 0x0C */ f32 rotSpeed; /* 0x10 */ u8 blinkCounter; /* 0x11 */ s8 timer; /* 0x12 */ s8 state; /* 0x13 */ char unk_13; /* 0x14 */ Mtx* shackleMtx; /* 0x18 */ Gfx* shackleGfx; } PadlockData; // size = 0x1C typedef struct BoardedFloorData { /* 0x000 */ Gfx** fragmentsGfx; /* 0x004 */ f32 inititalY; /* 0x008 */ s8 fragmentRebounds[13]; /* 0x015 */ u8 fragmentMoveAngle[13]; /* 0x022 */ u8 fragmentRotX[13]; /* 0x02F */ u8 fragmentRotY[13]; /* 0x03C */ u8 fragmentLateralSpeed[13]; /* 0x04C */ f32 fragmentRotSpeed[13]; /* 0x080 */ f32 fragmentPosX[13]; /* 0x0B4 */ f32 fragmentPosY[13]; /* 0x0E8 */ f32 fragmentPosZ[13]; /* 0x11C */ f32 fragmentFallSpeed[13]; } BoardedFloorData; // size = 0x150 typedef struct BombableRockData { /* 0x00 */ Gfx** fragmentsGfx; /* 0x04 */ f32 inititalY; /* 0x08 */ s8 fragmentRebounds[6]; /* 0x0E */ u8 fragmentMoveAngle[6]; /* 0x14 */ u8 fragmentRotX[6]; /* 0x1A */ u8 fragmentRotY[6]; /* 0x20 */ u8 fragmentLateralSpeed[6]; /* 0x28 */ f32 fragmentRotSpeed[6]; /* 0x40 */ f32 fragmentPosX[6]; /* 0x58 */ f32 fragmentPosY[6]; /* 0x70 */ f32 fragmentPosZ[6]; /* 0x88 */ f32 fragmentFallSpeed[6]; } BombableRockData; // size = 0xA0 typedef s32 TweesterPath[]; typedef struct TweesterData { /* 0x00 */ s8 unk_00; /* 0x01 */ s8 faceAnimState; /* 0x02 */ s8 faceAnimTimer; /* 0x03 */ s8 faceAnimTexOffset; /* 0x04 */ f32 rotSpeed; /* 0x08 */ f32 innerWhirlRotY; /* 0x0C */ f32 outerWhirlRotY; /* 0x10 */ Mtx mtxInnerWhirl; /* 0x50 */ Mtx mtxOuterWhirl; /* 0x90 */ s16 innerWhirlTexOffsetX; /* 0x92 */ s16 innerWhirlTexOffsetY; /* 0x94 */ s16 outerWhirlTexOffsetX; /* 0x96 */ s16 outerWhirlTexOffsetY; /* 0x98 */ s16 frameCounter; /* 0x9C */ s32* curPath; /* 0xA0 */ s32** paths; /* 0xA4 */ s16 targetX; /* 0xA6 */ s16 targetY; /* 0xA8 */ s16 targetZ; /* 0xAA */ s16 pathOffset; /* 0xAC */ char unk_AC[12]; /* 0xB8 */ f32 yaw; /* 0xBC */ char unk_BC[4]; } TweesterData; // size = 0xC0; typedef struct StarBoxLauncherData { /* 0x00 */ s8 state; /* 0x01 */ s8 timer; /* 0x02 */ s8 flags; /* 0x03 */ s8 faceDataIndex; /* 0x04 */ s8 faceAnimTimer; /* 0x05 */ s8 faceTexOffset; /* 0x08 */ f32 basePosX; /* 0x0C */ f32 basePosZ; /* 0x10 */ f32 basePosY; /* 0x14 */ f32 riseSpeedPhase; /* 0x18 */ f32 riseVel; /* 0x1C */ f32 rotZPhase; /* 0x20 */ f32 maxRotZ; } StarBoxLauncherData; // size = 0x24 typedef struct CymbalPlantData { /* 0x0 */ u8 state; /* 0x1 */ s8 unk_01; /* 0x2 */ s16 timer; /* 0x4 */ f32 angle; /* 0x8 */ f32 dist; } CymbalPlantData; // size = 0xC typedef struct PinkFlowerData { /* 0x0 */ u16 state; /* 0x2 */ u16 timer; /* 0x4 */ u16 linkedEntityIndex; /* 0x8 */ f32 initialRotY; } PinkFlowerData; // size = 0xC typedef struct SpinningFlowerData { /* 0x00 */ s16 unk_00; /* 0x02 */ s8 state; /* 0x04 */ Vec3f rot; /* 0x10 */ s32 unk_10; /* 0x14 */ f32 spinSpeed; /* 0x18 */ s32 unk_18; /* 0x1C */ char unk_1C[0x0C]; /* 0x28 */ s16 unk_28; /* 0x2A */ s16 unk_2A; /* 0x2C */ s16 unk_2C; /* 0x30 */ Mtx unk_30; } SpinningFlowerData; // size = 0x70 typedef struct TrumpetPlantData { /* 0x0 */ s32 numCoins; } TrumpetPlantData; // size = 0x4 typedef struct MunchlesiaData { /* 0x00 */ s32 unk_00; /* 0x04 */ s8 unk_04[0x8]; /* 0x0C */ f32 unk_0C; /* 0x10 */ f32 unk_10; /* 0x14 */ f32 unk_14; /* 0x18 */ f32 unk_18; } MunchlesiaData; // size = 0x1C typedef struct ArrowSignData { /* 0x00 */ s32 unk_00; /* 0x04 */ f32 angle; /* 0x08 */ f32 unk_08; /* 0x0C */ f32 unk_0C; } ArrowSignData; // size = 0x10 extern ShadowBlueprint CircularShadowA; extern ShadowBlueprint CircularShadowB; extern ShadowBlueprint SquareShadow; extern EntityBlueprint Entity_SavePoint; extern EntityBlueprint Entity_RedSwitch; extern EntityBlueprint Entity_BlueSwitch; extern EntityBlueprint Entity_HugeBlueSwitch; extern EntityBlueprint Entity_GreenStompSwitch; extern EntityBlueprint Entity_InertYellowBlock; extern EntityBlueprint Entity_InertRedBlock; extern EntityBlueprint Entity_BrickBlock; extern EntityBlueprint Entity_MulticoinBlock; extern EntityBlueprint Entity_Hammer1Block; extern EntityBlueprint Entity_Hammer1Block_WideX; extern EntityBlueprint Entity_Hammer1Block_WideZ; extern EntityBlueprint Entity_Hammer1BlockTiny; extern EntityBlueprint Entity_Hammer2Block; extern EntityBlueprint Entity_Hammer2Block_WideX; extern EntityBlueprint Entity_Hammer2Block_WideZ; extern EntityBlueprint Entity_Hammer2BlockTiny; extern EntityBlueprint Entity_Hammer3Block; extern EntityBlueprint Entity_Hammer3Block_WideX; extern EntityBlueprint Entity_Hammer3Block_WideZ; extern EntityBlueprint Entity_Hammer3BlockTiny; extern EntityBlueprint Entity_PushBlock; extern EntityBlueprint Entity_PowBlock; extern EntityBlueprint Entity_YellowBlock; extern EntityBlueprint Entity_HiddenYellowBlock; extern EntityBlueprint Entity_RedBlock; extern EntityBlueprint Entity_HiddenRedBlock; extern EntityBlueprint Entity_TriggerBlock; extern EntityBlueprint Entity_HeartBlock; extern EntityBlueprint Entity_SuperBlock; extern EntityBlueprint Entity_ScriptSpring; extern EntityBlueprint Entity_SimpleSpring; extern EntityBlueprint Entity_HiddenPanel; extern EntityBlueprint Entity_GiantChest; extern EntityBlueprint Entity_Chest; extern EntityBlueprint Entity_WoodenCrate; extern EntityBlueprint Entity_BlueWarpPipe; extern EntityBlueprint Entity_Signpost; extern EntityBlueprint Entity_Padlock; extern EntityBlueprint Entity_PadlockRedFrame; extern EntityBlueprint Entity_PadlockRedFace; extern EntityBlueprint Entity_PadlockBlueFace; extern EntityBlueprint Entity_BoardedFloor; extern EntityBlueprint Entity_BombableRock; extern EntityBlueprint Entity_BombableRock2; extern EntityBlueprint Entity_Tweester; extern EntityBlueprint Entity_StarBoxLauncher; extern EntityBlueprint Entity_CymbalPlant; extern EntityBlueprint Entity_PinkFlower; extern EntityBlueprint Entity_SpinningFlower; extern EntityBlueprint Entity_BellbellPlant; extern EntityBlueprint Entity_TrumpetPlant; extern EntityBlueprint Entity_Munchlesia; extern EntityBlueprint Entity_ArrowSign; typedef struct EntityModel { /* 0x00 */ s32 flags; /* 0x04 */ s8 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 */ EntityModelScript* cmdListReadPos; /* 0x14 */ union { Gfx* displayList; SpriteRasterInfo* imageData; } gfx; /* 0x18 */ Mtx transform; /* 0x58 */ EntityModelScript* cmdListSavedPos; /* 0x5C */ Vec3s* vertexArray; /* 0x60 */ void (*fpSetupGfxCallback)(void*); /* 0x64 */ void* setupGfxCallbackArg0; } EntityModel; // size = 0x68 typedef EntityModel* EntityModelList[MAX_ENTITY_MODELS]; EntityModel* get_entity_model(s32 idx); s32 load_entity_model(EntityModelScript* cmdList); s32 ALT_load_entity_model(EntityModelScript* cmdList); void entity_set_render_script(Entity* entity, EntityModelScript* cmdList); void set_entity_model_render_command_list(s32 idx, EntityModelScript* cmdList); void virtual_entity_list_render_world(void); void virtual_entity_list_render_UI(void); #endif