mirror of https://github.com/zeldaret/tmc.git
				
				
				
			
		
			
				
	
	
		
			269 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			269 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C
		
	
	
	
// clang-format off
 | 
						|
#ifndef ENTITY_H
 | 
						|
#define ENTITY_H
 | 
						|
 | 
						|
#include "global.h"
 | 
						|
#include "sprite.h"
 | 
						|
 | 
						|
typedef enum {
 | 
						|
    PLAYER = 1,
 | 
						|
    ENEMY = 3,
 | 
						|
    PROJECTILE = 4,
 | 
						|
    OBJECT = 6,
 | 
						|
    NPC = 7,
 | 
						|
    PLAYER_ITEM = 8,
 | 
						|
    MANAGER = 9,
 | 
						|
} EntityType;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
    void* entity1;
 | 
						|
    void* entity2;
 | 
						|
    u8 filler[14];
 | 
						|
} UnkStruct;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
    s8 offset_x;
 | 
						|
    s8 offset_y;
 | 
						|
    u8 unk2[4];
 | 
						|
    u8 width;
 | 
						|
    u8 height;
 | 
						|
} Hitbox;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
    s8 offset_x;
 | 
						|
    s8 offset_y;
 | 
						|
    u8 unknown[4];
 | 
						|
    u8 width;
 | 
						|
    u8 height;
 | 
						|
    u8 depth;
 | 
						|
    u8 unknown2[3];
 | 
						|
} Hitbox3D;
 | 
						|
 | 
						|
