1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-02-13 00:48:00 +00:00

Doc (partially) player model and anim code data (#1143)

* Doc (partially) player model and anim data

* `Player_OverrideLimbDrawPause` -> `func_80091880`

* Enum comments: use hex

* Change `D_80853914` to 1D array, change accesses to use new macro `PLAYER_ANIM_BY_GROUP_AND_TYPE`

* `PLAYER_ANIM_BY_GROUP_AND_TYPE` -> `GET_PLAYER_ANIM`
This commit is contained in:
Dragorn421 2022-03-20 23:42:01 +01:00 committed by GitHub
parent e07d3a3819
commit 8f9e309452
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 849 additions and 417 deletions

View file

@ -77,7 +77,7 @@ extern MapData gMapDataTable;
extern s16 gSpoilingItems[3];
extern s16 gSpoilingItemReverts[3];
extern FlexSkeletonHeader* gPlayerSkelHeaders[2];
extern u8 gPlayerModelTypes[][5];
extern u8 gPlayerModelTypes[PLAYER_MODELGROUP_MAX][PLAYER_MODELGROUPENTRY_MAX];
extern Gfx* D_80125DE8[];
extern Gfx* D_80125E08[];
extern Gfx* D_80125E18[];

View file

@ -212,6 +212,123 @@ typedef enum {
/* 3 */ PLAYER_DOORTYPE_FAKE
} PlayerDoorType;
typedef enum {
/* 0x00 */ PLAYER_MODELGROUP_0, // unused (except with the `func_80091880` bug)
/* 0x01 */ PLAYER_MODELGROUP_CHILD_HYLIAN_SHIELD, // kokiri/master sword, shield not in hand
/* 0x02 */ PLAYER_MODELGROUP_SWORD, // kokiri/master sword and possibly shield
/* 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
/* 0x06 */ PLAYER_MODELGROUP_BOW_SLINGSHOT, // bow/slingshot
/* 0x07 */ PLAYER_MODELGROUP_EXPLOSIVES, // bombs, bombchus, same as PLAYER_MODELGROUP_DEFAULT
/* 0x08 */ PLAYER_MODELGROUP_BOOMERANG,
/* 0x09 */ PLAYER_MODELGROUP_HOOKSHOT,
/* 0x0A */ PLAYER_MODELGROUP_10, // stick/fishing pole (which are drawn separately)
/* 0x0B */ PLAYER_MODELGROUP_HAMMER,
/* 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"
/* 0x10 */ PLAYER_MODELGROUP_MAX
} PlayerModelGroup;
typedef enum {
/* 0x00 */ PLAYER_MODELGROUPENTRY_ANIM,
/* 0x01 */ PLAYER_MODELGROUPENTRY_LEFT_HAND,
/* 0x02 */ PLAYER_MODELGROUPENTRY_RIGHT_HAND,
/* 0x03 */ PLAYER_MODELGROUPENTRY_SHEATH,
/* 0x04 */ PLAYER_MODELGROUPENTRY_WAIST,
/* 0x05 */ PLAYER_MODELGROUPENTRY_MAX
} PlayerModelGroupEntry;
typedef enum {
// left hand
/* 0x00 */ PLAYER_MODELTYPE_LH_OPEN, // empty open hand
/* 0x01 */ PLAYER_MODELTYPE_LH_CLOSED, // empty closed hand
/* 0x02 */ PLAYER_MODELTYPE_LH_SWORD, // holding kokiri/master sword
/* 0x03 */ PLAYER_MODELTYPE_3, // unused, same as PLAYER_MODELTYPE_LH_SWORD
/* 0x04 */ PLAYER_MODELTYPE_LH_BGS, // holding bgs/broken giant knife (child: master sword)
/* 0x05 */ PLAYER_MODELTYPE_LH_HAMMER, // holding hammer (child: empty hand)
/* 0x06 */ PLAYER_MODELTYPE_LH_BOOMERANG, // holding boomerang (adult: empty hand)
/* 0x07 */ PLAYER_MODELTYPE_LH_BOTTLE, // holding bottle (bottle drawn separately)
// right hand
/* 0x08 */ PLAYER_MODELTYPE_RH_OPEN, // empty open hand
/* 0x09 */ PLAYER_MODELTYPE_RH_CLOSED, // empty closed hand
/* 0x0A */ PLAYER_MODELTYPE_RH_SHIELD, // holding a shield (including no shield)
/* 0x0B */ PLAYER_MODELTYPE_RH_BOW_SLINGSHOT, // holding bow/slingshot
/* 0x0C */ PLAYER_MODELTYPE_12, // unused, same as PLAYER_MODELTYPE_RH_BOW_SLINGSHOT
/* 0x0D */ PLAYER_MODELTYPE_RH_OCARINA, // holding ocarina (child: fairy ocarina, adult: OoT)
/* 0x0E */ PLAYER_MODELTYPE_RH_OOT, // holding OoT
/* 0x0F */ PLAYER_MODELTYPE_RH_HOOKSHOT, // holding hookshot (child: empty hand)
// sheath
/* 0x10 */ PLAYER_MODELTYPE_SHEATH_16, // sheathed kokiri/master sword?
/* 0x11 */ PLAYER_MODELTYPE_SHEATH_17, // empty sheath?
/* 0x12 */ PLAYER_MODELTYPE_SHEATH_18, // sword sheathed and shield on back?
/* 0x13 */ PLAYER_MODELTYPE_SHEATH_19, // empty sheath and shield on back?
// waist
/* 0x14 */ PLAYER_MODELTYPE_WAIST,
/* 0x15 */ PLAYER_MODELTYPE_MAX,
/* 0xFF */ PLAYER_MODELTYPE_RH_FF = 0xFF // disable shield collider, cutscene-specific
} PlayerModelType;
typedef enum {
/* 0x00 */ PLAYER_ANIMTYPE_0,
/* 0x01 */ PLAYER_ANIMTYPE_1,
/* 0x02 */ PLAYER_ANIMTYPE_2,
/* 0x03 */ PLAYER_ANIMTYPE_3,
/* 0x04 */ PLAYER_ANIMTYPE_4,
/* 0x05 */ PLAYER_ANIMTYPE_5,
/* 0x06 */ PLAYER_ANIMTYPE_MAX
} PlayerAnimType;
typedef enum {
/* 0x00 */ PLAYER_ANIMGROUP_0,
/* 0x01 */ PLAYER_ANIMGROUP_1,
/* 0x02 */ PLAYER_ANIMGROUP_2,
/* 0x03 */ PLAYER_ANIMGROUP_3,
/* 0x04 */ PLAYER_ANIMGROUP_4,
/* 0x05 */ PLAYER_ANIMGROUP_5,
/* 0x06 */ PLAYER_ANIMGROUP_6,
/* 0x07 */ PLAYER_ANIMGROUP_7,
/* 0x08 */ PLAYER_ANIMGROUP_8,
/* 0x09 */ PLAYER_ANIMGROUP_9,
/* 0x0A */ PLAYER_ANIMGROUP_10,
/* 0x0B */ PLAYER_ANIMGROUP_11,
/* 0x0C */ PLAYER_ANIMGROUP_12,
/* 0x0D */ PLAYER_ANIMGROUP_13,
/* 0x0E */ PLAYER_ANIMGROUP_14,
/* 0x0F */ PLAYER_ANIMGROUP_15,
/* 0x10 */ PLAYER_ANIMGROUP_16,
/* 0x11 */ PLAYER_ANIMGROUP_17,
/* 0x12 */ PLAYER_ANIMGROUP_18,
/* 0x13 */ PLAYER_ANIMGROUP_19,
/* 0x14 */ PLAYER_ANIMGROUP_20,
/* 0x15 */ PLAYER_ANIMGROUP_21,
/* 0x16 */ PLAYER_ANIMGROUP_22,
/* 0x17 */ PLAYER_ANIMGROUP_23,
/* 0x18 */ PLAYER_ANIMGROUP_24,
/* 0x19 */ PLAYER_ANIMGROUP_25,
/* 0x1A */ PLAYER_ANIMGROUP_26,
/* 0x1B */ PLAYER_ANIMGROUP_27,
/* 0x1C */ PLAYER_ANIMGROUP_28,
/* 0x1D */ PLAYER_ANIMGROUP_29,
/* 0x1E */ PLAYER_ANIMGROUP_30,
/* 0x1F */ PLAYER_ANIMGROUP_31,
/* 0x20 */ PLAYER_ANIMGROUP_32,
/* 0x21 */ PLAYER_ANIMGROUP_33,
/* 0x22 */ PLAYER_ANIMGROUP_34,
/* 0x23 */ PLAYER_ANIMGROUP_35,
/* 0x24 */ PLAYER_ANIMGROUP_36,
/* 0x25 */ PLAYER_ANIMGROUP_37,
/* 0x26 */ PLAYER_ANIMGROUP_38,
/* 0x27 */ PLAYER_ANIMGROUP_39,
/* 0x28 */ PLAYER_ANIMGROUP_40,
/* 0x29 */ PLAYER_ANIMGROUP_41,
/* 0x2A */ PLAYER_ANIMGROUP_42,
/* 0x2B */ PLAYER_ANIMGROUP_43,
/* 0x2C */ PLAYER_ANIMGROUP_44,
/* 0x2D */ PLAYER_ANIMGROUP_MAX
} PlayerAnimGroup;
#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)

View file

@ -25,9 +25,74 @@ s16 sBootData[PLAYER_BOOTS_MAX][17] = {
};
// Used to map action params to model groups
u8 sActionModelGroups[] = {
3, 15, 10, 2, 2, 5, 10, 11, 6, 6, 6, 6, 6, 6, 6, 6, 9, 9, 7, 7, 8, 3, 3, 6, 3, 3, 3, 3, 12, 13, 14, 14, 14, 14,
14, 14, 14, 14, 14, 14, 14, 14, 14, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
u8 sActionModelGroups[PLAYER_AP_MAX] = {
/* PLAYER_AP_NONE */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_LAST_USED */ PLAYER_MODELGROUP_15,
/* PLAYER_AP_FISHING_POLE */ PLAYER_MODELGROUP_10,
/* PLAYER_AP_SWORD_MASTER */ PLAYER_MODELGROUP_SWORD,
/* PLAYER_AP_SWORD_KOKIRI */ PLAYER_MODELGROUP_SWORD,
/* PLAYER_AP_SWORD_BGS */ PLAYER_MODELGROUP_BGS,
/* PLAYER_AP_STICK */ PLAYER_MODELGROUP_10,
/* PLAYER_AP_HAMMER */ PLAYER_MODELGROUP_HAMMER,
/* PLAYER_AP_BOW */ PLAYER_MODELGROUP_BOW_SLINGSHOT,
/* PLAYER_AP_BOW_FIRE */ PLAYER_MODELGROUP_BOW_SLINGSHOT,
/* PLAYER_AP_BOW_ICE */ PLAYER_MODELGROUP_BOW_SLINGSHOT,
/* PLAYER_AP_BOW_LIGHT */ PLAYER_MODELGROUP_BOW_SLINGSHOT,
/* PLAYER_AP_BOW_0C */ PLAYER_MODELGROUP_BOW_SLINGSHOT,
/* PLAYER_AP_BOW_0D */ PLAYER_MODELGROUP_BOW_SLINGSHOT,
/* PLAYER_AP_BOW_0E */ PLAYER_MODELGROUP_BOW_SLINGSHOT,
/* PLAYER_AP_SLINGSHOT */ PLAYER_MODELGROUP_BOW_SLINGSHOT,
/* PLAYER_AP_HOOKSHOT */ PLAYER_MODELGROUP_HOOKSHOT,
/* PLAYER_AP_LONGSHOT */ PLAYER_MODELGROUP_HOOKSHOT,
/* PLAYER_AP_BOMB */ PLAYER_MODELGROUP_EXPLOSIVES,
/* PLAYER_AP_BOMBCHU */ PLAYER_MODELGROUP_EXPLOSIVES,
/* PLAYER_AP_BOOMERANG */ PLAYER_MODELGROUP_BOOMERANG,
/* PLAYER_AP_MAGIC_SPELL_15 */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_MAGIC_SPELL_16 */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_MAGIC_SPELL_17 */ PLAYER_MODELGROUP_BOW_SLINGSHOT,
/* PLAYER_AP_FARORES_WIND */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_NAYRUS_LOVE */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_DINS_FIRE */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_NUT */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_OCARINA_FAIRY */ PLAYER_MODELGROUP_OCARINA,
/* PLAYER_AP_OCARINA_TIME */ PLAYER_MODELGROUP_OOT,
/* PLAYER_AP_BOTTLE */ PLAYER_MODELGROUP_BOTTLE,
/* PLAYER_AP_BOTTLE_FISH */ PLAYER_MODELGROUP_BOTTLE,
/* PLAYER_AP_BOTTLE_FIRE */ PLAYER_MODELGROUP_BOTTLE,
/* PLAYER_AP_BOTTLE_BUG */ PLAYER_MODELGROUP_BOTTLE,
/* PLAYER_AP_BOTTLE_POE */ PLAYER_MODELGROUP_BOTTLE,
/* PLAYER_AP_BOTTLE_BIG_POE */ PLAYER_MODELGROUP_BOTTLE,
/* PLAYER_AP_BOTTLE_LETTER */ PLAYER_MODELGROUP_BOTTLE,
/* PLAYER_AP_BOTTLE_POTION_RED */ PLAYER_MODELGROUP_BOTTLE,
/* PLAYER_AP_BOTTLE_POTION_BLUE */ PLAYER_MODELGROUP_BOTTLE,
/* PLAYER_AP_BOTTLE_POTION_GREEN */ PLAYER_MODELGROUP_BOTTLE,
/* PLAYER_AP_BOTTLE_MILK */ PLAYER_MODELGROUP_BOTTLE,
/* PLAYER_AP_BOTTLE_MILK_HALF */ PLAYER_MODELGROUP_BOTTLE,
/* PLAYER_AP_BOTTLE_FAIRY */ PLAYER_MODELGROUP_BOTTLE,
/* PLAYER_AP_LETTER_ZELDA */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_WEIRD_EGG */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_CHICKEN */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_BEAN */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_POCKET_EGG */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_POCKET_CUCCO */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_COJIRO */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_ODD_MUSHROOM */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_ODD_POTION */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_SAW */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_SWORD_BROKEN */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_PRESCRIPTION */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_FROG */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_EYEDROPS */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_CLAIM_CHECK */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_MASK_KEATON */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_MASK_SKULL */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_MASK_SPOOKY */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_MASK_BUNNY */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_MASK_GORON */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_MASK_ZORA */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_MASK_GERUDO */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_MASK_TRUTH */ PLAYER_MODELGROUP_DEFAULT,
/* PLAYER_AP_LENS */ PLAYER_MODELGROUP_DEFAULT,
};
TextTriggerEntry sTextTriggers[] = {
@ -38,68 +103,134 @@ TextTriggerEntry sTextTriggers[] = {
};
// Used to map model groups to model types for [animation, left hand, right hand, sheath, waist]
u8 gPlayerModelTypes[][5] = {
{ 2, 0, 10, 16, 20 }, { 1, 2, 9, 19, 20 }, { 1, 2, 10, 17, 20 }, { 0, 0, 8, 18, 20 },
{ 0, 0, 8, 18, 20 }, { 3, 4, 9, 19, 20 }, { 4, 1, 11, 18, 20 }, { 5, 0, 8, 18, 20 },
{ 0, 6, 8, 18, 20 }, { 4, 0, 15, 18, 20 }, { 3, 1, 9, 18, 20 }, { 3, 5, 9, 18, 20 },
{ 0, 0, 13, 18, 20 }, { 0, 0, 14, 18, 20 }, { 0, 7, 8, 18, 20 }, { 0, 2, 8, 19, 20 },
u8 gPlayerModelTypes[PLAYER_MODELGROUP_MAX][PLAYER_MODELGROUPENTRY_MAX] = {
/* PLAYER_MODELGROUP_0 */
{ PLAYER_ANIMTYPE_2, PLAYER_MODELTYPE_LH_OPEN, PLAYER_MODELTYPE_RH_SHIELD, PLAYER_MODELTYPE_SHEATH_16,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_CHILD_HYLIAN_SHIELD */
{ PLAYER_ANIMTYPE_1, PLAYER_MODELTYPE_LH_SWORD, PLAYER_MODELTYPE_RH_CLOSED, PLAYER_MODELTYPE_SHEATH_19,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_SWORD */
{ PLAYER_ANIMTYPE_1, PLAYER_MODELTYPE_LH_SWORD, PLAYER_MODELTYPE_RH_SHIELD, PLAYER_MODELTYPE_SHEATH_17,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_DEFAULT */
{ PLAYER_ANIMTYPE_0, PLAYER_MODELTYPE_LH_OPEN, PLAYER_MODELTYPE_RH_OPEN, PLAYER_MODELTYPE_SHEATH_18,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_4 */
{ PLAYER_ANIMTYPE_0, PLAYER_MODELTYPE_LH_OPEN, PLAYER_MODELTYPE_RH_OPEN, PLAYER_MODELTYPE_SHEATH_18,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_BGS */
{ PLAYER_ANIMTYPE_3, PLAYER_MODELTYPE_LH_BGS, PLAYER_MODELTYPE_RH_CLOSED, PLAYER_MODELTYPE_SHEATH_19,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_BOW_SLINGSHOT */
{ PLAYER_ANIMTYPE_4, PLAYER_MODELTYPE_LH_CLOSED, PLAYER_MODELTYPE_RH_BOW_SLINGSHOT, PLAYER_MODELTYPE_SHEATH_18,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_EXPLOSIVES */
{ PLAYER_ANIMTYPE_5, PLAYER_MODELTYPE_LH_OPEN, PLAYER_MODELTYPE_RH_OPEN, PLAYER_MODELTYPE_SHEATH_18,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_BOOMERANG */
{ PLAYER_ANIMTYPE_0, PLAYER_MODELTYPE_LH_BOOMERANG, PLAYER_MODELTYPE_RH_OPEN, PLAYER_MODELTYPE_SHEATH_18,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_HOOKSHOT */
{ PLAYER_ANIMTYPE_4, PLAYER_MODELTYPE_LH_OPEN, PLAYER_MODELTYPE_RH_HOOKSHOT, PLAYER_MODELTYPE_SHEATH_18,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_10 */
{ PLAYER_ANIMTYPE_3, PLAYER_MODELTYPE_LH_CLOSED, PLAYER_MODELTYPE_RH_CLOSED, PLAYER_MODELTYPE_SHEATH_18,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_HAMMER */
{ PLAYER_ANIMTYPE_3, PLAYER_MODELTYPE_LH_HAMMER, PLAYER_MODELTYPE_RH_CLOSED, PLAYER_MODELTYPE_SHEATH_18,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_OCARINA */
{ PLAYER_ANIMTYPE_0, PLAYER_MODELTYPE_LH_OPEN, PLAYER_MODELTYPE_RH_OCARINA, PLAYER_MODELTYPE_SHEATH_18,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_OOT */
{ PLAYER_ANIMTYPE_0, PLAYER_MODELTYPE_LH_OPEN, PLAYER_MODELTYPE_RH_OOT, PLAYER_MODELTYPE_SHEATH_18,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_BOTTLE */
{ PLAYER_ANIMTYPE_0, PLAYER_MODELTYPE_LH_BOTTLE, PLAYER_MODELTYPE_RH_OPEN, PLAYER_MODELTYPE_SHEATH_18,
PLAYER_MODELTYPE_WAIST },
/* PLAYER_MODELGROUP_15 */
{ PLAYER_ANIMTYPE_0, PLAYER_MODELTYPE_LH_SWORD, PLAYER_MODELTYPE_RH_OPEN, PLAYER_MODELTYPE_SHEATH_19,
PLAYER_MODELTYPE_WAIST },
};
Gfx* D_80125CE8[] = {
Gfx* D_80125CE8[PLAYER_SHIELD_MAX * 4] = {
// PLAYER_SHIELD_NONE
gLinkAdultRightHandClosedNearDL,
gLinkChildRightHandClosedNearDL,
gLinkAdultRightHandClosedFarDL,
gLinkChildRightHandClosedFarDL,
// PLAYER_SHIELD_DEKU
gLinkAdultRightHandClosedNearDL,
gLinkChildRightFistAndDekuShieldNearDL,
gLinkAdultRightHandClosedFarDL,
gLinkChildRightFistAndDekuShieldFarDL,
// PLAYER_SHIELD_HYLIAN
gLinkAdultRightHandHoldingHylianShieldNearDL,
gLinkChildRightHandClosedNearDL,
gLinkAdultRightHandHoldingHylianShieldFarDL,
gLinkChildRightHandClosedFarDL,
// PLAYER_SHIELD_MIRROR
gLinkAdultRightHandHoldingMirrorShieldNearDL,
gLinkChildRightHandClosedNearDL,
gLinkAdultRightHandHoldingMirrorShieldFarDL,
gLinkChildRightHandClosedFarDL,
};
Gfx* D_80125D28[] = {
gLinkAdultMasterSwordAndSheathNearDL, gLinkChildSwordAndSheathNearDL,
gLinkAdultMasterSwordAndSheathFarDL, gLinkChildSwordAndSheathFarDL,
gLinkAdultMasterSwordAndSheathNearDL, gLinkChildDekuShieldSwordAndSheathNearDL,
gLinkAdultMasterSwordAndSheathFarDL, gLinkChildDekuShieldSwordAndSheathFarDL,
gLinkAdultHylianShieldSwordAndSheathNearDL, gLinkChildHylianShieldSwordAndSheathNearDL,
gLinkAdultHylianShieldSwordAndSheathFarDL, gLinkChildHylianShieldSwordAndSheathFarDL,
gLinkAdultMirrorShieldSwordAndSheathNearDL, gLinkChildSwordAndSheathNearDL,
gLinkAdultMirrorShieldSwordAndSheathFarDL, gLinkChildSwordAndSheathFarDL,
Gfx* D_80125D28[PLAYER_SHIELD_MAX * 4] = {
// PLAYER_SHIELD_NONE
gLinkAdultMasterSwordAndSheathNearDL,
gLinkChildSwordAndSheathNearDL,
gLinkAdultMasterSwordAndSheathFarDL,
gLinkChildSwordAndSheathFarDL,
// PLAYER_SHIELD_DEKU
gLinkAdultMasterSwordAndSheathNearDL,
gLinkChildDekuShieldSwordAndSheathNearDL,
gLinkAdultMasterSwordAndSheathFarDL,
gLinkChildDekuShieldSwordAndSheathFarDL,
// PLAYER_SHIELD_HYLIAN
gLinkAdultHylianShieldSwordAndSheathNearDL,
gLinkChildHylianShieldSwordAndSheathNearDL,
gLinkAdultHylianShieldSwordAndSheathFarDL,
gLinkChildHylianShieldSwordAndSheathFarDL,
// PLAYER_SHIELD_MIRROR
gLinkAdultMirrorShieldSwordAndSheathNearDL,
gLinkChildSwordAndSheathNearDL,
gLinkAdultMirrorShieldSwordAndSheathFarDL,
gLinkChildSwordAndSheathFarDL,
};
Gfx* D_80125D68[] = {
NULL, NULL, NULL, NULL, NULL, gLinkChildDekuShieldWithMatrixDL, NULL, gLinkChildDekuShieldWithMatrixDL,
};
Gfx* D_80125D88[] = {
Gfx* D_80125D88[(PLAYER_SHIELD_MAX + 2) * 4] = {
// PLAYER_SHIELD_NONE
gLinkAdultSheathNearDL,
gLinkChildSheathNearDL,
gLinkAdultSheathFarDL,
gLinkChildSheathFarDL,
// PLAYER_SHIELD_DEKU
gLinkAdultSheathNearDL,
gLinkChildDekuShieldAndSheathNearDL,
gLinkAdultSheathFarDL,
gLinkChildDekuShieldAndSheathFarDL,
// PLAYER_SHIELD_HYLIAN
gLinkAdultHylianShieldAndSheathNearDL,
gLinkChildHylianShieldAndSheathNearDL,
gLinkAdultHylianShieldAndSheathFarDL,
gLinkChildHylianShieldAndSheathFarDL,
// PLAYER_SHIELD_MIRROR
gLinkAdultMirrorShieldAndSheathNearDL,
gLinkChildSheathNearDL,
gLinkAdultMirrorShieldAndSheathFarDL,
gLinkChildSheathFarDL,
// PLAYER_SHIELD_NONE (child, no sword)
NULL,
NULL,
NULL,
NULL,
// PLAYER_SHIELD_DEKU (child, no sword)
gLinkAdultSheathNearDL,
gLinkChildDekuShieldWithMatrixDL,
gLinkAdultSheathNearDL,
@ -107,10 +238,16 @@ Gfx* D_80125D88[] = {
};
Gfx* D_80125DE8[] = {
gLinkAdultLeftHandHoldingBgsNearDL, gLinkChildLeftHandHoldingMasterSwordDL,
gLinkAdultLeftHandHoldingBgsFarDL, gLinkChildLeftHandHoldingMasterSwordDL,
gLinkAdultHandHoldingBrokenGiantsKnifeDL, gLinkChildLeftHandHoldingMasterSwordDL,
gLinkAdultHandHoldingBrokenGiantsKnifeFarDL, gLinkChildLeftHandHoldingMasterSwordDL,
// biggoron sword
gLinkAdultLeftHandHoldingBgsNearDL,
gLinkChildLeftHandHoldingMasterSwordDL,
gLinkAdultLeftHandHoldingBgsFarDL,
gLinkChildLeftHandHoldingMasterSwordDL,
// broken giant knife
gLinkAdultHandHoldingBrokenGiantsKnifeDL,
gLinkChildLeftHandHoldingMasterSwordDL,
gLinkAdultHandHoldingBrokenGiantsKnifeFarDL,
gLinkChildLeftHandHoldingMasterSwordDL,
};
Gfx* D_80125E08[] = {
@ -258,10 +395,28 @@ Gfx* sHoldingFirstPersonWeaponDLs[] = {
};
// Indexed by model types (left hand, right hand, sheath or waist)
Gfx** sPlayerDListGroups[] = {
D_80125E08, D_80125E18, D_80125E38, D_80125E28, D_80125DE8, D_80125EE8, D_80125EF8,
D_80125F08, D_80125E48, D_80125E58, D_80125CE8, D_80125E68, D_80125EA8, D_80125EB8,
D_80125EC8, D_80125ED8, D_80125E78, D_80125E88, D_80125D28, D_80125D88, D_80125E98,
Gfx** sPlayerDListGroups[PLAYER_MODELTYPE_MAX] = {
/* PLAYER_MODELTYPE_LH_OPEN */ D_80125E08,
/* PLAYER_MODELTYPE_LH_CLOSED */ D_80125E18,
/* PLAYER_MODELTYPE_LH_SWORD */ D_80125E38,
/* PLAYER_MODELTYPE_3 */ D_80125E28,
/* PLAYER_MODELTYPE_LH_BGS */ D_80125DE8,
/* PLAYER_MODELTYPE_LH_HAMMER */ D_80125EE8,
/* PLAYER_MODELTYPE_LH_BOOMERANG */ D_80125EF8,
/* PLAYER_MODELTYPE_LH_BOTTLE */ D_80125F08,
/* PLAYER_MODELTYPE_RH_OPEN */ D_80125E48,
/* PLAYER_MODELTYPE_RH_CLOSED */ D_80125E58,
/* PLAYER_MODELTYPE_RH_SHIELD */ D_80125CE8,
/* PLAYER_MODELTYPE_RH_BOW_SLINGSHOT */ D_80125E68,
/* PLAYER_MODELTYPE_12 */ D_80125EA8,
/* PLAYER_MODELTYPE_RH_OCARINA */ D_80125EB8,
/* PLAYER_MODELTYPE_RH_OOT */ D_80125EC8,
/* PLAYER_MODELTYPE_RH_HOOKSHOT */ D_80125ED8,
/* PLAYER_MODELTYPE_SHEATH_16 */ D_80125E78,
/* PLAYER_MODELTYPE_SHEATH_17 */ D_80125E88,
/* PLAYER_MODELTYPE_SHEATH_18 */ D_80125D28,
/* PLAYER_MODELTYPE_SHEATH_19 */ D_80125D88,
/* PLAYER_MODELTYPE_WAIST */ D_80125E98,
};
Gfx gCullBackDList[] = {
@ -277,8 +432,8 @@ Gfx gCullFrontDList[] = {
Vec3f* sCurBodyPartPos;
s32 sDListsLodOffset;
Vec3f sGetItemRefPos;
s32 D_80160014;
s32 D_80160018;
s32 sLeftHandType;
s32 sRightHandType;
void Player_SetBootData(GlobalContext* globalCtx, Player* this) {
s32 currentBoots;
@ -348,8 +503,9 @@ s32 Player_IsChildWithHylianShield(Player* this) {
s32 Player_ActionToModelGroup(Player* this, s32 actionParam) {
s32 modelGroup = sActionModelGroups[actionParam];
if ((modelGroup == 2) && Player_IsChildWithHylianShield(this)) {
return 1;
if ((modelGroup == PLAYER_MODELGROUP_SWORD) && Player_IsChildWithHylianShield(this)) {
// child, using kokiri sword with hylian shield equipped
return PLAYER_MODELGROUP_CHILD_HYLIAN_SHIELD;
} else {
return modelGroup;
}
@ -359,29 +515,33 @@ void Player_SetModelsForHoldingShield(Player* this) {
if ((this->stateFlags1 & PLAYER_STATE1_22) &&
((this->itemActionParam < 0) || (this->itemActionParam == this->heldItemActionParam))) {
if (!Player_HoldsTwoHandedWeapon(this) && !Player_IsChildWithHylianShield(this)) {
this->rightHandType = 10;
this->rightHandDLists = &sPlayerDListGroups[10][(void)0, gSaveContext.linkAge];
if (this->sheathType == 18) {
this->sheathType = 16;
} else if (this->sheathType == 19) {
this->sheathType = 17;
this->rightHandType = PLAYER_MODELTYPE_RH_SHIELD;
this->rightHandDLists = &sPlayerDListGroups[PLAYER_MODELTYPE_RH_SHIELD][(void)0, gSaveContext.linkAge];
if (this->sheathType == PLAYER_MODELTYPE_SHEATH_18) {
this->sheathType = PLAYER_MODELTYPE_SHEATH_16;
} else if (this->sheathType == PLAYER_MODELTYPE_SHEATH_19) {
this->sheathType = PLAYER_MODELTYPE_SHEATH_17;
}
this->sheathDLists = &sPlayerDListGroups[this->sheathType][(void)0, gSaveContext.linkAge];
this->modelAnimType = 2;
this->modelAnimType = PLAYER_ANIMTYPE_2;
this->itemActionParam = -1;
}
}
}
void Player_SetModels(Player* this, s32 modelGroup) {
this->leftHandType = gPlayerModelTypes[modelGroup][1];
this->rightHandType = gPlayerModelTypes[modelGroup][2];
this->sheathType = gPlayerModelTypes[modelGroup][3];
this->leftHandType = gPlayerModelTypes[modelGroup][PLAYER_MODELGROUPENTRY_LEFT_HAND];
this->rightHandType = gPlayerModelTypes[modelGroup][PLAYER_MODELGROUPENTRY_RIGHT_HAND];
this->sheathType = gPlayerModelTypes[modelGroup][PLAYER_MODELGROUPENTRY_SHEATH];
this->leftHandDLists = &sPlayerDListGroups[gPlayerModelTypes[modelGroup][1]][(void)0, gSaveContext.linkAge];
this->rightHandDLists = &sPlayerDListGroups[gPlayerModelTypes[modelGroup][2]][(void)0, gSaveContext.linkAge];
this->sheathDLists = &sPlayerDListGroups[gPlayerModelTypes[modelGroup][3]][(void)0, gSaveContext.linkAge];
this->waistDLists = &sPlayerDListGroups[gPlayerModelTypes[modelGroup][4]][(void)0, gSaveContext.linkAge];
this->leftHandDLists = &sPlayerDListGroups[gPlayerModelTypes[modelGroup][PLAYER_MODELGROUPENTRY_LEFT_HAND]]
[(void)0, gSaveContext.linkAge];
this->rightHandDLists = &sPlayerDListGroups[gPlayerModelTypes[modelGroup][PLAYER_MODELGROUPENTRY_RIGHT_HAND]]
[(void)0, gSaveContext.linkAge];
this->sheathDLists = &sPlayerDListGroups[gPlayerModelTypes[modelGroup][PLAYER_MODELGROUPENTRY_SHEATH]]
[(void)0, gSaveContext.linkAge];
this->waistDLists =
&sPlayerDListGroups[gPlayerModelTypes[modelGroup][PLAYER_MODELGROUPENTRY_WAIST]][(void)0, gSaveContext.linkAge];
Player_SetModelsForHoldingShield(this);
}
@ -389,14 +549,14 @@ void Player_SetModels(Player* this, s32 modelGroup) {
void Player_SetModelGroup(Player* this, s32 modelGroup) {
this->modelGroup = modelGroup;
if (modelGroup == 1) {
this->modelAnimType = 0;
if (modelGroup == PLAYER_MODELGROUP_CHILD_HYLIAN_SHIELD) {
this->modelAnimType = PLAYER_ANIMTYPE_0;
} else {
this->modelAnimType = gPlayerModelTypes[modelGroup][0];
this->modelAnimType = gPlayerModelTypes[modelGroup][PLAYER_MODELGROUPENTRY_ANIM];
}
if ((this->modelAnimType < 3) && (this->currentShield == PLAYER_SHIELD_NONE)) {
this->modelAnimType = 0;
if ((this->modelAnimType < PLAYER_ANIMTYPE_3) && (this->currentShield == PLAYER_SHIELD_NONE)) {
this->modelAnimType = PLAYER_ANIMTYPE_0;
}
Player_SetModels(this, modelGroup);
@ -519,7 +679,7 @@ s32 Player_HasMirrorShieldEquipped(GlobalContext* globalCtx) {
s32 Player_HasMirrorShieldSetToDraw(GlobalContext* globalCtx) {
Player* this = GET_PLAYER(globalCtx);
return (this->rightHandType == 10) && (this->currentShield == PLAYER_SHIELD_MIRROR);
return (this->rightHandType == PLAYER_MODELTYPE_RH_SHIELD) && (this->currentShield == PLAYER_SHIELD_MIRROR);
}
s32 Player_ActionToMagicSpell(Player* this, s32 actionParam) {
@ -694,8 +854,8 @@ Color_RGB8 sGauntletColors[] = {
};
Gfx* sBootDListGroups[][2] = {
{ gLinkAdultLeftIronBootDL, gLinkAdultRightIronBootDL },
{ gLinkAdultLeftHoverBootDL, gLinkAdultRightHoverBootDL },
/* PLAYER_BOOTS_IRON */ { gLinkAdultLeftIronBootDL, gLinkAdultRightIronBootDL },
/* PLAYER_BOOTS_HOVER */ { gLinkAdultLeftHoverBootDL, gLinkAdultRightHoverBootDL },
};
void Player_DrawImpl(GlobalContext* globalCtx, void** skeleton, Vec3s* jointTable, s32 dListCount, s32 lod, s32 tunic,
@ -747,10 +907,12 @@ void Player_DrawImpl(GlobalContext* globalCtx, void** skeleton, Vec3s* jointTabl
gSPDisplayList(POLY_OPA_DISP++, gLinkAdultLeftGauntletPlate1DL);
gSPDisplayList(POLY_OPA_DISP++, gLinkAdultRightGauntletPlate1DL);
gSPDisplayList(POLY_OPA_DISP++,
(D_80160014 == 0) ? gLinkAdultLeftGauntletPlate2DL : gLinkAdultLeftGauntletPlate3DL);
gSPDisplayList(POLY_OPA_DISP++,
(D_80160018 == 8) ? gLinkAdultRightGauntletPlate2DL : gLinkAdultRightGauntletPlate3DL);
gSPDisplayList(POLY_OPA_DISP++, (sLeftHandType == PLAYER_MODELTYPE_LH_OPEN)
? gLinkAdultLeftGauntletPlate2DL
: gLinkAdultLeftGauntletPlate3DL);
gSPDisplayList(POLY_OPA_DISP++, (sRightHandType == PLAYER_MODELTYPE_RH_OPEN)
? gLinkAdultRightGauntletPlate2DL
: gLinkAdultRightGauntletPlate3DL);
}
if (boots != 0) {
@ -881,8 +1043,8 @@ s32 Player_OverrideLimbDrawGameplayCommon(GlobalContext* globalCtx, s32 limbInde
Player* this = (Player*)thisx;
if (limbIndex == PLAYER_LIMB_ROOT) {
D_80160014 = this->leftHandType;
D_80160018 = this->rightHandType;
sLeftHandType = this->leftHandType;
sRightHandType = this->rightHandType;
// `sCurBodyPartPos` is incremented before each usage, so it starts at index -1.
// What determines if a limb corresponds to a body part is whether or not it has a non-NULL `dList`.
@ -957,40 +1119,42 @@ s32 Player_OverrideLimbDrawGameplayDefault(GlobalContext* globalCtx, s32 limbInd
if (limbIndex == PLAYER_LIMB_L_HAND) {
Gfx** dLists = this->leftHandDLists;
if ((D_80160014 == 4) && (gSaveContext.swordHealth <= 0.0f)) {
if ((sLeftHandType == PLAYER_MODELTYPE_LH_BGS) && (gSaveContext.swordHealth <= 0.0f)) {
dLists += 4;
} else if ((D_80160014 == 6) && (this->stateFlags1 & PLAYER_STATE1_25)) {
} else if ((sLeftHandType == PLAYER_MODELTYPE_LH_BOOMERANG) && (this->stateFlags1 & PLAYER_STATE1_25)) {
dLists = &D_80125E08[gSaveContext.linkAge];
D_80160014 = 0;
} else if ((this->leftHandType == 0) && (this->actor.speedXZ > 2.0f) &&
sLeftHandType = PLAYER_MODELTYPE_LH_OPEN;
} else if ((this->leftHandType == PLAYER_MODELTYPE_LH_OPEN) && (this->actor.speedXZ > 2.0f) &&
!(this->stateFlags1 & PLAYER_STATE1_27)) {
dLists = &D_80125E18[gSaveContext.linkAge];
D_80160014 = 1;
sLeftHandType = PLAYER_MODELTYPE_LH_CLOSED;
}
*dList = dLists[sDListsLodOffset];
} else if (limbIndex == PLAYER_LIMB_R_HAND) {
Gfx** dLists = this->rightHandDLists;
if (D_80160018 == 10) {
if (sRightHandType == PLAYER_MODELTYPE_RH_SHIELD) {
dLists += this->currentShield * 4;
} else if ((this->rightHandType == 8) && (this->actor.speedXZ > 2.0f) &&
} else if ((this->rightHandType == PLAYER_MODELTYPE_RH_OPEN) && (this->actor.speedXZ > 2.0f) &&
!(this->stateFlags1 & PLAYER_STATE1_27)) {
dLists = &D_80125E58[gSaveContext.linkAge];
D_80160018 = 9;
sRightHandType = PLAYER_MODELTYPE_RH_CLOSED;
}
*dList = dLists[sDListsLodOffset];
} else if (limbIndex == PLAYER_LIMB_SHEATH) {
Gfx** dLists = this->sheathDLists;
if ((this->sheathType == 18) || (this->sheathType == 19)) {
if ((this->sheathType == PLAYER_MODELTYPE_SHEATH_18) || (this->sheathType == PLAYER_MODELTYPE_SHEATH_19)) {
dLists += this->currentShield * 4;
if (!LINK_IS_ADULT && (this->currentShield < PLAYER_SHIELD_HYLIAN) &&
(gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KOKIRI)) {
dLists += 16;
dLists += PLAYER_SHIELD_MAX * 4;
}
} else if (!LINK_IS_ADULT && ((this->sheathType == 16) || (this->sheathType == 17)) &&
} else if (!LINK_IS_ADULT &&
((this->sheathType == PLAYER_MODELTYPE_SHEATH_16) ||
(this->sheathType == PLAYER_MODELTYPE_SHEATH_17)) &&
(gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KOKIRI)) {
dLists = D_80125D68;
}
@ -1298,7 +1462,7 @@ void Player_PostLimbDrawGameplay(GlobalContext* globalCtx, s32 limbIndex, Gfx**
func_80090A28(this, spE4);
func_800906D4(globalCtx, this, spE4);
} else if ((*dList != NULL) && (this->leftHandType == 7)) {
} else if ((*dList != NULL) && (this->leftHandType == PLAYER_MODELTYPE_LH_BOTTLE)) {
Color_RGB8* bottleColor = &sBottleColors[Player_ActionToBottle(this, this->itemActionParam)];
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_player_lib.c", 2710);
@ -1339,9 +1503,10 @@ void Player_PostLimbDrawGameplay(GlobalContext* globalCtx, s32 limbIndex, Gfx**
} else if (limbIndex == PLAYER_LIMB_R_HAND) {
Actor* heldActor = this->heldActor;
if (this->rightHandType == 0xFF) {
if (this->rightHandType == PLAYER_MODELTYPE_RH_FF) {
Matrix_Get(&this->shieldMf);
} else if ((this->rightHandType == 11) || (this->rightHandType == 12)) {
} else if ((this->rightHandType == PLAYER_MODELTYPE_RH_BOW_SLINGSHOT) ||
(this->rightHandType == PLAYER_MODELTYPE_12)) {
BowStringData* stringData = &sBowStringData[gSaveContext.linkAge];
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_player_lib.c", 2783);
@ -1382,7 +1547,7 @@ void Player_PostLimbDrawGameplay(GlobalContext* globalCtx, s32 limbIndex, Gfx**
Matrix_Pop();
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_player_lib.c", 2809);
} else if ((this->actor.scale.y >= 0.0f) && (this->rightHandType == 10)) {
} else if ((this->actor.scale.y >= 0.0f) && (this->rightHandType == PLAYER_MODELTYPE_RH_SHIELD)) {
Matrix_Get(&this->shieldMf);
func_80090604(globalCtx, this, &this->shieldQuad, D_80126154);
}
@ -1427,7 +1592,8 @@ void Player_PostLimbDrawGameplay(GlobalContext* globalCtx, s32 limbIndex, Gfx**
}
} else if (this->actor.scale.y >= 0.0f) {
if (limbIndex == PLAYER_LIMB_SHEATH) {
if ((this->rightHandType != 10) && (this->rightHandType != 0xFF)) {
if ((this->rightHandType != PLAYER_MODELTYPE_RH_SHIELD) &&
(this->rightHandType != PLAYER_MODELTYPE_RH_FF)) {
if (Player_IsChildWithHylianShield(this)) {
func_80090604(globalCtx, this, &this->shieldQuad, D_8012619C);
}
@ -1471,39 +1637,42 @@ u32 func_80091738(GlobalContext* globalCtx, u8* segment, SkelAnime* skelAnime) {
sizeof(Vec3s[PLAYER_LIMB_BUF_COUNT]);
}
u8 D_801261F8[] = { 2, 2, 5 };
u8 D_801261F8[] = { PLAYER_MODELGROUP_SWORD, PLAYER_MODELGROUP_SWORD, PLAYER_MODELGROUP_BGS };
s32 Player_OverrideLimbDrawPause(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
void* arg) {
u8* ptr = arg;
u8 modelGroup = D_801261F8[ptr[0] - 1];
u8* playerSwordAndShield = arg;
//! @bug `playerSwordAndShield[0]` can be 0 (no sword), which indexes `D_801261F8[-1]`. The result
//! happens to be 0 (`PLAYER_MODELGROUP_0`) in vanilla, but weird values are likely to cause a crash
u8 modelGroup = D_801261F8[playerSwordAndShield[0] - 1];
s32 type;
s32 dListOffset = 0;
Gfx** dLists;
if ((modelGroup == 2) && !LINK_IS_ADULT && (ptr[1] == 2)) {
modelGroup = 1;
if ((modelGroup == PLAYER_MODELGROUP_SWORD) && !LINK_IS_ADULT &&
(playerSwordAndShield[1] == PLAYER_SHIELD_HYLIAN)) {
modelGroup = PLAYER_MODELGROUP_CHILD_HYLIAN_SHIELD;
}
if (limbIndex == PLAYER_LIMB_L_HAND) {
type = gPlayerModelTypes[modelGroup][1];
D_80160014 = type;
if ((type == 4) && (gSaveContext.swordHealth <= 0.0f)) {
type = gPlayerModelTypes[modelGroup][PLAYER_MODELGROUPENTRY_LEFT_HAND];
sLeftHandType = type;
if ((type == PLAYER_MODELTYPE_LH_BGS) && (gSaveContext.swordHealth <= 0.0f)) {
dListOffset = 4;
}
} else if (limbIndex == PLAYER_LIMB_R_HAND) {
type = gPlayerModelTypes[modelGroup][2];
D_80160018 = type;
if (type == 10) {
dListOffset = ptr[1] * 4;
type = gPlayerModelTypes[modelGroup][PLAYER_MODELGROUPENTRY_RIGHT_HAND];
sRightHandType = type;
if (type == PLAYER_MODELTYPE_RH_SHIELD) {
dListOffset = playerSwordAndShield[1] * 4;
}
} else if (limbIndex == PLAYER_LIMB_SHEATH) {
type = gPlayerModelTypes[modelGroup][3];
if ((type == 18) || (type == 19)) {
dListOffset = ptr[1] * 4;
type = gPlayerModelTypes[modelGroup][PLAYER_MODELGROUPENTRY_SHEATH];
if ((type == PLAYER_MODELTYPE_SHEATH_18) || (type == PLAYER_MODELTYPE_SHEATH_19)) {
dListOffset = playerSwordAndShield[1] * 4;
}
} else if (limbIndex == PLAYER_LIMB_WAIST) {
type = gPlayerModelTypes[modelGroup][4];
type = gPlayerModelTypes[modelGroup][PLAYER_MODELGROUPENTRY_WAIST];
} else {
return 0;
}
@ -1522,7 +1691,7 @@ void Player_DrawPauseImpl(GlobalContext* globalCtx, void* gameplayKeep, void* li
(PAUSE_EQUIP_PLAYER_WIDTH / 2) << 2, (PAUSE_EQUIP_PLAYER_HEIGHT / 2) << 2, G_MAXZ / 2, 0 };
static Lights1 lights1 = gdSPDefLights1(80, 80, 80, 255, 255, 255, 84, 84, 172);
static Vec3f lightDir = { 89.8f, 0.0f, 89.8f };
u8 sp12C[2];
u8 playerSwordAndShield[2];
Gfx* opaRef;
Gfx* xluRef;
u16 perspNorm;
@ -1588,8 +1757,8 @@ void Player_DrawPauseImpl(GlobalContext* globalCtx, void* gameplayKeep, void* li
gSPMatrix(POLY_OPA_DISP++, lookAtMtx, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION);
sp12C[0] = sword;
sp12C[1] = shield;
playerSwordAndShield[0] = sword;
playerSwordAndShield[1] = shield;
Matrix_SetTranslateRotateYXZ(pos->x, pos->y, pos->z, rot);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
@ -1608,7 +1777,7 @@ void Player_DrawPauseImpl(GlobalContext* globalCtx, void* gameplayKeep, void* li
gSPSegment(POLY_OPA_DISP++, 0x0C, gCullBackDList);
Player_DrawImpl(globalCtx, skelAnime->skeleton, skelAnime->jointTable, skelAnime->dListCount, 0, tunic, boots, 0,
Player_OverrideLimbDrawPause, NULL, &sp12C);
Player_OverrideLimbDrawPause, NULL, &playerSwordAndShield);
gSPEndDisplayList(POLY_OPA_DISP++);
gSPEndDisplayList(POLY_XLU_DISP++);

View file

@ -305,7 +305,7 @@ void ArmsHook_Draw(Actor* thisx, GlobalContext* globalCtx) {
f32 sp5C;
f32 sp58;
if ((player->actor.draw != NULL) && (player->rightHandType == 15)) {
if ((player->actor.draw != NULL) && (player->rightHandType == PLAYER_MODELTYPE_RH_HOOKSHOT)) {
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_arms_hook.c", 850);
if ((ArmsHook_Shoot != this->actionFunc) || (this->timer <= 0)) {

View file

@ -97,7 +97,7 @@ void EnTorch2_Init(Actor* thisx, GlobalContext* globalCtx2) {
sInput.cur.stick_x = sInput.cur.stick_y = 0;
this->currentShield = PLAYER_SHIELD_HYLIAN;
this->heldItemActionParam = this->heldItemId = PLAYER_AP_SWORD_MASTER;
Player_SetModelGroup(this, 2);
Player_SetModelGroup(this, PLAYER_MODELGROUP_SWORD);
globalCtx->playerInit(this, globalCtx, &gDarkLinkSkel);
this->actor.naviEnemyId = 0x26;
this->cylinder.base.acFlags = AC_ON | AC_TYPE_PLAYER;

View file

@ -545,7 +545,7 @@ void EnZl2_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Ve
{
Player* player = GET_PLAYER(globalCtx);
Matrix_Push();
if (player->rightHandType == 0xFF) {
if (player->rightHandType == PLAYER_MODELTYPE_RH_FF) {
Matrix_Put(&player->shieldMf);
Matrix_Translate(180.0f, 979.0f, -375.0f, MTXMODE_APPLY);
Matrix_RotateZYX(-0x5DE7, -0x53E9, 0x3333, MTXMODE_APPLY);

File diff suppressed because it is too large Load diff