1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2024-12-29 00:06:33 +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_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_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_START_CHANGING_HELD_ITEM (1 << 8) // Item change process has begun
#define PLAYER_STATE1_9 (1 << 9)
@ -903,7 +903,7 @@ typedef struct Player {
/* 0x0888 */ f32 distToInteractWall; // xyz distance to the interact wall
/* 0x088C */ u8 ledgeClimbType;
/* 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
/* 0x0890 */ u8 unk_890;
/* 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);
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);
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] = {
// ACTORCAT_SWITCH
PLAYER_STATE1_6 | PLAYER_STATE1_DEAD | PLAYER_STATE1_28,
PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_28,
// ACTORCAT_BG
PLAYER_STATE1_6 | PLAYER_STATE1_DEAD | PLAYER_STATE1_28,
PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_28,
// ACTORCAT_PLAYER
0,
// 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
PLAYER_STATE1_DEAD,
// 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
PLAYER_STATE1_DEAD | PLAYER_STATE1_28,
// ACTORCAT_ITEMACTION
0,
// 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
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
0,
// 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) {
@ -2381,7 +2381,7 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) {
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;
}

View file

@ -289,7 +289,7 @@ void BgHakaSgami_Update(Actor* thisx, PlayState* play) {
BgHakaSgami* this = (BgHakaSgami*)thisx;
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(this, play);
}

View file

@ -200,7 +200,7 @@ void BgJyaGoroiwa_Update(Actor* thisx, PlayState* play) {
s32 bgId;
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);
BgJyaGoroiwa_UpdateRotation(this);
checkPos.x = this->actor.world.pos.x;

View file

@ -915,7 +915,7 @@ void DoorShutter_Update(Actor* thisx, PlayState* play) {
DoorShutter* this = (DoorShutter*)thisx;
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(this, play);
}

View file

@ -739,7 +739,7 @@ void EnGoroiwa_Update(Actor* thisx, PlayState* play) {
s32 pad;
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) {
this->collisionDisabledTimer--;
}

View file

@ -147,7 +147,7 @@ void EnNutsball_Update(Actor* thisx, PlayState* play) {
Player* player = GET_PLAYER(play);
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(this, play);

View file

@ -578,7 +578,7 @@ void EnOkuta_Update(Actor* thisx, PlayState* play2) {
Vec3f prevPos;
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) {
EnOkuta_ColliderCheck(this, play);
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);
void func_80853080(Player* this, PlayState* play);
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_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_80846578(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_8084B898(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_8084EED8(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_8084F608(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;
}
s32 func_8083224C(PlayState* play) {
s32 Player_IsTalking(PlayState* play) {
Player* this = GET_PLAYER(play);
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);
this->stateFlags1 &= ~(PLAYER_STATE1_2 | PLAYER_STATE1_6 | PLAYER_STATE1_26 | PLAYER_STATE1_28 | PLAYER_STATE1_29 |
PLAYER_STATE1_31);
this->stateFlags1 &= ~(PLAYER_STATE1_2 | PLAYER_STATE1_TALKING | PLAYER_STATE1_26 | PLAYER_STATE1_28 |
PLAYER_STATE1_29 | PLAYER_STATE1_31);
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);
@ -3914,7 +3914,7 @@ void Player_UpdateZTargeting(Player* this, PlayState* play) {
ignoreLeash = true;
}
isTalking = func_8083224C(play);
isTalking = Player_IsTalking(play);
if (isTalking || (this->zTargetActiveTimer != 0) ||
(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) {
doorActor->textId = 0xD0;
func_80853148(play, doorActor);
Player_StartTalking(play, doorActor);
return 0;
}
@ -5641,10 +5641,10 @@ void func_8083A0F4(PlayState* play, Player* this) {
}
}
void func_8083A2F8(PlayState* play, Player* this) {
Player_SetupActionPreserveAnimMovement(play, this, Player_Action_8084B530, 0);
void Player_SetupTalk(PlayState* play, Player* this) {
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) {
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))))))) {
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) {
giEntry = &sGetItemTable[D_80854528[sp2C] - 1];
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) {
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->currentMask = sSavedCurrentMask;
func_80853148(play, talkOfferActor);
Player_StartTalking(play, talkOfferActor);
return true;
}
@ -10653,7 +10653,7 @@ void Player_Init(Actor* thisx, PlayState* play2) {
play->tryPlayerCsAction = Player_TryCsAction;
play->func_11D54 = func_80853080;
play->damagePlayer = Player_InflictDamage;
play->talkWithPlayer = func_80853148;
play->talkWithPlayer = Player_StartTalking;
thisx->room = -1;
this->ageProperties = &sAgeProperties[gSaveContext.save.linkAge];
@ -11628,8 +11628,8 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) {
this->unk_A73--;
}
if (this->unk_88E != 0) {
this->unk_88E--;
if (this->textboxBtnCooldownTimer != 0) {
this->textboxBtnCooldownTimer--;
}
if (this->unk_A87 != 0) {
@ -12069,7 +12069,9 @@ void Player_Update(Actor* thisx, PlayState* play) {
} else {
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.press.button &= ~(BTN_A | BTN_B | BTN_CUP);
}
@ -12480,8 +12482,9 @@ s32 func_8084B4D4(PlayState* play, Player* this) {
return 0;
}
void Player_Action_8084B530(Player* this, PlayState* play) {
void Player_Action_Talk(Player* this, PlayState* play) {
this->stateFlags2 |= PLAYER_STATE2_5;
Player_UpdateUpperBody(this, play);
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;
}
@ -12518,6 +12521,7 @@ void Player_Action_8084B530(Player* this, PlayState* play) {
} else if (!Player_CheckHostileLockOn(this) && LinkAnimation_Update(play, &this->skelAnime)) {
if (this->skelAnime.movementFlags != 0) {
Player_FinishAnimMovement(this);
if ((this->talkActor->category == ACTORCAT_NPC) && (this->heldItemAction != PLAYER_IA_FISHING_POLE)) {
Player_AnimPlayOnceAdjusted(play, this, &gPlayerAnim_link_normal_talk_free);
} else {
@ -13205,7 +13209,7 @@ void Player_Action_8084CC98(Player* this, PlayState* play) {
}
if (this->av2.actionVar2 == 1) {
if (sUpperBodyIsBusy || func_8083224C(play)) {
if (sUpperBodyIsBusy || Player_IsTalking(play)) {
Player_AnimPlayOnce(play, this, &gPlayerAnim_link_uma_wait_3);
} else if (LinkAnimation_Update(play, &this->skelAnime)) {
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;
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))) {
if (!sUpperBodyIsBusy) {
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_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)) {
f32 speedTarget;
s16 yawTarget;
@ -13727,11 +13731,11 @@ void Player_Action_8084E3C4(Player* this, PlayState* play) {
Camera_SetFinishedFlag(Play_GetCamera(play, CAM_ID_MAIN));
if ((this->talkActor != NULL) && (this->talkActor == this->unk_6A8)) {
func_80853148(play, this->talkActor);
Player_StartTalking(play, this->talkActor);
} else if (this->naviTextId < 0) {
this->talkActor = this->naviActor;
this->naviActor->textId = -this->naviTextId;
func_80853148(play, this->talkActor);
Player_StartTalking(play, this->talkActor);
} else if (!Player_ActionHandler_13(this, 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;
if (func_8084B4D4(play, this) == 0) {
func_80853148(play, this->talkActor);
Player_StartTalking(play, this->talkActor);
}
} else {
func_8084DFAC(play, this);
@ -14085,7 +14089,7 @@ static AnimSfxEntry D_80854A3C[] = {
{ 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;
if (LinkAnimation_Update(play, &this->skelAnime)) {
@ -14099,7 +14103,7 @@ void Player_Action_8084F104(Player* this, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_TALK;
}
func_80853148(play, talkActor);
Player_StartTalking(play, talkActor);
} else {
GetItemEntry* giEntry = &sGetItemTable[D_80854528[this->exchangeItemId - 1] - 1];
@ -16024,8 +16028,13 @@ s32 Player_InflictDamage(PlayState* play, s32 damage) {
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);
s32 pad;
@ -16038,6 +16047,8 @@ void func_80853148(PlayState* play, Actor* actor) {
this->exchangeItemId = EXCH_ITEM_NONE;
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);
actor->flags |= ACTOR_FLAG_TALK;
Player_PutAwayHeldItem(play, this);
@ -16053,15 +16064,15 @@ void func_80853148(PlayState* play, Actor* actor) {
s32 sp24 = this->av2.actionVar2;
Player_PutAwayHeldItem(play, this);
func_8083A2F8(play, this);
Player_SetupTalk(play, this);
this->av2.actionVar2 = sp24;
} else {
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);
} 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 ((actor != this->naviActor) && (actor->xzDistToPlayer < 40.0f)) {
@ -16071,7 +16082,7 @@ void func_80853148(PlayState* play, Actor* actor) {
}
}
} else {
Player_SetupWaitForPutAway(play, this, func_8083A2F8);
Player_SetupWaitForPutAway(play, this, Player_SetupTalk);
Player_AnimPlayOnceAdjusted(play, this,
(actor->xzDistToPlayer < 40.0f) ? &gPlayerAnim_link_normal_backspace
: &gPlayerAnim_link_normal_talk_free);
@ -16085,7 +16096,7 @@ void func_80853148(PlayState* play, Actor* actor) {
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)) {