z_player documentation 2024-10-11 (#4407)

* Add names to start of typedefs

* Idle stuff

* 2 functions

* Player state flags

* Name functions + misc

* ActionChange => ActionHandler

* Some player unks

* More player unks

* Header misc

* Misc

* More misc

* Player Actions

* Missed comments

* Move ship specific stuff

* Fix build

* CsCmdActorAction to CsCmdActorCue

* Fix build
This commit is contained in:
Pepe20129
2024-10-17 20:55:31 +02:00
committed by GitHub
parent 3c5d9faba3
commit b5c6545d6f
65 changed files with 3603 additions and 2562 deletions

View File

@@ -415,7 +415,7 @@ f32 Actor_WorldDistXZToPoint(Actor* actor, Vec3f* refPoint);
void func_8002DBD0(Actor* actor, Vec3f* result, Vec3f* arg2);
f32 Actor_HeightDiff(Actor* actorA, Actor* actorB);
f32 Player_GetHeight(Player* player);
s32 Player_ActionChange_2(Player* player, PlayState* play);
s32 Player_ActionHandler_2(Player* player, PlayState* play);
f32 func_8002DCE4(Player* player);
s32 func_8002DD6C(Player* player);
s32 func_8002DD78(Player* player);
@@ -1107,7 +1107,7 @@ void Player_SetBootData(PlayState* play, Player* player);
s32 Player_InBlockingCsMode(PlayState* play, Player* player);
s32 Player_TryCsAction(PlayState* play, Actor* actor, s32 csAction);
s32 Player_InCsMode(PlayState* play);
s32 func_8008E9C4(Player* player);
s32 Player_CheckHostileLockOn(Player* player);
s32 Player_IsChildWithHylianShield(Player* player);
s32 Player_ActionToModelGroup(Player* player, s32 actionParam);
void Player_SetModelsForHoldingShield(Player* player);
@@ -1117,9 +1117,9 @@ void func_8008EC70(Player* player);
void Player_SetEquipmentData(PlayState* play, Player* player);
void Player_UpdateBottleHeld(PlayState* play, Player* player, s32 item, s32 actionParam);
void func_80837C0C(PlayState* play, Player* this, s32 arg2, f32 arg3, f32 arg4, s16 arg5, s32 arg6);
void func_8008EDF0(Player* player);
void func_8008EE08(Player* player);
void func_8008EEAC(PlayState* play, Actor* actor);
void Player_ReleaseLockOn(Player* player);
void Player_ClearZTargeting(Player* player);
void Player_SetAutoLockOnActor(PlayState* play, Actor* actor);
s32 func_8008EF44(PlayState* play, s32 ammo);
s32 Player_IsBurningStickInRange(PlayState* play, Vec3f* pos, f32 radius, f32 arg3);
s32 Player_GetStrength(void);

View File

@@ -8,17 +8,23 @@
// #define __attribute__(x)
// #endif
// #ifndef AVOID_UB
// #define BAD_RETURN(type) type
// #else
// #define BAD_RETURN(type) void
// #endif
// SoH [Port] Always use the AVOID_UB version (we don't set AVOID_UB while building yet)
/*
#ifndef AVOID_UB
#define BAD_RETURN(type) type
#else
#define BAD_RETURN(type) void
#endif
*/
#define BAD_RETURN(type) void
// Upstream TODO: Document reasoning for change
// #define UNUSED __attribute__((unused))
// #define FALLTHROUGH __attribute__((fallthrough))
#define ARRAY_COUNT(arr) (s32)(sizeof(arr) / sizeof(arr[0]))
#define ARRAY_COUNTU(arr) (u32)(sizeof(arr) / sizeof(arr[0]))
#define ARRAY_COUNT_2D(arr) (s32)(sizeof(arr) / sizeof(arr[0][0]))
#define PHYSICAL_TO_VIRTUAL(addr) (void*)((uintptr_t)(addr) + 0x80000000)
#define VIRTUAL_TO_PHYSICAL(addr) (uintptr_t)((u8*)(addr) - 0x80000000)

View File

@@ -382,8 +382,8 @@ typedef struct {
/* 0x1B */ u8 unk_1B;
/* 0x1C */ CutsceneCameraPoint* cameraFocus;
/* 0x20 */ CutsceneCameraPoint* cameraPosition;
/* 0x24 */ CsCmdActorAction* linkAction;
/* 0x28 */ CsCmdActorAction* npcActions[10]; // "npcdemopnt"
/* 0x24 */ CsCmdActorCue* linkAction;
/* 0x28 */ CsCmdActorCue* npcActions[10]; // "npcdemopnt"
} CutsceneContext; // size = 0x50
typedef struct {

View File

@@ -92,7 +92,7 @@ typedef struct {
/* 0x0C */ Vec3i startPos;
/* 0x18 */ Vec3i endPos;
/* 0x24 */ Vec3i normal;
} CsCmdActorAction; // size = 0x30
} CsCmdActorCue; // size = 0x30
typedef enum {
CS_STATE_IDLE,

View File

@@ -7,9 +7,7 @@
struct Player;
extern GetItemEntry sGetItemTable[195];
typedef enum {
typedef enum PlayerSword {
/* 0 */ PLAYER_SWORD_NONE,
/* 1 */ PLAYER_SWORD_KOKIRI,
/* 2 */ PLAYER_SWORD_MASTER,
@@ -17,7 +15,7 @@ typedef enum {
/* 4 */ PLAYER_SWORD_MAX
} PlayerSword;
typedef enum {
typedef enum PlayerShield {
/* 0x00 */ PLAYER_SHIELD_NONE,
/* 0x01 */ PLAYER_SHIELD_DEKU,
/* 0x02 */ PLAYER_SHIELD_HYLIAN,
@@ -25,14 +23,14 @@ typedef enum {
/* 0x04 */ PLAYER_SHIELD_MAX
} PlayerShield;
typedef enum {
typedef enum PlayerTunic {
/* 0x00 */ PLAYER_TUNIC_KOKIRI,
/* 0x01 */ PLAYER_TUNIC_GORON,
/* 0x02 */ PLAYER_TUNIC_ZORA,
/* 0x03 */ PLAYER_TUNIC_MAX
} PlayerTunic;
typedef enum {
typedef enum PlayerBoots {
/* 0x00 */ PLAYER_BOOTS_KOKIRI,
/* 0x01 */ PLAYER_BOOTS_IRON,
/* 0x02 */ PLAYER_BOOTS_HOVER,
@@ -43,7 +41,7 @@ typedef enum {
/* 0x06 */ PLAYER_BOOTS_MAX
} PlayerBoots;
typedef enum {
typedef enum PlayerStrength {
/* 0x00 */ PLAYER_STR_NONE,
/* 0x01 */ PLAYER_STR_BRACELET,
/* 0x02 */ PLAYER_STR_SILVER_G,
@@ -51,7 +49,7 @@ typedef enum {
/* 0x04 */ PLAYER_STR_MAX
} PlayerStrength;
typedef enum {
typedef enum PlayerMask {
/* 0x00 */ PLAYER_MASK_NONE,
/* 0x01 */ PLAYER_MASK_KEATON,
/* 0x02 */ PLAYER_MASK_SKULL,
@@ -64,9 +62,15 @@ typedef enum {
/* 0x09 */ PLAYER_MASK_MAX
} PlayerMask;
typedef enum {
typedef enum PlayerIdleType {
/* -0x1 */ PLAYER_IDLE_CRIT_HEALTH = -1,
/* 0x0 */ PLAYER_IDLE_DEFAULT,
/* 0x1 */ PLAYER_IDLE_FIDGET
} PlayerIdleType;
typedef enum PlayerItemAction {
/* 0x00 */ PLAYER_IA_NONE,
/* 0x01 */ PLAYER_IA_LAST_USED,
/* 0x01 */ PLAYER_IA_SWORD_CS, // Hold sword without shield in hand. The sword is not usable.
/* 0x02 */ PLAYER_IA_FISHING_POLE,
/* 0x03 */ PLAYER_IA_SWORD_MASTER,
/* 0x04 */ PLAYER_IA_SWORD_KOKIRI,
@@ -132,10 +136,10 @@ typedef enum {
/* 0x40 */ PLAYER_IA_MASK_GERUDO,
/* 0x41 */ PLAYER_IA_MASK_TRUTH,
/* 0x42 */ PLAYER_IA_LENS_OF_TRUTH,
/* 0x4C */ PLAYER_IA_MAX
/* 0x43 */ PLAYER_IA_MAX
} PlayerItemAction;
typedef enum {
typedef enum PlayerLimb {
/* 0x00 */ PLAYER_LIMB_NONE,
/* 0x01 */ PLAYER_LIMB_ROOT,
/* 0x02 */ PLAYER_LIMB_WAIST,
@@ -161,7 +165,7 @@ typedef enum {
/* 0x16 */ PLAYER_LIMB_MAX
} PlayerLimb;
typedef enum {
typedef enum PlayerBodyPart {
/* 0x00 */ PLAYER_BODYPART_WAIST, // PLAYER_LIMB_WAIST
/* 0x01 */ PLAYER_BODYPART_R_THIGH, // PLAYER_LIMB_R_THIGH
/* 0x02 */ PLAYER_BODYPART_R_SHIN, // PLAYER_LIMB_R_SHIN
@@ -183,7 +187,7 @@ typedef enum {
/* 0x12 */ PLAYER_BODYPART_MAX
} PlayerBodyPart;
typedef enum {
typedef enum PlayerMeleeWeaponAnimation {
/* 0 */ PLAYER_MWA_FORWARD_SLASH_1H,
/* 1 */ PLAYER_MWA_FORWARD_SLASH_2H,
/* 2 */ PLAYER_MWA_FORWARD_COMBO_1H,
@@ -215,7 +219,7 @@ typedef enum {
/* 28 */ PLAYER_MWA_MAX
} PlayerMeleeWeaponAnimation;
typedef enum {
typedef enum PlayerDoorType {
/* -1 */ PLAYER_DOORTYPE_AJAR = -1,
/* 0 */ PLAYER_DOORTYPE_NONE,
/* 1 */ PLAYER_DOORTYPE_HANDLE,
@@ -223,10 +227,10 @@ typedef enum {
/* 3 */ PLAYER_DOORTYPE_FAKE
} PlayerDoorType;
typedef enum {
/* 0x00 */ PLAYER_MODELGROUP_0, // unused (except with the `Player_OverrideLimbDrawPause` bug)
/* 0x01 */ PLAYER_MODELGROUP_CHILD_HYLIAN_SHIELD, // kokiri/master sword, shield not in hand
/* 0x02 */ PLAYER_MODELGROUP_SWORD, // kokiri/master sword and possibly shield
typedef enum PlayerModelGroup {
/* 0x00 */ PLAYER_MODELGROUP_0, // unused (except for a bug in `Player_OverrideLimbDrawPause`)
/* 0x01 */ PLAYER_MODELGROUP_CHILD_HYLIAN_SHIELD, //hold sword only. used for holding sword only as child link with hylian shield equipped
/* 0x02 */ PLAYER_MODELGROUP_SWORD_AND_SHIELD, // hold sword and shield or just sword if no shield is equipped
/* 0x03 */ PLAYER_MODELGROUP_DEFAULT, // non-specific models, for items that don't have particular link models
/* 0x04 */ PLAYER_MODELGROUP_4, // unused, same as PLAYER_MODELGROUP_DEFAULT
/* 0x05 */ PLAYER_MODELGROUP_BGS, // biggoron sword
@@ -239,11 +243,11 @@ typedef enum {
/* 0x0C */ PLAYER_MODELGROUP_OCARINA, // ocarina
/* 0x0D */ PLAYER_MODELGROUP_OOT, // ocarina of time
/* 0x0E */ PLAYER_MODELGROUP_BOTTLE, // bottles (drawn separately)
/* 0x0F */ PLAYER_MODELGROUP_15, // "last used"
/* 0x0F */ PLAYER_MODELGROUP_SWORD, // hold sword and no shield, even if one is equipped
/* 0x10 */ PLAYER_MODELGROUP_MAX
} PlayerModelGroup;
typedef enum {
typedef enum PlayerModelGroupEntry {
/* 0x00 */ PLAYER_MODELGROUPENTRY_ANIM,
/* 0x01 */ PLAYER_MODELGROUPENTRY_LEFT_HAND,
/* 0x02 */ PLAYER_MODELGROUPENTRY_RIGHT_HAND,
@@ -252,7 +256,7 @@ typedef enum {
/* 0x05 */ PLAYER_MODELGROUPENTRY_MAX
} PlayerModelGroupEntry;
typedef enum {
typedef enum PlayerModelType {
// left hand
/* 0x00 */ PLAYER_MODELTYPE_LH_OPEN, // empty open hand
/* 0x01 */ PLAYER_MODELTYPE_LH_CLOSED, // empty closed hand
@@ -282,7 +286,7 @@ typedef enum {
/* 0xFF */ PLAYER_MODELTYPE_RH_FF = 0xFF // disable shield collider, cutscene-specific
} PlayerModelType;
typedef enum {
typedef enum PlayerAnimType {
/* 0x00 */ PLAYER_ANIMTYPE_0,
/* 0x01 */ PLAYER_ANIMTYPE_1,
/* 0x02 */ PLAYER_ANIMTYPE_2,
@@ -292,7 +296,10 @@ typedef enum {
/* 0x06 */ PLAYER_ANIMTYPE_MAX
} PlayerAnimType;
typedef enum {
/**
* Temporary names, derived from original animation names in `D_80853914`
*/
typedef enum PlayerAnimGroup {
/* 0x00 */ PLAYER_ANIMGROUP_wait,
/* 0x01 */ PLAYER_ANIMGROUP_walk,
/* 0x02 */ PLAYER_ANIMGROUP_run,
@@ -344,7 +351,227 @@ typedef enum {
#define LIMB_BUF_COUNT(limbCount) ((ALIGN16((limbCount) * sizeof(Vec3s)) + sizeof(Vec3s) - 1) / sizeof(Vec3s))
#define PLAYER_LIMB_BUF_COUNT LIMB_BUF_COUNT(PLAYER_LIMB_MAX)
typedef struct {
typedef enum PlayerCsAction {
/* 0x00 */ PLAYER_CSACTION_NONE,
/* 0x01 */ PLAYER_CSACTION_1,
/* 0x02 */ PLAYER_CSACTION_2,
/* 0x03 */ PLAYER_CSACTION_3,
/* 0x04 */ PLAYER_CSACTION_4,
/* 0x05 */ PLAYER_CSACTION_5,
/* 0x06 */ PLAYER_CSACTION_6,
/* 0x07 */ PLAYER_CSACTION_7,
/* 0x08 */ PLAYER_CSACTION_8,
/* 0x09 */ PLAYER_CSACTION_9,
/* 0x0A */ PLAYER_CSACTION_10,
/* 0x0B */ PLAYER_CSACTION_11,
/* 0x0C */ PLAYER_CSACTION_12,
/* 0x0D */ PLAYER_CSACTION_13,
/* 0x0E */ PLAYER_CSACTION_14,
/* 0x0F */ PLAYER_CSACTION_15,
/* 0x10 */ PLAYER_CSACTION_16,
/* 0x11 */ PLAYER_CSACTION_17,
/* 0x12 */ PLAYER_CSACTION_18,
/* 0x13 */ PLAYER_CSACTION_19,
/* 0x14 */ PLAYER_CSACTION_20,
/* 0x15 */ PLAYER_CSACTION_21,
/* 0x16 */ PLAYER_CSACTION_22,
/* 0x17 */ PLAYER_CSACTION_23,
/* 0x18 */ PLAYER_CSACTION_24,
/* 0x19 */ PLAYER_CSACTION_25,
/* 0x1A */ PLAYER_CSACTION_26,
/* 0x1B */ PLAYER_CSACTION_27,
/* 0x1C */ PLAYER_CSACTION_28,
/* 0x1D */ PLAYER_CSACTION_29,
/* 0x1E */ PLAYER_CSACTION_30,
/* 0x1F */ PLAYER_CSACTION_31,
/* 0x20 */ PLAYER_CSACTION_32,
/* 0x21 */ PLAYER_CSACTION_33,
/* 0x22 */ PLAYER_CSACTION_34,
/* 0x23 */ PLAYER_CSACTION_35,
/* 0x24 */ PLAYER_CSACTION_36,
/* 0x25 */ PLAYER_CSACTION_37,
/* 0x26 */ PLAYER_CSACTION_38,
/* 0x27 */ PLAYER_CSACTION_39,
/* 0x28 */ PLAYER_CSACTION_40,
/* 0x29 */ PLAYER_CSACTION_41,
/* 0x2A */ PLAYER_CSACTION_42,
/* 0x2B */ PLAYER_CSACTION_43,
/* 0x2C */ PLAYER_CSACTION_44,
/* 0x2D */ PLAYER_CSACTION_45,
/* 0x2E */ PLAYER_CSACTION_46,
/* 0x2F */ PLAYER_CSACTION_47,
/* 0x30 */ PLAYER_CSACTION_48,
/* 0x31 */ PLAYER_CSACTION_49,
/* 0x32 */ PLAYER_CSACTION_50,
/* 0x33 */ PLAYER_CSACTION_51,
/* 0x34 */ PLAYER_CSACTION_52,
/* 0x35 */ PLAYER_CSACTION_53,
/* 0x36 */ PLAYER_CSACTION_54,
/* 0x37 */ PLAYER_CSACTION_55,
/* 0x38 */ PLAYER_CSACTION_56,
/* 0x39 */ PLAYER_CSACTION_57,
/* 0x3A */ PLAYER_CSACTION_58,
/* 0x3B */ PLAYER_CSACTION_59,
/* 0x3C */ PLAYER_CSACTION_60,
/* 0x3D */ PLAYER_CSACTION_61,
/* 0x3E */ PLAYER_CSACTION_62,
/* 0x3F */ PLAYER_CSACTION_63,
/* 0x40 */ PLAYER_CSACTION_64,
/* 0x41 */ PLAYER_CSACTION_65,
/* 0x42 */ PLAYER_CSACTION_66,
/* 0x43 */ PLAYER_CSACTION_67,
/* 0x44 */ PLAYER_CSACTION_68,
/* 0x45 */ PLAYER_CSACTION_69,
/* 0x46 */ PLAYER_CSACTION_70,
/* 0x47 */ PLAYER_CSACTION_71,
/* 0x48 */ PLAYER_CSACTION_72,
/* 0x49 */ PLAYER_CSACTION_73,
/* 0x4A */ PLAYER_CSACTION_74,
/* 0x4B */ PLAYER_CSACTION_75,
/* 0x4C */ PLAYER_CSACTION_76,
/* 0x4D */ PLAYER_CSACTION_77,
/* 0x4E */ PLAYER_CSACTION_78,
/* 0x4F */ PLAYER_CSACTION_79,
/* 0x50 */ PLAYER_CSACTION_80,
/* 0x51 */ PLAYER_CSACTION_81,
/* 0x52 */ PLAYER_CSACTION_82,
/* 0x53 */ PLAYER_CSACTION_83,
/* 0x54 */ PLAYER_CSACTION_84,
/* 0x55 */ PLAYER_CSACTION_85,
/* 0x56 */ PLAYER_CSACTION_86,
/* 0x57 */ PLAYER_CSACTION_87,
/* 0x58 */ PLAYER_CSACTION_88,
/* 0x59 */ PLAYER_CSACTION_89,
/* 0x5A */ PLAYER_CSACTION_90,
/* 0x5B */ PLAYER_CSACTION_91,
/* 0x5C */ PLAYER_CSACTION_92,
/* 0x5D */ PLAYER_CSACTION_93,
/* 0x5E */ PLAYER_CSACTION_94,
/* 0x5F */ PLAYER_CSACTION_95,
/* 0x60 */ PLAYER_CSACTION_96,
/* 0x61 */ PLAYER_CSACTION_97,
/* 0x62 */ PLAYER_CSACTION_98,
/* 0x63 */ PLAYER_CSACTION_99,
/* 0x64 */ PLAYER_CSACTION_100,
/* 0x65 */ PLAYER_CSACTION_101,
/* 0x66 */ PLAYER_CSACTION_102,
/* 0x67 */ PLAYER_CSACTION_MAX
} PlayerCsAction;
typedef enum PlayerCueId {
/* 0x00 */ PLAYER_CUEID_NONE,
/* 0x01 */ PLAYER_CUEID_1,
/* 0x02 */ PLAYER_CUEID_2,
/* 0x03 */ PLAYER_CUEID_3,
/* 0x04 */ PLAYER_CUEID_4,
/* 0x05 */ PLAYER_CUEID_5,
/* 0x06 */ PLAYER_CUEID_6,
/* 0x07 */ PLAYER_CUEID_7,
/* 0x08 */ PLAYER_CUEID_8,
/* 0x09 */ PLAYER_CUEID_9,
/* 0x0A */ PLAYER_CUEID_10,
/* 0x0B */ PLAYER_CUEID_11,
/* 0x0C */ PLAYER_CUEID_12,
/* 0x0D */ PLAYER_CUEID_13,
/* 0x0E */ PLAYER_CUEID_14,
/* 0x0F */ PLAYER_CUEID_15,
/* 0x10 */ PLAYER_CUEID_16,
/* 0x11 */ PLAYER_CUEID_17,
/* 0x12 */ PLAYER_CUEID_18,
/* 0x13 */ PLAYER_CUEID_19,
/* 0x14 */ PLAYER_CUEID_20,
/* 0x15 */ PLAYER_CUEID_21,
/* 0x16 */ PLAYER_CUEID_22,
/* 0x17 */ PLAYER_CUEID_23,
/* 0x18 */ PLAYER_CUEID_24,
/* 0x19 */ PLAYER_CUEID_25,
/* 0x1A */ PLAYER_CUEID_26,
/* 0x1B */ PLAYER_CUEID_27,
/* 0x1C */ PLAYER_CUEID_28,
/* 0x1D */ PLAYER_CUEID_29,
/* 0x1E */ PLAYER_CUEID_30,
/* 0x1F */ PLAYER_CUEID_31,
/* 0x20 */ PLAYER_CUEID_32,
/* 0x21 */ PLAYER_CUEID_33,
/* 0x22 */ PLAYER_CUEID_34,
/* 0x23 */ PLAYER_CUEID_35,
/* 0x24 */ PLAYER_CUEID_36,
/* 0x25 */ PLAYER_CUEID_37,
/* 0x26 */ PLAYER_CUEID_38,
/* 0x27 */ PLAYER_CUEID_39,
/* 0x28 */ PLAYER_CUEID_40,
/* 0x29 */ PLAYER_CUEID_41,
/* 0x2A */ PLAYER_CUEID_42,
/* 0x2B */ PLAYER_CUEID_43,
/* 0x2C */ PLAYER_CUEID_44,
/* 0x2D */ PLAYER_CUEID_45,
/* 0x2E */ PLAYER_CUEID_46,
/* 0x2F */ PLAYER_CUEID_47,
/* 0x30 */ PLAYER_CUEID_48,
/* 0x31 */ PLAYER_CUEID_49,
/* 0x32 */ PLAYER_CUEID_50,
/* 0x33 */ PLAYER_CUEID_51,
/* 0x34 */ PLAYER_CUEID_52,
/* 0x35 */ PLAYER_CUEID_53,
/* 0x36 */ PLAYER_CUEID_54,
/* 0x37 */ PLAYER_CUEID_55,
/* 0x38 */ PLAYER_CUEID_56,
/* 0x39 */ PLAYER_CUEID_57,
/* 0x3A */ PLAYER_CUEID_58,
/* 0x3B */ PLAYER_CUEID_59,
/* 0x3C */ PLAYER_CUEID_60,
/* 0x3D */ PLAYER_CUEID_61,
/* 0x3E */ PLAYER_CUEID_62,
/* 0x3F */ PLAYER_CUEID_63,
/* 0x40 */ PLAYER_CUEID_64,
/* 0x41 */ PLAYER_CUEID_65,
/* 0x42 */ PLAYER_CUEID_66,
/* 0x43 */ PLAYER_CUEID_67,
/* 0x44 */ PLAYER_CUEID_68,
/* 0x45 */ PLAYER_CUEID_69,
/* 0x46 */ PLAYER_CUEID_70,
/* 0x47 */ PLAYER_CUEID_71,
/* 0x48 */ PLAYER_CUEID_72,
/* 0x49 */ PLAYER_CUEID_73,
/* 0x4A */ PLAYER_CUEID_74,
/* 0x4B */ PLAYER_CUEID_75,
/* 0x4C */ PLAYER_CUEID_76,
/* 0x4D */ PLAYER_CUEID_77,
/* 0x4E */ PLAYER_CUEID_MAX
} PlayerCueId;
typedef enum PlayerLedgeClimbType {
/* 0 */ PLAYER_LEDGE_CLIMB_NONE,
/* 1 */ PLAYER_LEDGE_CLIMB_1,
/* 2 */ PLAYER_LEDGE_CLIMB_2,
/* 3 */ PLAYER_LEDGE_CLIMB_3,
/* 4 */ PLAYER_LEDGE_CLIMB_4
} PlayerLedgeClimbType;
typedef enum PlayerStickDirection {
/* -1 */ PLAYER_STICK_DIR_NONE = -1,
/* 0 */ PLAYER_STICK_DIR_FORWARD,
/* 1 */ PLAYER_STICK_DIR_LEFT,
/* 2 */ PLAYER_STICK_DIR_BACKWARD,
/* 3 */ PLAYER_STICK_DIR_RIGHT
} PlayerStickDirection;
typedef enum {
/* 0 */ PLAYER_KNOCKBACK_NONE, // No knockback
/* 1 */ PLAYER_KNOCKBACK_SMALL, // A small hop, remains standing up
/* 2 */ PLAYER_KNOCKBACK_LARGE, // Sent flying in the air and lands laying down on the floor
/* 3 */ PLAYER_KNOCKBACK_LARGE_SHOCK // Same as`PLAYER_KNOCKBACK_LARGE` with a shock effect
} PlayerKnockbackType;
typedef enum {
/* 0 */ PLAYER_HIT_RESPONSE_NONE,
/* 1 */ PLAYER_HIT_RESPONSE_KNOCKBACK_LARGE,
/* 2 */ PLAYER_HIT_RESPONSE_KNOCKBACK_SMALL,
/* 3 */ PLAYER_HIT_RESPONSE_ICE_TRAP,
/* 4 */ PLAYER_HIT_RESPONSE_ELECTRIC_SHOCK
} PlayerDamageResponseType;
typedef struct PlayerAgeProperties {
/* 0x00 */ f32 ceilingCheckHeight;
/* 0x04 */ f32 unk_04;
/* 0x08 */ f32 unk_08;
@@ -380,7 +607,7 @@ typedef struct {
/* 0xCC */ LinkAnimationHeader* unk_CC[2];
} PlayerAgeProperties; // size = 0xD4
typedef struct {
typedef struct WeaponInfo {
/* 0x00 */ s32 active;
/* 0x04 */ Vec3f tip;
/* 0x10 */ Vec3f base;
@@ -389,7 +616,7 @@ typedef struct {
// #region SOH [General]
// Supporting pendingFlag
// Upstream TODO: Rename these to be more obviously SoH specific
typedef enum {
typedef enum FlagType {
FLAG_NONE,
FLAG_SCENE_SWITCH,
FLAG_SCENE_TREASURE,
@@ -403,47 +630,47 @@ typedef enum {
FLAG_GS_TOKEN,
} FlagType;
typedef struct {
typedef struct PendingFlag {
/* 0x00 */ s32 flagID; // which flag to set when Player_SetPendingFlag is called
/* 0x04 */ FlagType flagType; // type of flag to set when Player_SetPendingFlag is called
} PendingFlag; // size = 0x06
// #endregion
#define PLAYER_STATE1_LOADING (1 << 0) //Transitioning to a new scene
#define PLAYER_STATE1_SWINGING_BOTTLE (1 << 1)
#define PLAYER_STATE1_SWINGING_BOTTLE (1 << 1) // Bottle is swung; Bottle is active and can catch things
#define PLAYER_STATE1_HOOKSHOT_FALLING (1 << 2)
#define PLAYER_STATE1_ITEM_IN_HAND (1 << 3)
#define PLAYER_STATE1_ENEMY_TARGET (1 << 4)
#define PLAYER_STATE1_HOSTILE_LOCK_ON (1 << 4) // Currently locked onto a hostile actor. Triggers a "battle" variant of many actions.
#define PLAYER_STATE1_INPUT_DISABLED (1 << 5)
#define PLAYER_STATE1_TEXT_ON_SCREEN (1 << 6)
#define PLAYER_STATE1_DEAD (1 << 7)
#define PLAYER_STATE1_START_PUTAWAY (1 << 8)
#define PLAYER_STATE1_TALKING (1 << 6) // Currently talking to an actor. This includes item exchanges.
#define PLAYER_STATE1_DEAD (1 << 7) // Player has died. Note that this gets set when the death cutscene has started, after landing from the air.
#define PLAYER_STATE1_START_CHANGING_HELD_ITEM (1 << 8) // Item change process has begun
#define PLAYER_STATE1_READY_TO_FIRE (1 << 9)
#define PLAYER_STATE1_GETTING_ITEM (1 << 10)
#define PLAYER_STATE1_ITEM_OVER_HEAD (1 << 11)
#define PLAYER_STATE1_CHARGING_SPIN_ATTACK (1 << 12)
#define PLAYER_STATE1_CARRYING_ACTOR (1 << 11) // Currently carrying an actor
#define PLAYER_STATE1_CHARGING_SPIN_ATTACK (1 << 12) // Currently charing a spin attack (by holding down the B button)
#define PLAYER_STATE1_HANGING_OFF_LEDGE (1 << 13)
#define PLAYER_STATE1_CLIMBING_LEDGE (1 << 14)
#define PLAYER_STATE1_TARGETING (1 << 15)
#define PLAYER_STATE1_TARGET_LOCKED (1 << 16)
#define PLAYER_STATE1_TARGET_NOTHING (1 << 17)
#define PLAYER_STATE1_CLIMBING_LEDGE (1 << 14)
#define PLAYER_STATE1_Z_TARGETING (1 << 15) // Either lock-on or parallel is active. This flag is never checked for and is practically unused.
#define PLAYER_STATE1_FRIENDLY_ACTOR_FOCUS (1 << 16) // Currently focusing on a friendly actor. Includes friendly lock-on, talking, and more. Usually does not include hostile actor lock-on, see `PLAYER_STATE1_HOSTILE_LOCK_ON`.
#define PLAYER_STATE1_PARALLEL (1 << 17) // "Parallel" mode, Z-Target without an actor lock-on
#define PLAYER_STATE1_JUMPING (1 << 18)
#define PLAYER_STATE1_FREEFALL (1 << 19)
#define PLAYER_STATE1_FIRST_PERSON (1 << 20)
#define PLAYER_STATE1_CLIMBING_LADDER (1 << 21)
#define PLAYER_STATE1_SHIELDING (1 << 22)
#define PLAYER_STATE1_ON_HORSE (1 << 23)
#define PLAYER_STATE1_BOOMERANG_IN_HAND (1 << 24)
#define PLAYER_STATE1_THREW_BOOMERANG (1 << 25)
#define PLAYER_STATE1_USING_BOOMERANG (1 << 24) // Currently using the boomerang. This includes all phases (aiming, throwing, and catching).
#define PLAYER_STATE1_BOOMERANG_THROWN (1 << 25) // Boomerang has been thrown and is flying in the air
#define PLAYER_STATE1_DAMAGED (1 << 26)
#define PLAYER_STATE1_IN_WATER (1 << 27)
#define PLAYER_STATE1_IN_ITEM_CS (1 << 28)
#define PLAYER_STATE1_IN_CUTSCENE (1 << 29)
#define PLAYER_STATE1_30 (1 << 30) //Unknown, potentially target related?
#define PLAYER_STATE1_LOCK_ON_FORCED_TO_RELEASE (1 << 30) // Lock-on was released automatically, for example by leaving the lock-on leash range
#define PLAYER_STATE1_FLOOR_DISABLED (1 << 31) //Used for grottos
#define PLAYER_STATE2_DO_ACTION_GRAB (1 << 0)
#define PLAYER_STATE2_SPEAK_OR_CHECK (1 << 1)
#define PLAYER_STATE2_CAN_ACCEPT_TALK_OFFER (1 << 1) // Can accept a talk offer. "Speak" or "Check" is shown on the A button.
#define PLAYER_STATE2_DO_ACTION_CLIMB (1 << 2)
#define PLAYER_STATE2_FOOTSTEP (1 << 3)
#define PLAYER_STATE2_MOVING_DYNAPOLY (1 << 4)
@@ -451,18 +678,18 @@ typedef struct {
#define PLAYER_STATE2_DISABLE_ROTATION_ALWAYS (1 << 6)
#define PLAYER_STATE2_GRABBED_BY_ENEMY (1 << 7)
#define PLAYER_STATE2_GRABBING_DYNAPOLY (1 << 8)
#define PLAYER_STATE2_SPAWN_DUST (1 << 9)
#define PLAYER_STATE2_FORCE_SAND_FLOOR_SOUND (1 << 9) // Forces sand footstep sounds regardless of current floor type
#define PLAYER_STATE2_UNDERWATER (1 << 10)
#define PLAYER_STATE2_DIVING (1 << 11)
#define PLAYER_STATE2_STATIONARY_LADDER (1 << 12)
#define PLAYER_STATE2_SWITCH_TARGETING (1 << 13)
#define PLAYER_STATE2_LOCK_ON_WITH_SWITCH (1 << 13) // Actor lock-on is active, specifically with Switch Targeting. Hold Targeting checks the state of the Z button instead of this flag.
#define PLAYER_STATE2_FROZEN (1 << 14)
#define PLAYER_STATE2_PAUSE_MOST_UPDATING (1 << 15)
#define PLAYER_STATE2_DO_ACTION_ENTER (1 << 16) // Turns on the "Enter On A" DoAction
#define PLAYER_STATE2_DO_ACTION_ENTER (1 << 16) // Sets the "Enter On A" DoAction
#define PLAYER_STATE2_SPIN_ATTACKING (1 << 17) //w/o magic
#define PLAYER_STATE2_CRAWLING (1 << 18) // Crawling through a crawlspace
#define PLAYER_STATE2_HOPPING (1 << 19) //Sidehop/backflip
#define PLAYER_STATE2_NAVI_OUT (1 << 20)
#define PLAYER_STATE2_NAVI_ACTIVE (1 << 20) // Navi is visible and active. Could be hovering idle near Link or hovering over other actors.
#define PLAYER_STATE2_NAVI_ALERT (1 << 21)
#define PLAYER_STATE2_DO_ACTION_DOWN (1 << 22)
#define PLAYER_STATE2_NEAR_OCARINA_ACTOR (1 << 23)
@@ -470,7 +697,7 @@ typedef struct {
#define PLAYER_STATE2_PLAY_FOR_ACTOR (1 << 25)
#define PLAYER_STATE2_REFLECTION (1 << 26) //Handles Dark Link's Reflection
#define PLAYER_STATE2_OCARINA_PLAYING (1 << 27)
#define PLAYER_STATE2_IDLING (1 << 28)
#define PLAYER_STATE2_IDLE_FIDGET (1 << 28) // Playing a fidget idle animation (under typical circumstances, see `Player_ChooseNextIdleAnim` for more info)
#define PLAYER_STATE2_DISABLE_DRAW (1 << 29)
#define PLAYER_STATE2_SWORD_LUNGE (1 << 30)
#define PLAYER_STATE2_FORCED_VOID_OUT (1 << 31)
@@ -480,13 +707,23 @@ typedef struct {
#define PLAYER_STATE3_PAUSE_ACTION_FUNC (1 << 2)
#define PLAYER_STATE3_FINISHED_ATTACKING (1 << 3)
#define PLAYER_STATE3_CHECK_FLOOR_WATER_COLLISION (1 << 4)
#define PLAYER_STATE3_FORCE_PULL_OCARINA (1 << 5)
#define PLAYER_STATE3_FORCE_PULL_OCARINA (1 << 5)
#define PLAYER_STATE3_RESTORE_NAYRUS_LOVE (1 << 6) // Set by ocarina effects actors when destroyed to signal Nayru's Love may be restored (see `ACTOROVL_ALLOC_ABSOLUTE`)
#define PLAYER_STATE3_HOOKSHOT_TRAVELLING (1 << 7) //Travelling to target
#define PLAYER_STATE3_FLYING_WITH_HOOKSHOT (1 << 7) // Flying in the air with the hookshot as it pulls Player toward its destination
typedef void (*PlayerActionFunc)(struct Player*, struct PlayState*);
typedef s32 (*UpperActionFunc)(struct Player*, struct PlayState*);
typedef void (*PlayerFuncA74)(struct PlayState*, struct Player*);
typedef void (*AfterPutAwayFunc)(struct PlayState*, struct Player*);
#define UNK6AE_ROT_FOCUS_X (1 << 0)
#define UNK6AE_ROT_FOCUS_Y (1 << 1)
#define UNK6AE_ROT_FOCUS_Z (1 << 2)
#define UNK6AE_ROT_HEAD_X (1 << 3)
#define UNK6AE_ROT_HEAD_Y (1 << 4)
#define UNK6AE_ROT_HEAD_Z (1 << 5)
#define UNK6AE_ROT_UPPER_X (1 << 6)
#define UNK6AE_ROT_UPPER_Y (1 << 7)
#define UNK6AE_ROT_UPPER_Z (1 << 8)
typedef struct Player {
/* 0x0000 */ Actor actor;
@@ -547,71 +784,76 @@ typedef struct Player {
/* 0x0450 */ Vec3f unk_450;
/* 0x045C */ Vec3f unk_45C;
/* 0x0468 */ char unk_468[0x002];
/* 0x046A */ s16 doorBgCamIndex;
/* 0x046A */ union {
s16 haltActorsDuringCsAction; // If true, halt actors belonging to certain categories during a `csAction`
s16 slidingDoorBgCamIndex; // `BgCamIndex` used during a sliding door cutscene
} cv; // "Cutscene Variable": context dependent variable that has different meanings depending on what function is called
/* 0x046C */ s16 subCamId;
/* 0x046E */ char unk_46E[0x02A];
/* 0x0498 */ ColliderCylinder cylinder;
/* 0x04E4 */ ColliderQuad meleeWeaponQuads[2];
/* 0x05E4 */ ColliderQuad shieldQuad;
/* 0x0664 */ Actor* unk_664;
/* 0x0664 */ Actor* focusActor; // Actor that Player and the camera are looking at; Used for lock-on, talking, and more
/* 0x0668 */ char unk_668[0x004];
/* 0x066C */ s32 unk_66C;
/* 0x066C */ s32 zTargetActiveTimer; // Non-zero values indicate Z-Targeting should update; Values under 5 indicate lock-on is releasing
/* 0x0670 */ s32 meleeWeaponEffectIndex;
/* 0x0674 */ PlayerActionFunc actionFunc;
/* 0x0678 */ PlayerAgeProperties* ageProperties;
/* 0x067C */ u32 stateFlags1;
/* 0x0680 */ u32 stateFlags2;
/* 0x0684 */ Actor* unk_684;
/* 0x0684 */ Actor* autoLockOnActor; // Actor that is locked onto automatically without player input; see `Player_SetAutoLockOnActor`
/* 0x0688 */ Actor* boomerangActor;
/* 0x068C */ Actor* naviActor;
/* 0x0690 */ s16 naviTextId;
/* 0x0692 */ u8 stateFlags3;
/* 0x0693 */ s8 exchangeItemId;
/* 0x0694 */ Actor* targetActor;
/* 0x0698 */ f32 targetActorDistance;
/* 0x0694 */ Actor* talkActor; // Actor offering to talk, or currently talking to, depending on context
/* 0x0698 */ f32 talkActorDistance; // xz distance away from `talkActor`
/* 0x069C */ char unk_69C[0x004];
/* 0x06A0 */ f32 unk_6A0;
/* 0x06A4 */ f32 closestSecretDistSq;
/* 0x06A8 */ Actor* unk_6A8;
/* 0x06AC */ s8 unk_6AC;
/* 0x06AC */ s8 idleType;
/* 0x06AD */ u8 unk_6AD;
/* 0x06AE */ u16 unk_6AE;
/* 0x06B0 */ s16 unk_6B0;
/* 0x06AE */ u16 unk_6AE_rotFlags; // See `UNK6AE_ROT_` macros. If its flag isn't set, a rot steps to 0.
/* 0x06B0 */ s16 upperLimbYawSecondary;
/* 0x06B2 */ char unk_6B4[0x004];
/* 0x06B6 */ s16 unk_6B6;
/* 0x06B8 */ s16 unk_6B8;
/* 0x06BA */ s16 unk_6BA;
/* 0x06BC */ s16 unk_6BC;
/* 0x06BE */ s16 unk_6BE;
/* 0x06C0 */ s16 unk_6C0;
/* 0x06B6 */ Vec3s headLimbRot;
/* 0x06BC */ Vec3s upperLimbRot;
/* 0x06C2 */ s16 unk_6C2;
/* 0x06C4 */ f32 unk_6C4;
/* 0x06C8 */ SkelAnime upperSkelAnime;
/* 0x070C */ Vec3s upperJointTable[PLAYER_LIMB_BUF_COUNT];
/* 0x079C */ Vec3s upperMorphTable[PLAYER_LIMB_BUF_COUNT];
/* 0x082C */ UpperActionFunc upperActionFunc;
/* 0x0830 */ f32 upperAnimBlendWeight;
/* 0x0830 */ f32 upperAnimInterpWeight;
/* 0x0834 */ s16 unk_834;
/* 0x0836 */ s8 unk_836;
/* 0x0837 */ u8 unk_837;
/* 0x0838 */ f32 linearVelocity;
/* 0x0837 */ u8 putAwayCooldownTimer;
/* 0x0838 */ f32 linearVelocity; // Controls horizontal speed, used for `actor.speed`. Current or target value depending on context.
/* 0x083C */ s16 yaw; // General yaw value, used both for world and shape rotation. Current or target value depending on context.
/* 0x083E */ s16 zTargetYaw; // yaw relating to Z targeting/"parallel" mode
/* 0x083E */ s16 parallelYaw; // yaw in "parallel" mode, Z-Target without an actor lock-on
/* 0x0840 */ u16 underwaterTimer;
/* 0x0842 */ s8 meleeWeaponAnimation;
/* 0x0843 */ s8 meleeWeaponState;
/* 0x0844 */ s8 unk_844;
/* 0x0845 */ u8 unk_845;
/* 0x0846 */ u8 unk_846;
/* 0x0847 */ s8 unk_847[4];
/* 0x084B */ s8 unk_84B[4];
/* 0x0846 */ u8 controlStickDataIndex; // cycles between 0 - 3. Used to index `controlStickSpinAngles` and `controlStickDirections`
/* 0x0847 */ s8 controlStickSpinAngles[4]; // Stores a modified version of the control stick angle for the last 4 frames. Used for checking spins.
/* 0x084B */ s8 controlStickDirections[4]; // Stores the control stick direction (relative to shape yaw) for the last 4 frames. See `PlayerStickDirection`.
/* 0x084F */ union {
s8 actionVar1;
s8 facingUpSlope; // Player_Action_SlideOnSlope: facing uphill when sliding on a slope
s8 bottleCatchType; // Player_Action_SwingBottle: entry type for `sBottleCatchInfo`, corresponds to actor caught in a bottle
} av1; // "Action Variable 1": context dependent variable that has different meanings depending on what action is currently running
/* 0x0850 */ union {
s16 actionVar2;
s16 fallDamageStunTimer; // Player_Action_Idle: Prevents any movement and shakes model up and down quickly to indicate fall damage stun
s16 bonked; // Player_Action_Roll: set to true after bonking into a wall or an actor
s16 startedTextbox; // Player_Action_SwingBottle: set to true when the textbox is started
s16 inWater; // Player_Action_SwingBottle: true if a bottle is swung in water. Used to determine which bottle swing animation to use.
} av2; // "Action Variable 2": context dependent variable that has different meanings depending on what action is currently running
/* 0x0854 */ f32 unk_854;
@@ -626,14 +868,14 @@ typedef struct Player {
/* 0x0874 */ f32 unk_874;
/* 0x0878 */ f32 unk_878;
/* 0x087C */ s16 unk_87C;
/* 0x087E */ s16 unk_87E;
/* 0x087E */ s16 turnRate; // Amount angle is changed every frame when turning in place
/* 0x0880 */ f32 unk_880;
/* 0x0884 */ f32 yDistToLedge; // y distance to ground above an interact wall. LEDGE_DIST_MAX if no ground is found
/* 0x0888 */ f32 distToInteractWall; // xyz distance to the interact wall
/* 0x088C */ u8 ledgeClimbType;
/* 0x088D */ u8 ledgeClimbDelayTimer;
/* 0x088E */ u8 unk_88E;
/* 0x088F */ u8 unk_88F;
/* 0x088E */ u8 textboxBtnCooldownTimer; // Prevents usage of A/B/C-up when counting down
/* 0x088F */ u8 damageFlickerAnimCounter; // Used to flicker Link after taking damage
/* 0x0890 */ u8 unk_890;
/* 0x0891 */ u8 bodyShockTimer;
/* 0x0892 */ u8 unk_892;
@@ -644,11 +886,11 @@ typedef struct Player {
/* 0x089A */ s16 floorPitchAlt; // the calculation for this value is bugged and doesn't represent anything meaningful
/* 0x089C */ s16 unk_89C;
/* 0x089E */ u16 floorSfxOffset;
/* 0x08A0 */ u8 unk_8A0;
/* 0x08A1 */ u8 unk_8A1;
/* 0x08A2 */ s16 unk_8A2;
/* 0x08A4 */ f32 unk_8A4;
/* 0x08A8 */ f32 unk_8A8;
/* 0x08A0 */ u8 knockbackDamage;
/* 0x08A1 */ u8 knockbackType;
/* 0x08A2 */ s16 knockbackRot;
/* 0x08A4 */ f32 knockbackSpeed;
/* 0x08A8 */ f32 knockbackYVelocity;
/* 0x08AC */ f32 pushedSpeed; // Pushing player, examples include water currents, floor conveyors, climbing sloped surfaces
/* 0x08B0 */ s16 pushedYaw; // Yaw direction of player being pushed
/* 0x08B4 */ WeaponInfo meleeWeaponInfo[3];
@@ -658,8 +900,8 @@ typedef struct Player {
/* 0x0A60 */ u8 bodyIsBurning;
/* 0x0A61 */ u8 bodyFlameTimers[PLAYER_BODYPART_MAX]; // one flame per body part
/* 0x0A73 */ u8 unk_A73;
/* 0x0A74 */ PlayerFuncA74 func_A74;
/* 0x0A78 */ s8 invincibilityTimer; // prevents damage when nonzero (positive = visible, counts towards zero each frame)
/* 0x0A74 */ AfterPutAwayFunc afterPutAwayFunc; // See `Player_SetupWaitForPutAway` and `Player_Action_WaitForPutAway`
/* 0x0A78 */ s8 invincibilityTimer; // prevents damage when nonzero. Positive values are intangibility, negative are invulnerability
/* 0x0A79 */ u8 floorTypeTimer; // counts up every frame the current floor type is the same as the last frame
/* 0x0A7A */ u8 floorProperty;
/* 0x0A7B */ u8 prevFloorType;
@@ -678,9 +920,9 @@ typedef struct Player {
// #region SOH [Enhancements]
// Upstream TODO: Rename this to make it more obvious it is apart of an enhancement
/* */ u8 boomerangQuickRecall; // Has the player pressed the boomerang button while it's in the air still?
/* */ u8 ivanFloating;
/* */ u8 ivanDamageMultiplier;
// #endregion
u8 ivanFloating;
u8 ivanDamageMultiplier;
} Player; // size = 0xA94
#endif