typedef struct Entity {
 | 
						|
    /*0x00*/ struct Entity* prev;
 | 
						|
    /*0x04*/ struct Entity* next;
 | 
						|
    /*0x08*/ u8 kind; // was: type
 | 
						|
    /*0x09*/ u8 id; // was: subtype
 | 
						|
    /*0x0a*/ u8 type; // was: form
 | 
						|
    /*0x0b*/ u8 type2; // was: parameter
 | 
						|
    /*0x0c*/ u8 action;
 | 
						|
    /*0x0d*/ u8 subAction;
 | 
						|
    /*0x0e*/ u8 actionDelay;
 | 
						|
    /*0x0f*/ u8 field_0xf;
 | 
						|
    /*0x10*/ u8 flags;
 | 
						|
    /*0x11*/ u8 scriptedScene : 4;
 | 
						|
    /*    */ u8 scriptedScene2 : 4;
 | 
						|
    /*0x12*/ s16 spriteIndex;
 | 
						|
    /*0x14*/ u8 animationState;
 | 
						|
    /*0x15*/ u8 direction;
 | 
						|
    /*0x16*/ u8 field_0x16;
 | 
						|
    /*0x17*/ u8 field_0x17;
 | 
						|
    /*0x18*/ union {
 | 
						|
    /*    */     u8 raw;
 | 
						|
    /*    */     struct {
 | 
						|
    /*    */         u32 draw        : 2; // 1-2
 | 
						|
    /*    */         u32 ss2         : 1; //   4
 | 
						|
    /*    */         u32 ss3         : 1; //   8
 | 
						|
    /*    */         u32 shadow      : 2; //0x10-0x20
 | 
						|
    /*    */         u32 flipX       : 1; //0x40
 | 
						|
    /*    */         u32 flipY       : 1; //0x80
 | 
						|
    /*    */     } PACKED b;
 | 
						|
    /*    */ } PACKED spriteSettings;
 | 
						|
    /*0x19*/ struct {
 | 
						|
    /*    */     u32 b0         : 2; // 1-2
 | 
						|
    /*    */     u32 alphaBlend : 2; // 4-8
 | 
						|
    /*    */     u32 b2         : 2; //0x10
 | 
						|
    /*    */     u32 b3         : 2; //0x40
 | 
						|
    /*    */ } PACKED spriteRendering;
 | 
						|
    /*0x1a*/ union {
 | 
						|
    /*    */    u8 raw;
 | 
						|
    /*    */    struct {
 | 
						|
    /*    */        u8 b0 : 4;
 | 
						|
    /*    */        u8 b4 : 4;
 | 
						|
    /*    */    } PACKED b;
 | 
						|
    /*    */} PACKED palette;
 | 
						|
    /*0x1b*/ struct {
 | 
						|
    /*    */     u32 b0    : 1;
 | 
						|
    /*    */     u32 b1    : 5; //0x10
 | 
						|
    /*    */     u32 flipY : 2; //0x40
 | 
						|
    /*    */ } PACKED spriteOrientation;
 | 
						|
    /*0x1c*/ u8 field_0x1c;
 | 
						|
    /*0x1d*/ u8 field_0x1d;
 | 
						|
    /*0x1e*/ u8 frameIndex;
 | 
						|
    /*0x1f*/ u8 lastFrameIndex;
 | 
						|
    /*0x20*/ s32 field_0x20;
 | 
						|
    /*0x24*/ s16 speed;
 | 
						|
    /*0x26*/ u8 spriteAnimation[3];
 | 
						|
    /*0x29*/ struct {
 | 
						|
    /*    */     u8 b0 : 3; // 1-4
 | 
						|
    /*    */     u8 b1 : 3; //   8
 | 
						|
    /*    */     u8 b2 : 2; //0x40
 | 
						|
    /*    */ } PACKED spritePriority;
 | 
						|
    /*0x2a*/ u16 collisions;
 | 
						|
    /*0x2c*/ union SplitWord x;
 | 
						|
    /*0x30*/ union SplitWord y;
 | 
						|
    /*0x34*/ union SplitWord height; // todo
 | 
						|
    /*0x38*/ u8 collisionLayer;
 | 
						|
    /*0x39*/ s8 interactType;
 | 
						|
    /*0x3a*/ u8 field_0x3a;
 | 
						|
    /*0x3b*/ u8 flags2;
 | 
						|
    /*0x3c*/ u8 field_0x3c;
 | 
						|
    /*0x3d*/ s8 iframes;
 | 
						|
    /*0x3e*/ u8 field_0x3e;
 | 
						|
    /*0x3f*/ u8 damageType;
 | 
						|
    /*0x40*/ u8 field_0x40;
 | 
						|
    /*0x41*/ u8 bitfield;
 | 
						|
    /*0x42*/ u8 field_0x42;
 | 
						|
    /*0x43*/ u8 field_0x43;
 | 
						|
    /*0x44*/ u8 field_0x44;
 | 
						|
    /*0x45*/ u8 currentHealth;
 | 
						|
    /*0x46*/ u16 field_0x46;
 | 
						|
    /*0x48*/ Hitbox* hitbox;
 | 
						|
    /*0x4c*/ struct Entity* field_0x4c;
 | 
						|
    /*0x50*/ struct Entity* parent;
 | 
						|
    /*0x54*/ struct Entity* attachedEntity;
 | 
						|
    /*0x58*/ u8 animIndex;
 | 
						|
    /*0x59*/ u8 frameDuration;
 | 
						|
    /*0x5a*/ union {
 | 
						|
    /*    */     u8 all;
 | 
						|
    /*    */     struct {
 | 
						|
    /*    */         u8 f0 : 1;
 | 
						|
    /*    */         u8 f1 : 5;
 | 
						|
    /*    */         u8 f2 : 1; //0x40
 | 
						|
    /*    */         u8 f3 : 1; //0x80
 | 
						|
    /*    */    } PACKED b;
 | 
						|
    /*    */ } PACKED frames;
 | 
						|
    /*0x5b*/ u8 frameSpriteSettings;
 | 
						|
    /*0x5c*/ Frame* animPtr;
 | 
						|
    /*0x60*/ u16 spriteVramOffset;
 | 
						|
    /*0x62*/ u8 spriteOffsetX;
 | 
						|
    /*0x63*/ s8 spriteOffsetY;
 | 
						|
    /*0x64*/ u32* myHeap;
 | 
						|
    /*0x68*/ union SplitHWord field_0x68;
 | 
						|
    /*0x6a*/ union SplitHWord field_0x6a;
 | 
						|
    /*0x6c*/ union SplitHWord field_0x6c;
 | 
						|
    /*0x6e*/ union SplitHWord field_0x6e;
 | 
						|
    /*0x70*/ union SplitWord field_0x70;
 | 
						|
    /*0x74*/ union SplitHWord field_0x74;
 | 
						|
    /*0x76*/ union SplitHWord field_0x76;
 | 
						|
    /*0x78*/ union SplitHWord field_0x78;
 | 
						|
    /*0x7a*/ union SplitHWord field_0x7a;
 | 
						|
    /*0x7c*/ union SplitWord field_0x7c;
 | 
						|
    /*0x80*/ union SplitHWord field_0x80;
 | 
						|
    /*0x82*/ union SplitHWord field_0x82;
 | 
						|
    /*0x84*/ union SplitHWord cutsceneBeh;
 | 
						|
    /*0x86*/ union SplitHWord field_0x86;
 | 
						|
} Entity;
 | 
						|
 | 
						|
typedef struct LinkedList {
 | 
						|
    Entity* last;
 | 
						|
    Entity* first;
 | 
						|
} LinkedList;
 | 
						|
 | 
						|
extern LinkedList gEntityLists[9];
 | 
						|
extern LinkedList gUnk_03003D90;
 | 
						|
 | 
						|
extern LinkedList gUnk_03003DA0;
 | 
						|
 | 
						|
#define TILE(x, y)                                      \
 | 
						|
    (((((x) - gRoomControls.roomOriginX) >> 4) & 0x3fU) | \
 | 
						|
     ((((y) - gRoomControls.roomOriginY) >> 4) & 0x3fU) << 6)
 | 
						|
 | 
						|
