1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2024-11-25 09:45:02 +00:00

Name talking action related things (#2260)

* name talking related things

* Player_Action_TalkExchangeItem -> Player_Action_ExchangeItem

* splitting action stuff to new PR

* format
This commit is contained in:
fig02 2024-10-10 22:04:30 -04:00 committed by GitHub
parent fdf502dcdd
commit 53c57599a4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 63 additions and 52 deletions

View file

@ -675,7 +675,7 @@ typedef struct WeaponInfo {
#define PLAYER_STATE1_3 (1 << 3) #define PLAYER_STATE1_3 (1 << 3)
#define PLAYER_STATE1_HOSTILE_LOCK_ON (1 << 4) // Currently locked onto a hostile actor. Triggers a "battle" variant of many actions. #define PLAYER_STATE1_HOSTILE_LOCK_ON (1 << 4) // Currently locked onto a hostile actor. Triggers a "battle" variant of many actions.
#define PLAYER_STATE1_5 (1 << 5) #define PLAYER_STATE1_5 (1 << 5)
#define PLAYER_STATE1_6 (1 << 6) #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_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_START_CHANGING_HELD_ITEM (1 << 8) // Item change process has begun
#define PLAYER_STATE1_9 (1 << 9) #define PLAYER_STATE1_9 (1 << 9)
@ -903,7 +903,7 @@ typedef struct Player {
/* 0x0888 */ f32 distToInteractWall; // xyz distance to the interact wall /* 0x0888 */ f32 distToInteractWall; // xyz distance to the interact wall
/* 0x088C */ u8 ledgeClimbType; /* 0x088C */ u8 ledgeClimbType;
/* 0x088D */ u8 ledgeClimbDelayTimer; /* 0x088D */ u8 ledgeClimbDelayTimer;
/* 0x088E */ u8 unk_88E; /* 0x088E */ u8 textboxBtnCooldownTimer; // Prevents usage of A/B/C-up when counting down
/* 0x088F */ u8 damageFlickerAnimCounter; // Used to flicker Link after taking damage /* 0x088F */ u8 damageFlickerAnimCounter; // Used to flicker Link after taking damage
/* 0x0890 */ u8 unk_890; /* 0x0890 */ u8 unk_890;
/* 0x0891 */ u8 bodyShockTimer; /* 0x0891 */ u8 bodyShockTimer;

View file

@ -389,7 +389,7 @@ void Attention_Draw(Attention* attention, PlayState* play) {
Attention_SetReticlePos(attention, attention->curReticle, projectedPos.x, projectedPos.y, projectedPos.z); Attention_SetReticlePos(attention, attention->curReticle, projectedPos.x, projectedPos.y, projectedPos.z);
if (!(player->stateFlags1 & PLAYER_STATE1_6) || (actor != player->focusActor)) { if (!(player->stateFlags1 & PLAYER_STATE1_TALKING) || (actor != player->focusActor)) {
OVERLAY_DISP = Gfx_SetupDL(OVERLAY_DISP, SETUPDL_57); OVERLAY_DISP = Gfx_SetupDL(OVERLAY_DISP, SETUPDL_57);
for (i = 0, curReticle = attention->curReticle; i < numReticles; for (i = 0, curReticle = attention->curReticle; i < numReticles;
@ -2308,29 +2308,29 @@ void Actor_InitContext(PlayState* play, ActorContext* actorCtx, ActorEntry* play
u32 sCategoryFreezeMasks[ACTORCAT_MAX] = { u32 sCategoryFreezeMasks[ACTORCAT_MAX] = {
// ACTORCAT_SWITCH // ACTORCAT_SWITCH
PLAYER_STATE1_6 | PLAYER_STATE1_DEAD | PLAYER_STATE1_28, PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_28,
// ACTORCAT_BG // ACTORCAT_BG
PLAYER_STATE1_6 | PLAYER_STATE1_DEAD | PLAYER_STATE1_28, PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_28,
// ACTORCAT_PLAYER // ACTORCAT_PLAYER
0, 0,
// ACTORCAT_EXPLOSIVE // ACTORCAT_EXPLOSIVE
PLAYER_STATE1_6 | PLAYER_STATE1_DEAD | PLAYER_STATE1_10 | PLAYER_STATE1_28, PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_10 | PLAYER_STATE1_28,
// ACTORCAT_NPC // ACTORCAT_NPC
PLAYER_STATE1_DEAD, PLAYER_STATE1_DEAD,
// ACTORCAT_ENEMY // ACTORCAT_ENEMY
PLAYER_STATE1_6 | PLAYER_STATE1_DEAD | PLAYER_STATE1_28 | PLAYER_STATE1_29, PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_28 | PLAYER_STATE1_29,
// ACTORCAT_PROP // ACTORCAT_PROP
PLAYER_STATE1_DEAD | PLAYER_STATE1_28, PLAYER_STATE1_DEAD | PLAYER_STATE1_28,
// ACTORCAT_ITEMACTION // ACTORCAT_ITEMACTION
0, 0,
// ACTORCAT_MISC // ACTORCAT_MISC
PLAYER_STATE1_6 | PLAYER_STATE1_DEAD | PLAYER_STATE1_28 | PLAYER_STATE1_29, PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_28 | PLAYER_STATE1_29,
// ACTORCAT_BOSS // ACTORCAT_BOSS
PLAYER_STATE1_6 | PLAYER_STATE1_DEAD | PLAYER_STATE1_10 | PLAYER_STATE1_28, PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_10 | PLAYER_STATE1_28,
// ACTORCAT_DOOR // ACTORCAT_DOOR
0, 0,
// ACTORCAT_CHEST // ACTORCAT_CHEST
PLAYER_STATE1_6 | PLAYER_STATE1_DEAD | PLAYER_STATE1_28, PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_28,
}; };
void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) { void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) {
@ -2381,7 +2381,7 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) {
requiredActorFlag = ACTOR_FLAG_25; requiredActorFlag = ACTOR_FLAG_25;
} }
if ((player->stateFlags1 & PLAYER_STATE1_6) && ((player->actor.textId & 0xFF00) != 0x600)) { if ((player->stateFlags1 & PLAYER_STATE1_TALKING) && ((player->actor.textId & 0xFF00) != 0x600)) {
sp74 = player->talkActor; sp74 = player->talkActor;
} }

View file

@ -289,7 +289,7 @@ void BgHakaSgami_Update(Actor* thisx, PlayState* play) {
BgHakaSgami* this = (BgHakaSgami*)thisx; BgHakaSgami* this = (BgHakaSgami*)thisx;
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
if (!(player->stateFlags1 & (PLAYER_STATE1_6 | PLAYER_STATE1_DEAD | PLAYER_STATE1_28 | PLAYER_STATE1_29)) || if (!(player->stateFlags1 & (PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_28 | PLAYER_STATE1_29)) ||
(this->actionFunc == BgHakaSgami_SetupSpin)) { (this->actionFunc == BgHakaSgami_SetupSpin)) {
this->actionFunc(this, play); this->actionFunc(this, play);
} }

View file

@ -200,7 +200,7 @@ void BgJyaGoroiwa_Update(Actor* thisx, PlayState* play) {
s32 bgId; s32 bgId;
Vec3f checkPos; Vec3f checkPos;
if (!(player->stateFlags1 & (PLAYER_STATE1_6 | PLAYER_STATE1_DEAD | PLAYER_STATE1_28 | PLAYER_STATE1_29))) { if (!(player->stateFlags1 & (PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_28 | PLAYER_STATE1_29))) {
this->actionFunc(this, play); this->actionFunc(this, play);
BgJyaGoroiwa_UpdateRotation(this); BgJyaGoroiwa_UpdateRotation(this);
checkPos.x = this->actor.world.pos.x; checkPos.x = this->actor.world.pos.x;

View file

@ -915,7 +915,7 @@ void DoorShutter_Update(Actor* thisx, PlayState* play) {
DoorShutter* this = (DoorShutter*)thisx; DoorShutter* this = (DoorShutter*)thisx;
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
if (!(player->stateFlags1 & (PLAYER_STATE1_6 | PLAYER_STATE1_DEAD | PLAYER_STATE1_10 | PLAYER_STATE1_28)) || if (!(player->stateFlags1 & (PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_10 | PLAYER_STATE1_28)) ||
(this->actionFunc == DoorShutter_WaitForObject)) { (this->actionFunc == DoorShutter_WaitForObject)) {
this->actionFunc(this, play); this->actionFunc(this, play);
} }

View file

@ -739,7 +739,7 @@ void EnGoroiwa_Update(Actor* thisx, PlayState* play) {
s32 pad; s32 pad;
s32 bgId; s32 bgId;
if (!(player->stateFlags1 & (PLAYER_STATE1_6 | PLAYER_STATE1_DEAD | PLAYER_STATE1_28 | PLAYER_STATE1_29))) { if (!(player->stateFlags1 & (PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_28 | PLAYER_STATE1_29))) {
if (this->collisionDisabledTimer > 0) { if (this->collisionDisabledTimer > 0) {
this->collisionDisabledTimer--; this->collisionDisabledTimer--;
} }

View file

@ -147,7 +147,7 @@ void EnNutsball_Update(Actor* thisx, PlayState* play) {
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
s32 pad; s32 pad;
if (!(player->stateFlags1 & (PLAYER_STATE1_6 | PLAYER_STATE1_DEAD | PLAYER_STATE1_28 | PLAYER_STATE1_29)) || if (!(player->stateFlags1 & (PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_28 | PLAYER_STATE1_29)) ||
(this->actionFunc == func_80ABBB34)) { (this->actionFunc == func_80ABBB34)) {
this->actionFunc(this, play); this->actionFunc(this, play);

View file

@ -578,7 +578,7 @@ void EnOkuta_Update(Actor* thisx, PlayState* play2) {
Vec3f prevPos; Vec3f prevPos;
s32 canRestorePrevPos; s32 canRestorePrevPos;
if (!(player->stateFlags1 & (PLAYER_STATE1_6 | PLAYER_STATE1_DEAD | PLAYER_STATE1_28 | PLAYER_STATE1_29))) { if (!(player->stateFlags1 & (PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_28 | PLAYER_STATE1_29))) {
if (this->actor.params == 0) { if (this->actor.params == 0) {
EnOkuta_ColliderCheck(this, play); EnOkuta_ColliderCheck(this, play);
if (!WaterBox_GetSurfaceImpl(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, if (!WaterBox_GetSurfaceImpl(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z,

View file

@ -263,7 +263,7 @@ s32 func_80852F38(PlayState* play, Player* this);
s32 Player_TryCsAction(PlayState* play, Actor* actor, s32 csAction); s32 Player_TryCsAction(PlayState* play, Actor* actor, s32 csAction);
void func_80853080(Player* this, PlayState* play); void func_80853080(Player* this, PlayState* play);
s32 Player_InflictDamage(PlayState* play, s32 damage); s32 Player_InflictDamage(PlayState* play, s32 damage);
void func_80853148(PlayState* play, Actor* actor); void Player_StartTalking(PlayState* play, Actor* actor);
void Player_Action_80840450(Player* this, PlayState* play); void Player_Action_80840450(Player* this, PlayState* play);
void Player_Action_808407CC(Player* this, PlayState* play); void Player_Action_808407CC(Player* this, PlayState* play);
@ -305,7 +305,7 @@ void Player_Action_80846408(Player* this, PlayState* play);
void Player_Action_808464B0(Player* this, PlayState* play); void Player_Action_808464B0(Player* this, PlayState* play);
void Player_Action_80846578(Player* this, PlayState* play); void Player_Action_80846578(Player* this, PlayState* play);
void Player_Action_8084B1D8(Player* this, PlayState* play); void Player_Action_8084B1D8(Player* this, PlayState* play);
void Player_Action_8084B530(Player* this, PlayState* play); void Player_Action_Talk(Player* this, PlayState* play);
void Player_Action_8084B78C(Player* this, PlayState* play); void Player_Action_8084B78C(Player* this, PlayState* play);
void Player_Action_8084B898(Player* this, PlayState* play); void Player_Action_8084B898(Player* this, PlayState* play);
void Player_Action_8084B9E4(Player* this, PlayState* play); void Player_Action_8084B9E4(Player* this, PlayState* play);
@ -333,7 +333,7 @@ void Player_Action_8084EAC0(Player* this, PlayState* play);
void Player_Action_8084ECA4(Player* this, PlayState* play); void Player_Action_8084ECA4(Player* this, PlayState* play);
void Player_Action_8084EED8(Player* this, PlayState* play); void Player_Action_8084EED8(Player* this, PlayState* play);
void Player_Action_8084EFC0(Player* this, PlayState* play); void Player_Action_8084EFC0(Player* this, PlayState* play);
void Player_Action_8084F104(Player* this, PlayState* play); void Player_Action_ExchangeItem(Player* this, PlayState* play);
void Player_Action_8084F390(Player* this, PlayState* play); void Player_Action_8084F390(Player* this, PlayState* play);
void Player_Action_8084F608(Player* this, PlayState* play); void Player_Action_8084F608(Player* this, PlayState* play);
void Player_Action_8084F698(Player* this, PlayState* play); void Player_Action_8084F698(Player* this, PlayState* play);
@ -1731,7 +1731,7 @@ BAD_RETURN(s32) func_80832224(Player* this) {
this->unk_6AD = 0; this->unk_6AD = 0;
} }
s32 func_8083224C(PlayState* play) { s32 Player_IsTalking(PlayState* play) {
Player* this = GET_PLAYER(play); Player* this = GET_PLAYER(play);
return CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_TALK); return CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_TALK);
@ -3438,8 +3438,8 @@ s32 Player_SetupAction(PlayState* play, Player* this, PlayerActionFunc actionFun
Player_FinishAnimMovement(this); Player_FinishAnimMovement(this);
this->stateFlags1 &= ~(PLAYER_STATE1_2 | PLAYER_STATE1_6 | PLAYER_STATE1_26 | PLAYER_STATE1_28 | PLAYER_STATE1_29 | this->stateFlags1 &= ~(PLAYER_STATE1_2 | PLAYER_STATE1_TALKING | PLAYER_STATE1_26 | PLAYER_STATE1_28 |
PLAYER_STATE1_31); PLAYER_STATE1_29 | PLAYER_STATE1_31);
this->stateFlags2 &= ~(PLAYER_STATE2_19 | PLAYER_STATE2_27 | PLAYER_STATE2_IDLE_FIDGET); this->stateFlags2 &= ~(PLAYER_STATE2_19 | PLAYER_STATE2_27 | PLAYER_STATE2_IDLE_FIDGET);
this->stateFlags3 &= ~(PLAYER_STATE3_1 | PLAYER_STATE3_3 | PLAYER_STATE3_FLYING_WITH_HOOKSHOT); this->stateFlags3 &= ~(PLAYER_STATE3_1 | PLAYER_STATE3_3 | PLAYER_STATE3_FLYING_WITH_HOOKSHOT);
@ -3914,7 +3914,7 @@ void Player_UpdateZTargeting(Player* this, PlayState* play) {
ignoreLeash = true; ignoreLeash = true;
} }
isTalking = func_8083224C(play); isTalking = Player_IsTalking(play);
if (isTalking || (this->zTargetActiveTimer != 0) || if (isTalking || (this->zTargetActiveTimer != 0) ||
(this->stateFlags1 & (PLAYER_STATE1_CHARGING_SPIN_ATTACK | PLAYER_STATE1_BOOMERANG_THROWN))) { (this->stateFlags1 & (PLAYER_STATE1_CHARGING_SPIN_ATTACK | PLAYER_STATE1_BOOMERANG_THROWN))) {
@ -5376,7 +5376,7 @@ s32 Player_ActionHandler_1(Player* this, PlayState* play) {
if (this->doorType <= PLAYER_DOORTYPE_AJAR) { if (this->doorType <= PLAYER_DOORTYPE_AJAR) {
doorActor->textId = 0xD0; doorActor->textId = 0xD0;
func_80853148(play, doorActor); Player_StartTalking(play, doorActor);
return 0; return 0;
} }
@ -5641,10 +5641,10 @@ void func_8083A0F4(PlayState* play, Player* this) {
} }
} }
void func_8083A2F8(PlayState* play, Player* this) { void Player_SetupTalk(PlayState* play, Player* this) {
Player_SetupActionPreserveAnimMovement(play, this, Player_Action_8084B530, 0); Player_SetupActionPreserveAnimMovement(play, this, Player_Action_Talk, 0);
this->stateFlags1 |= PLAYER_STATE1_6 | PLAYER_STATE1_29; this->stateFlags1 |= PLAYER_STATE1_TALKING | PLAYER_STATE1_29;
if (this->actor.textId != 0) { if (this->actor.textId != 0) {
Message_StartTextbox(play, this->actor.textId, this->talkActor); Message_StartTextbox(play, this->actor.textId, this->talkActor);
@ -6050,14 +6050,14 @@ s32 Player_ActionHandler_13(Player* this, PlayState* play) {
(this->exchangeItemId == EXCH_ITEM_BOTTLE_BLUE_FIRE))))))) { (this->exchangeItemId == EXCH_ITEM_BOTTLE_BLUE_FIRE))))))) {
if ((play->actorCtx.titleCtx.delayTimer == 0) && (play->actorCtx.titleCtx.alpha == 0)) { if ((play->actorCtx.titleCtx.delayTimer == 0) && (play->actorCtx.titleCtx.alpha == 0)) {
Player_SetupActionPreserveItemAction(play, this, Player_Action_8084F104, 0); Player_SetupActionPreserveItemAction(play, this, Player_Action_ExchangeItem, 0);
if (sp2C >= 0) { if (sp2C >= 0) {
giEntry = &sGetItemTable[D_80854528[sp2C] - 1]; giEntry = &sGetItemTable[D_80854528[sp2C] - 1];
func_8083AE40(this, giEntry->objectId); func_8083AE40(this, giEntry->objectId);
} }
this->stateFlags1 |= PLAYER_STATE1_6 | PLAYER_STATE1_28 | PLAYER_STATE1_29; this->stateFlags1 |= PLAYER_STATE1_TALKING | PLAYER_STATE1_28 | PLAYER_STATE1_29;
if (sp2C >= 0) { if (sp2C >= 0) {
sp2C = sp2C + 1; sp2C = sp2C + 1;
@ -6255,7 +6255,7 @@ s32 Player_ActionHandler_Talk(Player* this, PlayState* play) {
// This is especially important to prevent unwanted behavior with regards to mask trading. // This is especially important to prevent unwanted behavior with regards to mask trading.
this->currentMask = sSavedCurrentMask; this->currentMask = sSavedCurrentMask;
func_80853148(play, talkOfferActor); Player_StartTalking(play, talkOfferActor);
return true; return true;
} }
@ -10653,7 +10653,7 @@ void Player_Init(Actor* thisx, PlayState* play2) {
play->tryPlayerCsAction = Player_TryCsAction; play->tryPlayerCsAction = Player_TryCsAction;
play->func_11D54 = func_80853080; play->func_11D54 = func_80853080;
play->damagePlayer = Player_InflictDamage; play->damagePlayer = Player_InflictDamage;
play->talkWithPlayer = func_80853148; play->talkWithPlayer = Player_StartTalking;
thisx->room = -1; thisx->room = -1;
this->ageProperties = &sAgeProperties[gSaveContext.save.linkAge]; this->ageProperties = &sAgeProperties[gSaveContext.save.linkAge];
@ -11628,8 +11628,8 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) {
this->unk_A73--; this->unk_A73--;
} }
if (this->unk_88E != 0) { if (this->textboxBtnCooldownTimer != 0) {
this->unk_88E--; this->textboxBtnCooldownTimer--;
} }
if (this->unk_A87 != 0) { if (this->unk_A87 != 0) {
@ -12069,7 +12069,9 @@ void Player_Update(Actor* thisx, PlayState* play) {
} else { } else {
input = play->state.input[0]; input = play->state.input[0];
if (this->unk_88E != 0) { if (this->textboxBtnCooldownTimer != 0) {
// Prevent the usage of A/B/C-up.
// Helps avoid accidental inputs when mashing to close the final textbox.
input.cur.button &= ~(BTN_A | BTN_B | BTN_CUP); input.cur.button &= ~(BTN_A | BTN_B | BTN_CUP);
input.press.button &= ~(BTN_A | BTN_B | BTN_CUP); input.press.button &= ~(BTN_A | BTN_B | BTN_CUP);
} }
@ -12480,8 +12482,9 @@ s32 func_8084B4D4(PlayState* play, Player* this) {
return 0; return 0;
} }
void Player_Action_8084B530(Player* this, PlayState* play) { void Player_Action_Talk(Player* this, PlayState* play) {
this->stateFlags2 |= PLAYER_STATE2_5; this->stateFlags2 |= PLAYER_STATE2_5;
Player_UpdateUpperBody(this, play); Player_UpdateUpperBody(this, play);
if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) {
@ -12507,7 +12510,7 @@ void Player_Action_8084B530(Player* this, PlayState* play) {
} }
} }
this->unk_88E = 10; this->textboxBtnCooldownTimer = 10;
return; return;
} }
@ -12518,6 +12521,7 @@ void Player_Action_8084B530(Player* this, PlayState* play) {
} else if (!Player_CheckHostileLockOn(this) && LinkAnimation_Update(play, &this->skelAnime)) { } else if (!Player_CheckHostileLockOn(this) && LinkAnimation_Update(play, &this->skelAnime)) {
if (this->skelAnime.movementFlags != 0) { if (this->skelAnime.movementFlags != 0) {
Player_FinishAnimMovement(this); Player_FinishAnimMovement(this);
if ((this->talkActor->category == ACTORCAT_NPC) && (this->heldItemAction != PLAYER_IA_FISHING_POLE)) { if ((this->talkActor->category == ACTORCAT_NPC) && (this->heldItemAction != PLAYER_IA_FISHING_POLE)) {
Player_AnimPlayOnceAdjusted(play, this, &gPlayerAnim_link_normal_talk_free); Player_AnimPlayOnceAdjusted(play, this, &gPlayerAnim_link_normal_talk_free);
} else { } else {
@ -13205,7 +13209,7 @@ void Player_Action_8084CC98(Player* this, PlayState* play) {
} }
if (this->av2.actionVar2 == 1) { if (this->av2.actionVar2 == 1) {
if (sUpperBodyIsBusy || func_8083224C(play)) { if (sUpperBodyIsBusy || Player_IsTalking(play)) {
Player_AnimPlayOnce(play, this, &gPlayerAnim_link_uma_wait_3); Player_AnimPlayOnce(play, this, &gPlayerAnim_link_uma_wait_3);
} else if (LinkAnimation_Update(play, &this->skelAnime)) { } else if (LinkAnimation_Update(play, &this->skelAnime)) {
this->av2.actionVar2 = 99; this->av2.actionVar2 = 99;
@ -13240,7 +13244,7 @@ void Player_Action_8084CC98(Player* this, PlayState* play) {
this->yaw = this->actor.shape.rot.y = rideActor->actor.shape.rot.y; this->yaw = this->actor.shape.rot.y = rideActor->actor.shape.rot.y;
if ((this->csAction != PLAYER_CSACTION_NONE) || if ((this->csAction != PLAYER_CSACTION_NONE) ||
(!func_8083224C(play) && ((rideActor->actor.speed != 0.0f) || !Player_ActionHandler_Talk(this, play)) && (!Player_IsTalking(play) && ((rideActor->actor.speed != 0.0f) || !Player_ActionHandler_Talk(this, play)) &&
!Player_ActionHandler_Roll(this, play))) { !Player_ActionHandler_Roll(this, play))) {
if (!sUpperBodyIsBusy) { if (!sUpperBodyIsBusy) {
if (this->av1.actionVar1 != 0) { if (this->av1.actionVar1 != 0) {
@ -13380,7 +13384,7 @@ void Player_Action_8084D610(Player* this, PlayState* play) {
func_80832CB0(play, this, &gPlayerAnim_link_swimer_swim_wait); func_80832CB0(play, this, &gPlayerAnim_link_swimer_swim_wait);
func_8084B000(this); func_8084B000(this);
if (!func_8083224C(play) && !Player_TryActionHandlerList(play, this, sActionHandlerList11, true) && if (!Player_IsTalking(play) && !Player_TryActionHandlerList(play, this, sActionHandlerList11, true) &&
!func_8083D12C(play, this, sControlInput)) { !func_8083D12C(play, this, sControlInput)) {
f32 speedTarget; f32 speedTarget;
s16 yawTarget; s16 yawTarget;
@ -13727,11 +13731,11 @@ void Player_Action_8084E3C4(Player* this, PlayState* play) {
Camera_SetFinishedFlag(Play_GetCamera(play, CAM_ID_MAIN)); Camera_SetFinishedFlag(Play_GetCamera(play, CAM_ID_MAIN));
if ((this->talkActor != NULL) && (this->talkActor == this->unk_6A8)) { if ((this->talkActor != NULL) && (this->talkActor == this->unk_6A8)) {
func_80853148(play, this->talkActor); Player_StartTalking(play, this->talkActor);
} else if (this->naviTextId < 0) { } else if (this->naviTextId < 0) {
this->talkActor = this->naviActor; this->talkActor = this->naviActor;
this->naviActor->textId = -this->naviTextId; this->naviActor->textId = -this->naviTextId;
func_80853148(play, this->talkActor); Player_StartTalking(play, this->talkActor);
} else if (!Player_ActionHandler_13(this, play)) { } else if (!Player_ActionHandler_13(this, play)) {
func_8083A098(this, &gPlayerAnim_link_normal_okarina_end, play); func_8083A098(this, &gPlayerAnim_link_normal_okarina_end, play);
} }
@ -13804,7 +13808,7 @@ void Player_Action_8084E6D4(Player* this, PlayState* play) {
this->exchangeItemId = EXCH_ITEM_NONE; this->exchangeItemId = EXCH_ITEM_NONE;
if (func_8084B4D4(play, this) == 0) { if (func_8084B4D4(play, this) == 0) {
func_80853148(play, this->talkActor); Player_StartTalking(play, this->talkActor);
} }
} else { } else {
func_8084DFAC(play, this); func_8084DFAC(play, this);
@ -14085,7 +14089,7 @@ static AnimSfxEntry D_80854A3C[] = {
{ NA_SE_PL_PUT_OUT_ITEM, -ANIMSFX_DATA(ANIMSFX_TYPE_GENERAL, 30) }, { NA_SE_PL_PUT_OUT_ITEM, -ANIMSFX_DATA(ANIMSFX_TYPE_GENERAL, 30) },
}; };
void Player_Action_8084F104(Player* this, PlayState* play) { void Player_Action_ExchangeItem(Player* this, PlayState* play) {
this->stateFlags2 |= PLAYER_STATE2_5; this->stateFlags2 |= PLAYER_STATE2_5;
if (LinkAnimation_Update(play, &this->skelAnime)) { if (LinkAnimation_Update(play, &this->skelAnime)) {
@ -14099,7 +14103,7 @@ void Player_Action_8084F104(Player* this, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_TALK; this->actor.flags |= ACTOR_FLAG_TALK;
} }
func_80853148(play, talkActor); Player_StartTalking(play, talkActor);
} else { } else {
GetItemEntry* giEntry = &sGetItemTable[D_80854528[this->exchangeItemId - 1] - 1]; GetItemEntry* giEntry = &sGetItemTable[D_80854528[this->exchangeItemId - 1] - 1];
@ -16024,8 +16028,13 @@ s32 Player_InflictDamage(PlayState* play, s32 damage) {
return 0; return 0;
} }
// Start talking with the given actor /**
void func_80853148(PlayState* play, Actor* actor) { * Start talking to the specified actor.
*
* This function does not concern trading exchange items.
* For item exchanges see relevant code in `Player_ActionChange_13` and `Player_Action_ExchangeItem`.
*/
void Player_StartTalking(PlayState* play, Actor* actor) {
Player* this = GET_PLAYER(play); Player* this = GET_PLAYER(play);
s32 pad; s32 pad;
@ -16038,6 +16047,8 @@ void func_80853148(PlayState* play, Actor* actor) {
this->exchangeItemId = EXCH_ITEM_NONE; this->exchangeItemId = EXCH_ITEM_NONE;
if (actor->textId == 0xFFFF) { if (actor->textId == 0xFFFF) {
// Player will stand and look at the actor with no text appearing.
// This can be used to delay text from appearing, for example.
Player_SetCsActionWithHaltedActors(play, actor, PLAYER_CSACTION_1); Player_SetCsActionWithHaltedActors(play, actor, PLAYER_CSACTION_1);
actor->flags |= ACTOR_FLAG_TALK; actor->flags |= ACTOR_FLAG_TALK;
Player_PutAwayHeldItem(play, this); Player_PutAwayHeldItem(play, this);
@ -16053,15 +16064,15 @@ void func_80853148(PlayState* play, Actor* actor) {
s32 sp24 = this->av2.actionVar2; s32 sp24 = this->av2.actionVar2;
Player_PutAwayHeldItem(play, this); Player_PutAwayHeldItem(play, this);
func_8083A2F8(play, this); Player_SetupTalk(play, this);
this->av2.actionVar2 = sp24; this->av2.actionVar2 = sp24;
} else { } else {
if (func_808332B8(this)) { if (func_808332B8(this)) {
Player_SetupWaitForPutAway(play, this, func_8083A2F8); Player_SetupWaitForPutAway(play, this, Player_SetupTalk);
Player_AnimChangeLoopSlowMorph(play, this, &gPlayerAnim_link_swimer_swim_wait); Player_AnimChangeLoopSlowMorph(play, this, &gPlayerAnim_link_swimer_swim_wait);
} else if ((actor->category != ACTORCAT_NPC) || (this->heldItemAction == PLAYER_IA_FISHING_POLE)) { } else if ((actor->category != ACTORCAT_NPC) || (this->heldItemAction == PLAYER_IA_FISHING_POLE)) {
func_8083A2F8(play, this); Player_SetupTalk(play, this);
if (!Player_CheckHostileLockOn(this)) { if (!Player_CheckHostileLockOn(this)) {
if ((actor != this->naviActor) && (actor->xzDistToPlayer < 40.0f)) { if ((actor != this->naviActor) && (actor->xzDistToPlayer < 40.0f)) {
@ -16071,7 +16082,7 @@ void func_80853148(PlayState* play, Actor* actor) {
} }
} }
} else { } else {
Player_SetupWaitForPutAway(play, this, func_8083A2F8); Player_SetupWaitForPutAway(play, this, Player_SetupTalk);
Player_AnimPlayOnceAdjusted(play, this, Player_AnimPlayOnceAdjusted(play, this,
(actor->xzDistToPlayer < 40.0f) ? &gPlayerAnim_link_normal_backspace (actor->xzDistToPlayer < 40.0f) ? &gPlayerAnim_link_normal_backspace
: &gPlayerAnim_link_normal_talk_free); : &gPlayerAnim_link_normal_talk_free);
@ -16085,7 +16096,7 @@ void func_80853148(PlayState* play, Actor* actor) {
func_80832224(this); func_80832224(this);
} }
this->stateFlags1 |= PLAYER_STATE1_6 | PLAYER_STATE1_29; this->stateFlags1 |= PLAYER_STATE1_TALKING | PLAYER_STATE1_29;
} }
if ((this->naviActor == this->talkActor) && ((this->talkActor->textId & 0xFF00) != 0x200)) { if ((this->naviActor == this->talkActor) && ((this->talkActor->textId & 0xFF00) != 0x200)) {