mirror of https://github.com/zeldaret/tmc.git
351 lines
7.9 KiB
C
351 lines
7.9 KiB
C
#ifndef PLAYER_H
|
|
#define PLAYER_H
|
|
|
|
#include "global.h"
|
|
#include "entity.h"
|
|
|
|
enum PlayerActions {
|
|
PLAYER_INIT,
|
|
PLAYER_NORMAL,
|
|
PLAYER_DUMMY,
|
|
PLAYER_FALL,
|
|
PLAYER_JUMP,
|
|
PLAYER_PUSH,
|
|
PLAYER_BOUNCE,
|
|
PLAYER_08070E9C,
|
|
PLAYER_ITEMGET,
|
|
PLAYER_MINISH,
|
|
PLAYER_MINISHDIE,
|
|
PLAYER_08071DB8,
|
|
PLAYER_EMPTYBOTTLE,
|
|
PLAYER_FROZEN,
|
|
PLAYER_0807204C,
|
|
PLAYER_080720DC,
|
|
PLAYER_PULL,
|
|
PLAYER_LAVA,
|
|
PLAYER_WARP,
|
|
PLAYER_08072454,
|
|
PLAYER_DROWN,
|
|
PLAYER_USEPORTAL,
|
|
PLAYER_TALKEZLO,
|
|
PLAYER_ROOMTRANSITION,
|
|
PLAYER_ROLL,
|
|
PLAYER_080728AC,
|
|
PLAYER_INHOLE,
|
|
PLAYER_08072C9C,
|
|
PLAYER_08074C44,
|
|
PLAYER_CLIMB,
|
|
PLAYER_USEENTRANCE,
|
|
PLAYER_PARACHUTE,
|
|
};
|
|
|
|
enum PlayerFrameState {
|
|
PL_STATE_IDLE,
|
|
PL_STATE_WALK,
|
|
PL_STATE_SWORD,
|
|
PL_STATE_GUSTJAR,
|
|
PL_STATE_HOLD,
|
|
PL_STATE_THROW,
|
|
PL_STATE_6,
|
|
PL_STATE_SWIM,
|
|
PL_STATE_PARACHUTE,
|
|
PL_STATE_ROLL,
|
|
PL_STATE_FALL,
|
|
PL_STATE_JUMP,
|
|
PL_STATE_C,
|
|
PL_STATE_D,
|
|
PL_STATE_USEPORTAL,
|
|
PL_STATE_F,
|
|
PL_STATE_TRAPPED,
|
|
PL_STATE_11,
|
|
PL_STATE_DIE,
|
|
PL_STATE_TALKEZLO,
|
|
PL_STATE_CAPE,
|
|
PL_STATE_ITEMGET,
|
|
PL_STATE_DROWN,
|
|
PL_STATE_HOLE,
|
|
PL_STATE_CLIMB,
|
|
PL_STATE_PUSH,
|
|
PL_STATE_PULL,
|
|
PL_STATE_1B,
|
|
PL_STATE_STAIRS,
|
|
};
|
|
|
|
enum PlayerSpawnType {
|
|
PL_SPAWN_DEFAULT,
|
|
PL_SPAWN_MINISH,
|
|
PL_SPAWN_DROP,
|
|
PL_SPAWN_WALKING,
|
|
PL_SPAWN_STEP_IN,
|
|
PL_SPAWN_SPECIAL,
|
|
PL_SPAWN_DROP_MINISH,
|
|
PL_SPAWN_STAIRS_ASCEND,
|
|
PL_SPAWN_STAIRS_DESCEND,
|
|
PL_SPAWN_9,
|
|
PL_SPAWN_PARACHUTE_FORWARD,
|
|
PL_SPAWN_PARACHUTE_UP,
|
|
PL_SPAWN_FAST_TRAVEL,
|
|
};
|
|
|
|
typedef enum {
|
|
CONTROL_ENABLED,
|
|
CONTROL_1,
|
|
CONTROL_2,
|
|
CONTROL_DISABLED,
|
|
} PlayerControlMode;
|
|
|
|
enum PlayerFlags {
|
|
PL_BUSY = 0x1,
|
|
PL_FLAGS2 = 0x2,
|
|
PL_DROWNING = 0x4,
|
|
PL_NO_CAP = 0x8,
|
|
PL_CAPTURED = 0x10,
|
|
PL_USE_PORTAL = 0x20,
|
|
PL_HIDDEN = 0x40,
|
|
PL_MINISH = 0x80,
|
|
PL_DISABLE_ITEMS = 0x100,
|
|
PL_FALLING = 0x200,
|
|
PL_BURNING = 0x400,
|
|
PL_FROZEN = 0x800,
|
|
PL_IN_MINECART = 0x1000,
|
|
PL_DRUGGED = 0x4000,
|
|
PL_FLAGS8000 = 0x8000,
|
|
PL_FLAGS10000 = 0x10000,
|
|
PL_FLAGS20000 = 0x20000,
|
|
PL_ROLLING = 0x40000,
|
|
PL_MOLDWORM_CAPTURED = 0x80000,
|
|
PL_IN_HOLE = 0x100000,
|
|
PL_MOLDWORM_RELEASED = 0x200000,
|
|
PL_CLONING = 0x400000,
|
|
PL_USE_LANTERN = 0x800000,
|
|
PL_PARACHUTE = 0x1000000,
|
|
PL_FLAGS2000000 = 0x2000000,
|
|
PL_ENTER_MINECART = 0x4000000,
|
|
PL_SWORD_THRUST = 0x8000000,
|
|
PL_USE_OCARINA = 0x10000000,
|
|
PL_CLIMBING = 0x20000000,
|
|
};
|
|
|
|
enum SurfaceType {
|
|
SURFACE_NORMAL,
|
|
SURFACE_PIT,
|
|
SURFACE_2,
|
|
SURFACE_3,
|
|
SURFACE_SLOPE_GNDGND_V,
|
|
SURFACE_SLOPE_GNDGND_H,
|
|
SURFACE_6,
|
|
SURFACE_7,
|
|
SURFACE_MINISH_DOOR_FRONT,
|
|
SURFACE_MINISH_DOOR_BACK,
|
|
SURFACE_A,
|
|
SURFACE_B,
|
|
SURFACE_SLOPE_GNDWATER,
|
|
SURFACE_D,
|
|
SURFACE_E,
|
|
SURFACE_F,
|
|
SURFACE_10,
|
|
SURFACE_SWAMP,
|
|
SURFACE_DOOR,
|
|
SURFACE_DOOR_13,
|
|
SURFACE_14,
|
|
SURFACE_CLONE_TILE,
|
|
SURFACE_16,
|
|
SURFACE_ICE,
|
|
SURFACE_SHALLOW_WATER,
|
|
SURFACE_WATER,
|
|
SURFACE_BUTTON,
|
|
SURFACE_1B,
|
|
SURFACE_1C,
|
|
SURFACE_1D, // nulled
|
|
SURFACE_LADDER,
|
|
SURFACE_1F, // nulled
|
|
SURFACE_20,
|
|
SURFACE_21,
|
|
SURFACE_22,
|
|
SURFACE_EDGE,
|
|
SURFACE_24,
|
|
SURFACE_DUST,
|
|
SURFACE_26,
|
|
SURFACE_HOLE,
|
|
SURFACE_LIGHT_GRADE,
|
|
SURFACE_29,
|
|
SURFACE_AUTO_LADDER,
|
|
SURFACE_CLIMB_WALL,
|
|
SURFACE_2C,
|
|
};
|
|
|
|
typedef enum {
|
|
SKILL_NONE = 0,
|
|
SKILL_SPIN_ATTACK = 1,
|
|
SKILL_ROLL_ATTACK = 2,
|
|
SKILL_DASH_ATTACK = 4,
|
|
SKILL_ROCK_BREAKER = 8,
|
|
SKILL_SWORD_BEAM = 0x10,
|
|
SKILL_GREAT_SPIN = 0x20,
|
|
SKILL_DOWN_THRUST = 0x40,
|
|
SKILL_PERIL_BEAM = 0x80,
|
|
SKILL_FOURSWORD = 0x100,
|
|
SKILL_FAST_SPIN = 0x200,
|
|
SKILL_FAST_SPLIT = 0x400,
|
|
SKILL_LONG_SPIN = 0x800
|
|
} PlayerSkill;
|
|
|
|
typedef struct {
|
|
/*0x00*/ u8 action;
|
|
/*0x01*/ s8 preChargeTimer;
|
|
/*0x02*/ u8 swordType;
|
|
/*0x03*/ u8 unk_3;
|
|
/*0x04*/ s16 chargeTimer;
|
|
/*0x06*/ u8 unk_6[2];
|
|
} ChargeState;
|
|
|
|
typedef struct {
|
|
/*0x00*/ u8 field_0x0[2];
|
|
/*0x02*/ u8 jump_status;
|
|
/*0x03*/ u8 field_0x3[2];
|
|
/*0x05*/ u8 heldObject;
|
|
/*0x06*/ u8 pushedObject;
|
|
/*0x07*/ u8 field_0x7;
|
|
/*0x08*/ u16 animation;
|
|
/*0x0a*/ u8 field_0xa;
|
|
/*0x0b*/ u8 keepFacing;
|
|
/*0x0c*/ u8 queued_action;
|
|
/*0x0d*/ u8 field_0xd;
|
|
/*0x0e*/ u8 field_0xe;
|
|
/*0x0f*/ u8 hurtBlinkSpeed;
|
|
/*0x10*/ u8 field_0x10;
|
|
/*0x11*/ u8 field_0x11;
|
|
/*0x12*/ u8 floor_type;
|
|
/*0x13*/ u8 floor_type_last;
|
|
/*0x14*/ u8 field_0x14;
|
|
/*0x15*/ u8 field_0x15;
|
|
/*0x16*/ u16 startPosX;
|
|
/*0x18*/ u16 startPosY;
|
|
/*0x1a*/ u8 mobility;
|
|
/*0x1b*/ u8 sword_state;
|
|
/*0x1c*/ u8 field_0x1c;
|
|
/*0x1d*/ u8 field_0x1d;
|
|
/*0x1e*/ u8 dash_state;
|
|
/*0x1f*/ u8 field_0x1f[3];
|
|
/*0x22*/ u16 field_0x22[2];
|
|
/*0x26*/ u8 swim_state;
|
|
/*0x27*/ u8 field_0x27[5];
|
|
/*0x2c*/ Entity* item;
|
|
/*0x30*/ u32 flags;
|
|
/*0x34*/ u8 field_0x34;
|
|
/*0x35*/ u8 field_0x35;
|
|
/*0x36*/ u8 field_0x36;
|
|
/*0x37*/ u8 field_0x37;
|
|
/*0x38*/ u8 field_0x38;
|
|
/*0x39*/ u8 field_0x39;
|
|
/*0x3a*/ u8 field_0x3a;
|
|
/*0x3b*/ u8 field_0x3b;
|
|
/*0x3c*/ u8 field_0x3c[2];
|
|
/*0x3e*/ u8 swordGoldParticle : 1;
|
|
/* */ u8 swordBlueParticle : 1;
|
|
/* */ u8 filler14 : 6;
|
|
/*0x3f*/ u8 field_0x3f;
|
|
/*0x40*/ u8 path_memory[64];
|
|
/*0x80*/ u16 speed_modifier;
|
|
/*0x82*/ u8 field_0x82[9];
|
|
/*0x8b*/ u8 controlMode;
|
|
/*0x8c*/ u16 vel_x;
|
|
/*0x8e*/ u16 vel_y;
|
|
/*0x90*/ u16 field_0x90;
|
|
/*0x92*/ u16 field_0x92;
|
|
/*0x94*/ u32 field_0x94;
|
|
/*0x98*/ u16 field_0x98;
|
|
/*0x9a*/ u16 field_0x9a;
|
|
/*0x9c*/ u32 field_0x9c;
|
|
/*0xa0*/ ChargeState chargeState;
|
|
/*0xa8*/ u8 framestate;
|
|
/*0xa9*/ u8 framestate_last;
|
|
/*0xaa*/ u8 field_0xaa;
|
|
/*0xab*/ u8 field_0xab;
|
|
/*0xac*/ u16 skills; /**< Bitfield of skills @see PlayerSkill */
|
|
/*0xae*/ u16 field_0xae;
|
|
} PlayerState;
|
|
|
|
typedef struct {
|
|
/*0x00*/ u8 walletType;
|
|
/*0x01*/ u8 heartPieces;
|
|
/*0x02*/ u8 health;
|
|
/*0x03*/ u8 maxHealth;
|
|
/*0x04*/ u8 bombCount;
|
|
/*0x05*/ u8 arrowCount;
|
|
/*0x06*/ u8 bombBagType;
|
|
/*0x07*/ u8 quiverType;
|
|
/*0x08*/ u8 filler[2];
|
|
/*0x0a*/ u8 charm;
|
|
/*0x0b*/ u8 picolyteType;
|
|
/*0x0c*/ u8 itemButtons[2];
|
|
/*0x0e*/ u8 bottles[4];
|
|
/*0x12*/ u8 effect;
|
|
/*0x13*/ u8 hasAllFigurines;
|
|
/*0x14*/ u8 filler3[4];
|
|
/*0x18*/ u16 rupees;
|
|
/*0x1a*/ u16 shells;
|
|
/*0x1c*/ u16 charmTimer;
|
|
/*0x1e*/ u16 picolyteTimer;
|
|
/*0x20*/ u16 effectTimer;
|
|
/*0x22*/ u8 filler4[4];
|
|
} Stats;
|
|
|
|
#define SLOT_A 0
|
|
#define SLOT_B 1
|
|
|
|
typedef struct {
|
|
/*0x0*/ u8 field_0x0;
|
|
/*0x1*/ u8 behaviorID;
|
|
/*0x2*/ u8 field_0x2[2];
|
|
/*0x4*/ u8 stateID;
|
|
/*0x5*/ u8 field_0x5[10];
|
|
/*0xf*/ u8 field_0xf;
|
|
/*0x10*/ u16 field_0x10;
|
|
/*0x12*/ u8 field_0x12[6];
|
|
/*0x18*/ u32 field_0x18;
|
|
} ItemBehavior;
|
|
|
|
extern void (*const gPlayerItemFunctions[])(Entity*);
|
|
|
|
extern u8 gBombBagSizes[];
|
|
extern u8 gQuiverSizes[];
|
|
extern u16 gWalletSizes[];
|
|
extern Entity* gPlayerClones[];
|
|
|
|
extern PlayerState gPlayerState;
|
|
extern Entity gPlayerEntity;
|
|
|
|
u32 CheckPlayerInactive(void);
|
|
void SetPlayerControl(PlayerControlMode mode);
|
|
void ResetPlayer(void);
|
|
void ResetPlayerVelocity(void);
|
|
void ResetPlayerAnimationAndAction(void);
|
|
void SetPlayerActionNormal(void);
|
|
void RespawnAsMinish(void);
|
|
|
|
Entity* CreatePlayerItem(u32, u32, u32, u32);
|
|
|
|
void ResolvePlayerAnimation(void);
|
|
void RegisterPlayerHitbox(void);
|
|
void UpdateFloorType(void);
|
|
void CreateEzloHint(u32, u32);
|
|
|
|
/** @see Item */
|
|
u32 IsItemEquipped(u32);
|
|
/** @see Item */
|
|
u32 GetInventoryValue(u32);
|
|
s32 ModHealth(s32 delta);
|
|
void ModRupees(s32 delta);
|
|
void DeleteClones(void);
|
|
|
|
void sub_08077728();
|
|
extern void sub_08077B20();
|
|
extern u32 sub_08008B22();
|
|
extern u32* sub_08008790(Entity*, u32);
|
|
extern void sub_08079E58(s32 speed, u32 direction);
|
|
|
|
#define COPY_FLAG_FROM_TO(base, src, dest) (base) = ((base) & ~(dest)) | (((dest) * ((base) & (src))) / src)
|
|
|
|
#endif
|