#define COORD_TO_TILE(entity) \
 | 
						|
    TILE((entity)->x.HALF.HI, (entity)->y.HALF.HI)
 | 
						|
 | 
						|
#define COORD_TO_TILE_OFFSET(entity, xOff, yOff) \
 | 
						|
    TILE((entity)->x.HALF.HI - (xOff), (entity)->y.HALF.HI - (yOff))
 | 
						|
 | 
						|
enum {
 | 
						|
    DirectionNorth  = 0x00,
 | 
						|
    DirectionEast   = 0x08,
 | 
						|
    DirectionSouth  = 0x10,
 | 
						|
    DirectionWest   = 0x18,
 | 
						|
};
 | 
						|
 | 
						|
#define DirectionRound(expr) ((expr) & 0x18)
 | 
						|
#define DirectionRoundUp(expr) DirectionRound((expr) + 4)
 | 
						|
#define DirectionIsHorizontal(expr) ((expr) & 0x08)
 | 
						|
#define DirectionIsVertical(expr) ((expr) & 0x10)
 | 
						|
#define DirectionTurnAround(expr) (DirectionRoundUp(expr) ^ 0x10)
 | 
						|
#define DirectionToAnimationState(expr) (DirectionRoundUp(expr) >> 3)
 | 
						|
#define DirectionFromAnimationState(expr) ((expr) << 3)
 | 
						|
 | 
						|
#define Direction8Round(expr) ((expr) & 0x1c)
 | 
						|
#define Direction8RoundUp(expr) Direction8Round((expr) + 2)
 | 
						|
#define Direction8TurnAround(expr) (Direction8RoundUp(expr) ^ 0x10)
 | 
						|
#define Direction8ToAnimationState(expr) (Direction8RoundUp(expr) >> 2)
 | 
						|
#define Direction8FromAnimationState(expr) (((expr) << 2)
 | 
						|
 | 
						|
Entity* GetEmptyEntity(void);
 | 
						|
extern Entity* CreateEnemy(u32 id, u32 type);
 | 
						|
extern Entity* CreateNPC(u32 id, u32 type, u32 type2);
 | 
						|
extern Entity* CreateObject(u32 id, u32 type, u32 type2);
 | 
						|
extern Entity* CreateObjectWithParent(Entity* parent, u32 id, u32 type, u32 type2);
 | 
						|
extern Entity* CreateFx(Entity* parent, u32 type, u32 type2);
 | 
						|
 | 
						|
extern void InitializeAnimation(Entity*, u32);
 | 
						|
extern void InitAnimationForceUpdate(Entity*, u32);
 | 
						|
extern void UpdateAnimationSingleFrame(Entity*);
 | 
						|
extern void UpdateSpriteForCollisionLayer(Entity*);
 | 
						|
extern void GetNextFrame(Entity*);
 | 
						|
extern u32 LoadExtraSpriteData(Entity*, SpriteLoadData*);
 | 
						|
extern void SetExtraSpriteFrame(Entity*, u32, u32);
 | 
						|
extern void SetSpriteSubEntryOffsetData1(Entity*, u32, u32);
 | 
						|
extern void SetSpriteSubEntryOffsetData2(Entity*, u32, u32);
 | 
						|
 | 
						|
extern u32 GetFacingDirection(Entity*, Entity*);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Delete the entity currently in execution.
 | 
						|
 */
 | 
						|
void DeleteThisEntity(void);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Delete an entity.
 | 
						|
 */
 | 
						|
void DeleteEntity(Entity*);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Append entity to linked list.
 | 
						|
 */
 | 
						|
void AppendEntityToList(Entity* entity, u32 listIndex);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Prepend entity to linked list.
 | 
						|
 */
 | 
						|
void PrependEntityToList(Entity* entity, u32 listIndex);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Find an entity for a given kind and ID.
 | 
						|
 * @return Entity* First result or NULL if none found
 | 
						|
 */
 | 
						|
Entity* FindEntityByID(u32 kind, u32 id, u32 listIndex);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Search all lists for an entity of same kind and id.
 | 
						|
 * @return Entity* First result or NULL if none found
 | 
						|
 */
 | 
						|
Entity* DeepFindEntityByID(u32 kind, u32 id);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Search all lists for entity of same kind and id.
 | 
						|
 * @return bool32 Duplicate was entity found
 | 
						|
 */
 | 
						|
bool32 EntityHasDuplicateID(Entity* ent);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Find an entity of same kind and id in list.
 | 
						|
 * @return Entity* First result or NULL if none found
 | 
						|
 */
 | 
						|
Entity* FindNextDuplicateID(Entity* ent, int listIndex);
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Find Entity with full identifiers.
 | 
						|
 * @return Entity* First result or NULL if none found
 | 
						|
 */
 | 
						|
Entity* FindEntity(u32 kind, u32 id, u32 listIndex, u32 type, u32 type2);
 | 
						|
 | 
						|
#endif
 |