diff options
| author | Pepe20129 <72659707+Pepe20129@users.noreply.github.com> | 2024-10-17 20:55:31 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-17 11:55:31 -0700 |
| commit | b5c6545d6f97b7762aa3f0cc308c2b0e6ec9fd84 (patch) | |
| tree | 176c9870f3587de7362f2537e7abd006ef4814b6 /soh/src/code | |
| parent | 3c5d9faba38346d1aa3355d14cce3b8286f1290b (diff) | |
`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
Diffstat (limited to 'soh/src/code')
| -rw-r--r-- | soh/src/code/z_actor.c | 80 | ||||
| -rw-r--r-- | soh/src/code/z_camera.c | 2 | ||||
| -rw-r--r-- | soh/src/code/z_parameter.c | 2 | ||||
| -rw-r--r-- | soh/src/code/z_player_lib.c | 230 |
4 files changed, 170 insertions, 144 deletions
diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 7c3914095..b9616a44a 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -486,7 +486,7 @@ void func_8002C124(TargetContext* targetCtx, PlayState* play) { func_8002BE64(targetCtx, targetCtx->unk_4C, spBC.x, spBC.y, spBC.z); - if ((!(player->stateFlags1 & PLAYER_STATE1_TEXT_ON_SCREEN)) || (actor != player->unk_664)) { + if ((!(player->stateFlags1 & PLAYER_STATE1_TALKING)) || (actor != player->focusActor)) { OVERLAY_DISP = Gfx_SetupDL(OVERLAY_DISP, 0x39); for (spB0 = 0, spAC = targetCtx->unk_4C; spB0 < spB8; spB0++, spAC = (spAC + 1) % 3) { @@ -564,7 +564,7 @@ void func_8002C7BC(TargetContext* targetCtx, Player* player, Actor* actorArg, Pl unkActor = NULL; - if ((player->unk_664 != NULL) && (player->unk_84B[player->unk_846] == 2)) { + if ((player->focusActor != NULL) && (player->controlStickDirections[player->controlStickDataIndex] == 2)) { targetCtx->unk_94 = NULL; } else { func_80032AF0(play, &play->actorCtx, &unkActor, player); @@ -1397,7 +1397,7 @@ s32 func_8002DD78(Player* player) { s32 func_8002DDA8(PlayState* play) { Player* player = GET_PLAYER(play); - return (player->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD) || func_8002DD78(player); + return (player->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) || func_8002DD78(player); } s32 func_8002DDE4(PlayState* play) { @@ -1448,7 +1448,7 @@ s32 func_8002DF38(PlayState* play, Actor* actor, u8 csAction) { player->csAction = csAction; player->csActor = actor; - player->doorBgCamIndex = 0; + player->cv.haltActorsDuringCsAction = false; return true; } @@ -1457,7 +1457,7 @@ s32 Player_SetCsActionWithHaltedActors(PlayState* play, Actor* actor, u8 csActio Player* player = GET_PLAYER(play); func_8002DF38(play, actor, csAction); - player->doorBgCamIndex = 1; + player->cv.haltActorsDuringCsAction = true; return true; } @@ -1854,7 +1854,7 @@ f32 func_8002EFC0(Actor* actor, Player* player, s16 arg2) { s16 yawTemp = (s16)(actor->yawTowardsPlayer - 0x8000) - arg2; s16 yawTempAbs = ABS(yawTemp); - if (player->unk_664 != NULL) { + if (player->focusActor != NULL) { if ((yawTempAbs > 0x4000) || (actor->flags & ACTOR_FLAG_NO_LOCKON)) { return FLT_MAX; } else { @@ -1900,7 +1900,7 @@ s32 func_8002F0C8(Actor* actor, Player* player, s32 flag) { s16 abs_var = ABS(var); f32 dist; - if ((player->unk_664 == NULL) && (abs_var > 0x2AAA)) { + if ((player->focusActor == NULL) && (abs_var > 0x2AAA)) { dist = FLT_MAX; } else { dist = actor->xyzDistToPlayerSq; @@ -1927,13 +1927,13 @@ s32 func_8002F1C4(Actor* actor, PlayState* play, f32 arg2, f32 arg3, u32 exchang // This is convoluted but it seems like it must be a single if statement to match if ((player->actor.flags & ACTOR_FLAG_PLAYER_TALKED_TO) || ((exchangeItemId != EXCH_ITEM_NONE) && Player_InCsMode(play)) || (!actor->isTargeted && - ((arg3 < fabsf(actor->yDistToPlayer)) || (player->targetActorDistance < actor->xzDistToPlayer) || + ((arg3 < fabsf(actor->yDistToPlayer)) || (player->talkActorDistance < actor->xzDistToPlayer) || (arg2 < actor->xzDistToPlayer)))) { return false; } - player->targetActor = actor; - player->targetActorDistance = actor->xzDistToPlayer; + player->talkActor = actor; + player->talkActorDistance = actor->xzDistToPlayer; player->exchangeItemId = exchangeItemId; return true; @@ -2002,7 +2002,7 @@ s32 GiveItemEntryWithoutActor(PlayState* play, GetItemEntry getItemEntry) { Player_GetExplosiveHeld(player) < 0) { if (((player->heldActor != NULL) && ((getItemEntry.getItemId > GI_NONE) && (getItemEntry.getItemId < GI_MAX)) || (IS_RANDO && (getItemEntry.getItemId > RG_NONE) && (getItemEntry.getItemId < RG_MAX))) || - (!(player->stateFlags1 & (PLAYER_STATE1_ITEM_OVER_HEAD | PLAYER_STATE1_IN_CUTSCENE)))) { + (!(player->stateFlags1 & (PLAYER_STATE1_CARRYING_ACTOR | PLAYER_STATE1_IN_CUTSCENE)))) { if ((getItemEntry.getItemId != GI_NONE)) { player->getItemEntry = getItemEntry; player->getItemId = getItemEntry.getItemId; @@ -2039,10 +2039,10 @@ s32 GiveItemEntryFromActor(Actor* actor, PlayState* play, GetItemEntry getItemEn (PLAYER_STATE1_DEAD | PLAYER_STATE1_CHARGING_SPIN_ATTACK | PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LEDGE | PLAYER_STATE1_JUMPING | PLAYER_STATE1_FREEFALL | PLAYER_STATE1_FIRST_PERSON | PLAYER_STATE1_CLIMBING_LADDER)) && Player_GetExplosiveHeld(player) < 0) { - if ((((player->heldActor != NULL) || (actor == player->targetActor)) && + if ((((player->heldActor != NULL) || (actor == player->talkActor)) && ((!IS_RANDO && ((getItemEntry.getItemId > GI_NONE) && (getItemEntry.getItemId < GI_MAX))) || (IS_RANDO && ((getItemEntry.getItemId > RG_NONE) && (getItemEntry.getItemId < RG_MAX))))) || - (!(player->stateFlags1 & (PLAYER_STATE1_ITEM_OVER_HEAD | PLAYER_STATE1_IN_CUTSCENE)))) { + (!(player->stateFlags1 & (PLAYER_STATE1_CARRYING_ACTOR | PLAYER_STATE1_IN_CUTSCENE)))) { if ((actor->xzDistToPlayer < xzRange) && (fabsf(actor->yDistToPlayer) < yRange)) { s16 yawDiff = actor->yawTowardsPlayer - player->actor.shape.rot.y; s32 absYawDiff = ABS(yawDiff); @@ -2083,9 +2083,9 @@ s32 Actor_OfferGetItem(Actor* actor, PlayState* play, s32 getItemId, f32 xzRange (PLAYER_STATE1_DEAD | PLAYER_STATE1_CHARGING_SPIN_ATTACK | PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LEDGE | PLAYER_STATE1_JUMPING | PLAYER_STATE1_FREEFALL | PLAYER_STATE1_FIRST_PERSON | PLAYER_STATE1_CLIMBING_LADDER)) && Player_GetExplosiveHeld(player) < 0) { - if ((((player->heldActor != NULL) || (actor == player->targetActor)) && + if ((((player->heldActor != NULL) || (actor == player->talkActor)) && ((!IS_RANDO && ((getItemId > GI_NONE) && (getItemId < GI_MAX))) || (IS_RANDO && ((getItemId > RG_NONE) && (getItemId < RG_MAX))))) || - (!(player->stateFlags1 & (PLAYER_STATE1_ITEM_OVER_HEAD | PLAYER_STATE1_IN_CUTSCENE)))) { + (!(player->stateFlags1 & (PLAYER_STATE1_CARRYING_ACTOR | PLAYER_STATE1_IN_CUTSCENE)))) { if ((actor->xzDistToPlayer < xzRange) && (fabsf(actor->yDistToPlayer) < yRange)) { s16 yawDiff = actor->yawTowardsPlayer - player->actor.shape.rot.y; s32 absYawDiff = ABS(yawDiff); @@ -2156,7 +2156,7 @@ u32 Actor_SetRideActor(PlayState* play, Actor* horse, s32 mountSide) { Player* player = GET_PLAYER(play); if (!(player->stateFlags1 & - (PLAYER_STATE1_DEAD | PLAYER_STATE1_ITEM_OVER_HEAD | PLAYER_STATE1_CHARGING_SPIN_ATTACK | PLAYER_STATE1_HANGING_OFF_LEDGE | + (PLAYER_STATE1_DEAD | PLAYER_STATE1_CARRYING_ACTOR | PLAYER_STATE1_CHARGING_SPIN_ATTACK | PLAYER_STATE1_HANGING_OFF_LEDGE | PLAYER_STATE1_CLIMBING_LEDGE | PLAYER_STATE1_JUMPING | PLAYER_STATE1_FREEFALL | PLAYER_STATE1_FIRST_PERSON | PLAYER_STATE1_CLIMBING_LADDER))) { player->rideActor = horse; player->mountSide = mountSide; @@ -2177,11 +2177,11 @@ s32 Actor_NotMounted(PlayState* play, Actor* horse) { void func_8002F698(PlayState* play, Actor* actor, f32 arg2, s16 arg3, f32 arg4, u32 arg5, u32 arg6) { Player* player = GET_PLAYER(play); - player->unk_8A0 = arg6; - player->unk_8A1 = arg5; - player->unk_8A2 = arg3; - player->unk_8A4 = arg2; - player->unk_8A8 = arg4; + player->knockbackDamage = arg6; + player->knockbackType = arg5; + player->knockbackRot = arg3; + player->knockbackSpeed = arg2; + player->knockbackYVelocity = arg4; } void func_8002F6D4(PlayState* play, Actor* actor, f32 arg2, s16 arg3, f32 arg4, u32 arg5) { @@ -2502,18 +2502,18 @@ void func_800304DC(PlayState* play, ActorContext* actorCtx, ActorEntry* actorEnt } u32 D_80116068[ACTORCAT_MAX] = { - PLAYER_STATE1_TEXT_ON_SCREEN | PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_ITEM_CS, - PLAYER_STATE1_TEXT_ON_SCREEN | PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_ITEM_CS, + PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_ITEM_CS, + PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_ITEM_CS, 0, - PLAYER_STATE1_TEXT_ON_SCREEN | PLAYER_STATE1_GETTING_ITEM | PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_ITEM_CS, + PLAYER_STATE1_TALKING | PLAYER_STATE1_GETTING_ITEM | PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_ITEM_CS, PLAYER_STATE1_DEAD, - PLAYER_STATE1_TEXT_ON_SCREEN | PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_ITEM_CS | PLAYER_STATE1_IN_CUTSCENE, + PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_ITEM_CS | PLAYER_STATE1_IN_CUTSCENE, PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_ITEM_CS, 0, - PLAYER_STATE1_TEXT_ON_SCREEN | PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_ITEM_CS | PLAYER_STATE1_IN_CUTSCENE, - PLAYER_STATE1_TEXT_ON_SCREEN | PLAYER_STATE1_GETTING_ITEM | PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_ITEM_CS, + PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_ITEM_CS | PLAYER_STATE1_IN_CUTSCENE, + PLAYER_STATE1_TALKING | PLAYER_STATE1_GETTING_ITEM | PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_ITEM_CS, 0, - PLAYER_STATE1_TEXT_ON_SCREEN | PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_ITEM_CS, + PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_ITEM_CS, }; void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) { @@ -2558,8 +2558,8 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) { unkFlag = ACTOR_FLAG_NO_FREEZE_OCARINA; } - if ((player->stateFlags1 & PLAYER_STATE1_TEXT_ON_SCREEN) && ((player->actor.textId & 0xFF00) != 0x600)) { - sp74 = player->targetActor; + if ((player->stateFlags1 & PLAYER_STATE1_TALKING) && ((player->actor.textId & 0xFF00) != 0x600)) { + sp74 = player->talkActor; } for (i = 0; i < ARRAY_COUNT(actorCtx->actorLists); i++, sp80++) { @@ -2613,13 +2613,13 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) { actor->flags &= ~ACTOR_FLAG_PLAY_HIT_SFX; if ((DECR(actor->freezeTimer) == 0) && (actor->flags & (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_ACTIVE))) { - if (actor == player->unk_664) { + if (actor == player->focusActor) { actor->isTargeted = true; } else { actor->isTargeted = false; } - if ((actor->targetPriority != 0) && (player->unk_664 == NULL)) { + if ((actor->targetPriority != 0) && (player->focusActor == NULL)) { actor->targetPriority = 0; } @@ -2643,14 +2643,14 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) { } } - actor = player->unk_664; + actor = player->focusActor; if ((actor != NULL) && (actor->update == NULL)) { actor = NULL; - func_8008EDF0(player); + Player_ReleaseLockOn(player); } - if ((actor == NULL) || (player->unk_66C < 5)) { + if ((actor == NULL) || (player->zTargetActiveTimer < 5)) { actor = NULL; if (actorCtx->targetCtx.unk_4B != 0) { actorCtx->targetCtx.unk_4B = 0; @@ -3429,8 +3429,8 @@ Actor* Actor_Delete(ActorContext* actorCtx, Actor* actor, PlayState* play) { osSyncPrintf("アクタークラス削除 [%s]\n", dbEntry->name); // "Actor class deleted [%s]" } - if ((player != NULL) && (actor == player->unk_664)) { - func_8008EDF0(player); + if ((player != NULL) && (actor == player->focusActor)) { + Player_ReleaseLockOn(player); Camera_ChangeMode(Play_GetCamera(play, Play_GetActiveCamId(play)), 0); } @@ -3484,7 +3484,7 @@ void func_800328D4(PlayState* play, ActorContext* actorCtx, Player* player, u32 Vec3f sp70; actor = actorCtx->actorLists[actorCategory].head; - sp84 = player->unk_664; + sp84 = player->focusActor; while (actor != NULL) { if ((actor->update != NULL) && ((Player*)actor != player) && CHECK_FLAG_ALL(actor->flags, ACTOR_FLAG_TARGETABLE)) { @@ -3985,7 +3985,7 @@ s16 Actor_TestFloorInDirection(Actor* actor, PlayState* play, f32 distance, s16 s32 Actor_IsTargeted(PlayState* play, Actor* actor) { Player* player = GET_PLAYER(play); - if ((player->stateFlags1 & PLAYER_STATE1_ENEMY_TARGET) && actor->isTargeted) { + if ((player->stateFlags1 & PLAYER_STATE1_HOSTILE_LOCK_ON) && actor->isTargeted) { return true; } else { return false; @@ -3998,7 +3998,7 @@ s32 Actor_IsTargeted(PlayState* play, Actor* actor) { s32 Actor_OtherIsTargeted(PlayState* play, Actor* actor) { Player* player = GET_PLAYER(play); - if ((player->stateFlags1 & PLAYER_STATE1_ENEMY_TARGET) && !actor->isTargeted) { + if ((player->stateFlags1 & PLAYER_STATE1_HOSTILE_LOCK_ON) && !actor->isTargeted) { return true; } else { return false; diff --git a/soh/src/code/z_camera.c b/soh/src/code/z_camera.c index bfaafaba2..986606045 100644 --- a/soh/src/code/z_camera.c +++ b/soh/src/code/z_camera.c @@ -6182,7 +6182,7 @@ s32 Camera_Demo5(Camera* camera) { sp4A = playerhead.rot.y - playerTargetGeo.yaw; if (camera->target->category == ACTORCAT_PLAYER) { pad = camera->play->state.frames - sDemo5PrevAction12Frame; - if (player->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD) { + if (player->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) { // holding object over head. Player_SetCsActionWithHaltedActors(camera->play, camera->target, 8); } else if (ABS(pad) > 3000) { diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 29f7430eb..10b2953ec 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -4051,7 +4051,7 @@ void Interface_DrawEnemyHealthBar(TargetContext* targetCtx, PlayState* play) { Interface_CreateQuadVertexGroup(&sEnemyHealthVtx[12], -floorf(halfBarWidth) + endTexWidth, (-texHeight / 2) + 3, healthBarFill, 7, 0); - if (((!(player->stateFlags1 & PLAYER_STATE1_TEXT_ON_SCREEN)) || (actor != player->unk_664)) && targetCtx->unk_44 < 500.0f) { + if (((!(player->stateFlags1 & PLAYER_STATE1_TALKING)) || (actor != player->focusActor)) && targetCtx->unk_44 < 500.0f) { f32 slideInOffsetY = 0; // Slide in the health bar from edge of the screen (mimic the Z-Target triangles fly in) diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c index bde5ea431..1a05a515d 100644 --- a/soh/src/code/z_player_lib.c +++ b/soh/src/code/z_player_lib.c @@ -34,73 +34,73 @@ s16 sBootData[PLAYER_BOOTS_MAX][17] = { // Used to map action params to model groups u8 sActionModelGroups[] = { - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_NONE - PLAYER_MODELGROUP_15, // PLAYER_IA_LAST_USED - PLAYER_MODELGROUP_10, // PLAYER_IA_FISHING_POLE - PLAYER_MODELGROUP_SWORD, // PLAYER_IA_SWORD_MASTER - PLAYER_MODELGROUP_SWORD, // PLAYER_IA_SWORD_KOKIRI - PLAYER_MODELGROUP_BGS, // PLAYER_IA_SWORD_BIGGORON - PLAYER_MODELGROUP_10, // PLAYER_IA_DEKU_STICK - PLAYER_MODELGROUP_HAMMER, // PLAYER_IA_HAMMER - PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_BOW - PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_BOW_FIRE - PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_BOW_ICE - PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_BOW_LIGHT - PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_BOW_0C - PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_BOW_0D - PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_BOW_0E - PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_SLINGSHOT - PLAYER_MODELGROUP_HOOKSHOT, // PLAYER_IA_HOOKSHOT - PLAYER_MODELGROUP_HOOKSHOT, // PLAYER_IA_LONGSHOT - PLAYER_MODELGROUP_EXPLOSIVES, // PLAYER_IA_BOMB - PLAYER_MODELGROUP_EXPLOSIVES, // PLAYER_IA_BOMBCHU - PLAYER_MODELGROUP_BOOMERANG, // PLAYER_IA_BOOMERANG - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MAGIC_SPELL_15 - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MAGIC_SPELL_16 - PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_MAGIC_SPELL_17 - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_FARORES_WIND - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_NAYRUS_LOVE - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_DINS_FIRE - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_DEKU_NUT - PLAYER_MODELGROUP_OCARINA, // PLAYER_IA_OCARINA_FAIRY - PLAYER_MODELGROUP_OOT, // PLAYER_IA_OCARINA_OF_TIME - PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE - PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_FISH - PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_FIRE - PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_BUG - PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_POE - PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_BIG_POE - PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_RUTOS_LETTER - PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_POTION_RED - PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_POTION_BLUE - PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_POTION_GREEN - PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_MILK_FULL - PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_MILK_HALF - PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_FAIRY - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_ZELDAS_LETTER - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_WEIRD_EGG - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_CHICKEN - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MAGIC_BEAN - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_POCKET_EGG - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_POCKET_CUCCO - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_COJIRO - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_ODD_MUSHROOM - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_ODD_POTION - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_POACHERS_SAW - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_BROKEN_GORONS_SWORD - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_PRESCRIPTION - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_FROG - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_EYEDROPS - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_CLAIM_CHECK - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_KEATON - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_SKULL - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_SPOOKY - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_BUNNY_HOOD - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_GORON - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_ZORA - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_GERUDO - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_TRUTH - PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_LENS_OF_TRUTH + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_NONE + PLAYER_MODELGROUP_SWORD, // PLAYER_IA_SWORD_CS + PLAYER_MODELGROUP_10, // PLAYER_IA_FISHING_POLE + PLAYER_MODELGROUP_SWORD_AND_SHIELD, // PLAYER_IA_SWORD_MASTER + PLAYER_MODELGROUP_SWORD_AND_SHIELD, // PLAYER_IA_SWORD_KOKIRI + PLAYER_MODELGROUP_BGS, // PLAYER_IA_SWORD_BIGGORON + PLAYER_MODELGROUP_10, // PLAYER_IA_DEKU_STICK + PLAYER_MODELGROUP_HAMMER, // PLAYER_IA_HAMMER + PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_BOW + PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_BOW_FIRE + PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_BOW_ICE + PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_BOW_LIGHT + PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_BOW_0C + PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_BOW_0D + PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_BOW_0E + PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_SLINGSHOT + PLAYER_MODELGROUP_HOOKSHOT, // PLAYER_IA_HOOKSHOT + PLAYER_MODELGROUP_HOOKSHOT, // PLAYER_IA_LONGSHOT + PLAYER_MODELGROUP_EXPLOSIVES, // PLAYER_IA_BOMB + PLAYER_MODELGROUP_EXPLOSIVES, // PLAYER_IA_BOMBCHU + PLAYER_MODELGROUP_BOOMERANG, // PLAYER_IA_BOOMERANG + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MAGIC_SPELL_15 + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MAGIC_SPELL_16 + PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_MAGIC_SPELL_17 + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_FARORES_WIND + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_NAYRUS_LOVE + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_DINS_FIRE + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_DEKU_NUT + PLAYER_MODELGROUP_OCARINA, // PLAYER_IA_OCARINA_FAIRY + PLAYER_MODELGROUP_OOT, // PLAYER_IA_OCARINA_OF_TIME + PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE + PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_FISH + PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_FIRE + PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_BUG + PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_POE + PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_BIG_POE + PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_RUTOS_LETTER + PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_POTION_RED + PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_POTION_BLUE + PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_POTION_GREEN + PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_MILK_FULL + PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_MILK_HALF + PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_FAIRY + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_ZELDAS_LETTER + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_WEIRD_EGG + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_CHICKEN + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MAGIC_BEAN + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_POCKET_EGG + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_POCKET_CUCCO + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_COJIRO + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_ODD_MUSHROOM + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_ODD_POTION + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_POACHERS_SAW + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_BROKEN_GORONS_SWORD + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_PRESCRIPTION + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_FROG + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_EYEDROPS + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_CLAIM_CHECK + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_KEATON + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_SKULL + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_SPOOKY + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_BUNNY_HOOD + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_GORON + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_ZORA + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_GERUDO + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_TRUTH + PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_LENS_OF_TRUTH }; TextTriggerEntry sTextTriggers[] = { @@ -128,7 +128,7 @@ u8 gPlayerModelTypes[PLAYER_MODELGROUP_MAX][PLAYER_MODELGROUPENTRY_MAX] = { PLAYER_MODELTYPE_SHEATH_19, PLAYER_MODELTYPE_WAIST }, - /* PLAYER_MODELGROUP_SWORD */ + /* PLAYER_MODELGROUP_SWORD_AND_SHIELD */ { PLAYER_ANIMTYPE_1, PLAYER_MODELTYPE_LH_SWORD, @@ -232,7 +232,7 @@ u8 gPlayerModelTypes[PLAYER_MODELGROUP_MAX][PLAYER_MODELGROUPENTRY_MAX] = { PLAYER_MODELTYPE_SHEATH_18, PLAYER_MODELTYPE_WAIST }, - /* PLAYER_MODELGROUP_15 */ + /* PLAYER_MODELGROUP_SWORD */ { PLAYER_ANIMTYPE_0, PLAYER_MODELTYPE_LH_SWORD, @@ -565,7 +565,7 @@ uint8_t Player_IsCustomLinkModel() { s32 Player_InBlockingCsMode(PlayState* play, Player* this) { return (this->stateFlags1 & (PLAYER_STATE1_DEAD | PLAYER_STATE1_IN_CUTSCENE)) || (this->csAction != 0) || (play->transitionTrigger == TRANS_TRIGGER_START) || - (this->stateFlags1 & PLAYER_STATE1_LOADING) || (this->stateFlags3 & PLAYER_STATE3_HOOKSHOT_TRAVELLING) || + (this->stateFlags1 & PLAYER_STATE1_LOADING) || (this->stateFlags3 & PLAYER_STATE3_FLYING_WITH_HOOKSHOT) || ((gSaveContext.magicState != MAGIC_STATE_IDLE) && (Player_ActionToMagicSpell(this, this->itemAction) >= 0)); } @@ -575,8 +575,15 @@ s32 Player_InCsMode(PlayState* play) { return Player_InBlockingCsMode(play, this) || (this->unk_6AD == 4); } -s32 func_8008E9C4(Player* this) { - return (this->stateFlags1 & PLAYER_STATE1_ENEMY_TARGET); +/** + * Checks if Player is currently locked onto a hostile actor. + * `PLAYER_STATE1_HOSTILE_LOCK_ON` controls Player's "battle" response to hostile actors. + * + * Note that within Player, `Player_UpdateHostileLockOn` exists, which updates the flag and also returns the check. + * Player can use this function instead if the flag should be checked, but not updated. + */ +s32 Player_CheckHostileLockOn(Player* this) { + return (this->stateFlags1 & PLAYER_STATE1_HOSTILE_LOCK_ON); } s32 Player_IsChildWithHylianShield(Player* this) { @@ -586,7 +593,7 @@ s32 Player_IsChildWithHylianShield(Player* this) { s32 Player_ActionToModelGroup(Player* this, s32 actionParam) { s32 modelGroup = sActionModelGroups[actionParam]; - if ((modelGroup == PLAYER_MODELGROUP_SWORD) && Player_IsChildWithHylianShield(this)) { + if ((modelGroup == PLAYER_MODELGROUP_SWORD_AND_SHIELD) && Player_IsChildWithHylianShield(this)) { // child, using kokiri sword with hylian shield equipped return PLAYER_MODELGROUP_CHILD_HYLIAN_SHIELD; } else { @@ -735,29 +742,48 @@ void Player_UpdateBottleHeld(PlayState* play, Player* this, s32 item, s32 action this->itemAction = actionParam; } -void func_8008EDF0(Player* this) { - this->unk_664 = NULL; - this->stateFlags2 &= ~PLAYER_STATE2_SWITCH_TARGETING; +void Player_ReleaseLockOn(Player* this) { + this->focusActor = NULL; + this->stateFlags2 &= ~PLAYER_STATE2_LOCK_ON_WITH_SWITCH; } -void func_8008EE08(Player* this) { +/** + * This function aims to clear Z-Target related state when it isn't in use. + * It also handles setting a specific free fall related state that is interntwined with Z-Targeting. + * TODO: Learn more about this and give a name to PLAYER_STATE1_19 + */ +void Player_ClearZTargeting(Player* this) { if ((this->actor.bgCheckFlags & 1) || (this->stateFlags1 & (PLAYER_STATE1_CLIMBING_LADDER | PLAYER_STATE1_ON_HORSE | PLAYER_STATE1_IN_WATER)) || (!(this->stateFlags1 & (PLAYER_STATE1_JUMPING | PLAYER_STATE1_FREEFALL)) && ((this->actor.world.pos.y - this->actor.floorHeight) < 100.0f))) { - this->stateFlags1 &= ~(PLAYER_STATE1_TARGETING | PLAYER_STATE1_TARGET_LOCKED | PLAYER_STATE1_TARGET_NOTHING | PLAYER_STATE1_JUMPING | PLAYER_STATE1_FREEFALL | PLAYER_STATE1_30); + this->stateFlags1 &= ~(PLAYER_STATE1_Z_TARGETING | PLAYER_STATE1_FRIENDLY_ACTOR_FOCUS | PLAYER_STATE1_PARALLEL | PLAYER_STATE1_JUMPING | PLAYER_STATE1_FREEFALL | PLAYER_STATE1_LOCK_ON_FORCED_TO_RELEASE); } else if (!(this->stateFlags1 & (PLAYER_STATE1_JUMPING | PLAYER_STATE1_FREEFALL | PLAYER_STATE1_CLIMBING_LADDER))) { this->stateFlags1 |= PLAYER_STATE1_FREEFALL; } - func_8008EDF0(this); + Player_ReleaseLockOn(this); } -void func_8008EEAC(PlayState* play, Actor* actor) { +/** + * Sets the "auto lock-on actor" to lock onto an actor without Player's input. + * This function will first release any existing lock-on or (try to) release parallel. + * + * When using Switch Targeting, it is not possible to carry an auto lock-on actor into a normal + * lock-on when the auto lock-on is finished. + * This is because the `PLAYER_STATE2_LOCK_ON_WITH_SWITCH` flag is never set with an auto lock-on. + * With Hold Targeting it is possible to keep the auto lock-on going by keeping the Z button held down. + * + * The auto lock-on is considered "friendly" even if the actor is actually hostile. If the auto lock-on is hostile, + * Player's battle response will not occur (if he is actionable) and the camera behaves differently. + * When transitioning from auto lock-on to normal lock-on (with Hold Targeting) there will be a noticeable change + * when it switches from "friendly" mode to "hostile" mode. + */ +void Player_SetAutoLockOnActor(PlayState* play, Actor* actor) { Player* this = GET_PLAYER(play); - func_8008EE08(this); - this->unk_664 = actor; - this->unk_684 = actor; - this->stateFlags1 |= PLAYER_STATE1_TARGET_LOCKED; + Player_ClearZTargeting(this); + this->focusActor = actor; + this->autoLockOnActor = actor; + this->stateFlags1 |= PLAYER_STATE1_FRIENDLY_ACTOR_FOCUS; Camera_SetParam(Play_GetCamera(play, 0), 8, actor); Camera_ChangeMode(Play_GetCamera(play, 0), 2); } @@ -919,7 +945,7 @@ s32 Player_GetExplosiveHeld(Player* this) { s32 func_8008F2BC(Player* this, s32 actionParam) { s32 sword = 0; - if (actionParam != PLAYER_IA_LAST_USED) { + if (actionParam != PLAYER_IA_SWORD_CS) { sword = actionParam - PLAYER_IA_SWORD_MASTER; if ((sword < 0) || (sword >= 3)) { goto return_neg; @@ -1319,9 +1345,9 @@ s32 Player_OverrideLimbDrawGameplayCommon(PlayState* play, s32 limbIndex, Gfx** Matrix_Translate((LINK_IS_ADULT ? 3600.0f : 2900.0f) * ABS(scale - 1.0f), 0.0f, 0.0f, MTXMODE_APPLY); } } - rot->x += this->unk_6BA; - rot->y -= this->unk_6B8; - rot->z += this->unk_6B6; + rot->x += this->headLimbRot.z; + rot->y -= this->headLimbRot.y; + rot->z += this->headLimbRot.x; } else if (limbIndex == PLAYER_LIMB_L_HAND) { if (CVarGetInteger(CVAR_COSMETIC("Link.SwordScale.Changed"), 0)) { f32 scale = CVarGetFloat(CVAR_COSMETIC("Link.SwordScale.Value"), 1.0f); @@ -1329,18 +1355,18 @@ s32 Player_OverrideLimbDrawGameplayCommon(PlayState* play, s32 limbIndex, Gfx** Matrix_Translate(-((LINK_IS_ADULT ? 320.0f : 200.0f) * scale), 0.0f, 0.0f, MTXMODE_APPLY); } } else if (limbIndex == PLAYER_LIMB_UPPER) { - if (this->unk_6B0 != 0) { + if (this->upperLimbYawSecondary != 0) { Matrix_RotateZ(0x44C * (M_PI / 0x8000), MTXMODE_APPLY); - Matrix_RotateY(this->unk_6B0 * (M_PI / 0x8000), MTXMODE_APPLY); + Matrix_RotateY(this->upperLimbYawSecondary * (M_PI / 0x8000), MTXMODE_APPLY); } - if (this->unk_6BE != 0) { - Matrix_RotateY(this->unk_6BE * (M_PI / 0x8000), MTXMODE_APPLY); + if (this->upperLimbRot.y != 0) { + Matrix_RotateY(this->upperLimbRot.y * (M_PI / 0x8000), MTXMODE_APPLY); } - if (this->unk_6BC != 0) { - Matrix_RotateX(this->unk_6BC * (M_PI / 0x8000), MTXMODE_APPLY); + if (this->upperLimbRot.x != 0) { + Matrix_RotateX(this->upperLimbRot.x * (M_PI / 0x8000), MTXMODE_APPLY); } - if (this->unk_6C0 != 0) { - Matrix_RotateZ(this->unk_6C0 * (M_PI / 0x8000), MTXMODE_APPLY); + if (this->upperLimbRot.z != 0) { + Matrix_RotateZ(this->upperLimbRot.z * (M_PI / 0x8000), MTXMODE_APPLY); } } else if (limbIndex == PLAYER_LIMB_L_THIGH) { func_8008F87C(play, this, &this->skelAnime, pos, rot, PLAYER_LIMB_L_THIGH, PLAYER_LIMB_L_SHIN, @@ -1367,7 +1393,7 @@ s32 Player_OverrideLimbDrawGameplayDefault(PlayState* play, s32 limbIndex, Gfx** if ((sLeftHandType == PLAYER_MODELTYPE_LH_BGS) && (gSaveContext.swordHealth <= 0.0f)) { dLists += 4; - } else if ((sLeftHandType == PLAYER_MODELTYPE_LH_BOOMERANG) && (this->stateFlags1 & PLAYER_STATE1_THREW_BOOMERANG)) { + } else if ((sLeftHandType == PLAYER_MODELTYPE_LH_BOOMERANG) && (this->stateFlags1 & PLAYER_STATE1_BOOMERANG_THROWN)) { dLists = &gPlayerLeftHandOpenDLs[gSaveContext.linkAge]; sLeftHandType = PLAYER_MODELTYPE_LH_OPEN; } else if ((this->leftHandType == PLAYER_MODELTYPE_LH_OPEN) && (this->actor.speedXZ > 2.0f) && !(this->stateFlags1 & PLAYER_STATE1_IN_WATER)) { @@ -1828,7 +1854,7 @@ void Player_PostLimbDrawGameplay(PlayState* play, s32 limbIndex, Gfx** dList, Ve Matrix_Get(&sp14C); Matrix_MtxFToYXZRotS(&sp14C, &hookedActor->world.rot, 0); hookedActor->shape.rot = hookedActor->world.rot; - } else if (this->stateFlags1 & PLAYER_STATE1_ITEM_OVER_HEAD) { + } else if (this->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) { Vec3s spB8; Matrix_Get(&sp14C); @@ -2000,9 +2026,9 @@ u32 func_80091738(PlayState* play, u8* segment, SkelAnime* skelAnime) { } u8 sPauseModelGroupBySword[] = { - PLAYER_MODELGROUP_SWORD, // PLAYER_SWORD_KOKIRI - PLAYER_MODELGROUP_SWORD, // PLAYER_SWORD_MASTER - PLAYER_MODELGROUP_BGS, // PLAYER_SWORD_BIGGORON + PLAYER_MODELGROUP_SWORD_AND_SHIELD, // PLAYER_SWORD_KOKIRI + PLAYER_MODELGROUP_SWORD_AND_SHIELD, // PLAYER_SWORD_MASTER + PLAYER_MODELGROUP_BGS, // PLAYER_SWORD_BIGGORON }; s32 Player_OverrideLimbDrawPause(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* arg) { @@ -2015,7 +2041,7 @@ s32 Player_OverrideLimbDrawPause(PlayState* play, s32 limbIndex, Gfx** dList, Ve Gfx** dLists; size_t ptrSize = sizeof(uint32_t); - if ((modelGroup == PLAYER_MODELGROUP_SWORD) && !LINK_IS_ADULT && (playerSwordAndShield[1] == PLAYER_SHIELD_HYLIAN)) { + if ((modelGroup == PLAYER_MODELGROUP_SWORD_AND_SHIELD) && !LINK_IS_ADULT && (playerSwordAndShield[1] == PLAYER_SHIELD_HYLIAN)) { modelGroup = PLAYER_MODELGROUP_CHILD_HYLIAN_SHIELD; } |
