mirror of
https://github.com/zeldaret/oot.git
synced 2025-07-04 23:14:37 +00:00
Player: Player_ActionHandler_Talk
(#2226)
* document Player_ActionHandler_Talk * format * comment tweak * review * capitalization
This commit is contained in:
parent
0acaed6d17
commit
9da16a8fd8
2 changed files with 118 additions and 89 deletions
|
@ -697,7 +697,7 @@ typedef struct WeaponInfo {
|
||||||
#define PLAYER_STATE1_31 (1 << 31)
|
#define PLAYER_STATE1_31 (1 << 31)
|
||||||
|
|
||||||
#define PLAYER_STATE2_0 (1 << 0)
|
#define PLAYER_STATE2_0 (1 << 0)
|
||||||
#define PLAYER_STATE2_1 (1 << 1)
|
#define PLAYER_STATE2_CAN_ACCEPT_TALK_OFFER (1 << 1) // Can accept a talk offer. "Speak" or "Check" is shown on the A button.
|
||||||
#define PLAYER_STATE2_2 (1 << 2)
|
#define PLAYER_STATE2_2 (1 << 2)
|
||||||
#define PLAYER_STATE2_3 (1 << 3)
|
#define PLAYER_STATE2_3 (1 << 3)
|
||||||
#define PLAYER_STATE2_4 (1 << 4)
|
#define PLAYER_STATE2_4 (1 << 4)
|
||||||
|
|
|
@ -365,7 +365,7 @@ static s32 D_80858AA0;
|
||||||
#pragma increment_block_number "gc-eu:192 gc-eu-mq:192 gc-jp:192 gc-jp-ce:192 gc-jp-mq:192 gc-us:192 gc-us-mq:192" \
|
#pragma increment_block_number "gc-eu:192 gc-eu-mq:192 gc-jp:192 gc-jp-ce:192 gc-jp-mq:192 gc-us:192 gc-us-mq:192" \
|
||||||
"ntsc-1.2:192"
|
"ntsc-1.2:192"
|
||||||
|
|
||||||
static s32 D_80858AA4;
|
static s32 sSavedCurrentMask;
|
||||||
static Vec3f sInteractWallCheckResult;
|
static Vec3f sInteractWallCheckResult;
|
||||||
static Input* sControlInput;
|
static Input* sControlInput;
|
||||||
|
|
||||||
|
@ -3743,7 +3743,7 @@ void Player_UpdateZTargeting(Player* this, PlayState* play) {
|
||||||
|
|
||||||
this->focusActor = nextLockOnActor;
|
this->focusActor = nextLockOnActor;
|
||||||
this->zTargetActiveTimer = 15;
|
this->zTargetActiveTimer = 15;
|
||||||
this->stateFlags2 &= ~(PLAYER_STATE2_1 | PLAYER_STATE2_21);
|
this->stateFlags2 &= ~(PLAYER_STATE2_CAN_ACCEPT_TALK_OFFER | PLAYER_STATE2_21);
|
||||||
} else {
|
} else {
|
||||||
if (!usingHoldTargeting) {
|
if (!usingHoldTargeting) {
|
||||||
Player_ReleaseLockOn(this);
|
Player_ReleaseLockOn(this);
|
||||||
|
@ -3926,7 +3926,7 @@ typedef enum ActionHandlerIndex {
|
||||||
/* 1 */ PLAYER_ACTION_HANDLER_1,
|
/* 1 */ PLAYER_ACTION_HANDLER_1,
|
||||||
/* 2 */ PLAYER_ACTION_HANDLER_2,
|
/* 2 */ PLAYER_ACTION_HANDLER_2,
|
||||||
/* 3 */ PLAYER_ACTION_HANDLER_3,
|
/* 3 */ PLAYER_ACTION_HANDLER_3,
|
||||||
/* 4 */ PLAYER_ACTION_HANDLER_4,
|
/* 4 */ PLAYER_ACTION_HANDLER_TALK,
|
||||||
/* 5 */ PLAYER_ACTION_HANDLER_5,
|
/* 5 */ PLAYER_ACTION_HANDLER_5,
|
||||||
/* 6 */ PLAYER_ACTION_HANDLER_ROLL,
|
/* 6 */ PLAYER_ACTION_HANDLER_ROLL,
|
||||||
/* 7 */ PLAYER_ACTION_HANDLER_7,
|
/* 7 */ PLAYER_ACTION_HANDLER_7,
|
||||||
|
@ -3939,29 +3939,29 @@ typedef enum ActionHandlerIndex {
|
||||||
} ActionHandlerIndex;
|
} ActionHandlerIndex;
|
||||||
|
|
||||||
static s8 sActionHandlerList1[] = {
|
static s8 sActionHandlerList1[] = {
|
||||||
PLAYER_ACTION_HANDLER_13, PLAYER_ACTION_HANDLER_2, PLAYER_ACTION_HANDLER_4, PLAYER_ACTION_HANDLER_9,
|
PLAYER_ACTION_HANDLER_13, PLAYER_ACTION_HANDLER_2, PLAYER_ACTION_HANDLER_TALK, PLAYER_ACTION_HANDLER_9,
|
||||||
PLAYER_ACTION_HANDLER_10, PLAYER_ACTION_HANDLER_11, PLAYER_ACTION_HANDLER_8, -PLAYER_ACTION_HANDLER_7,
|
PLAYER_ACTION_HANDLER_10, PLAYER_ACTION_HANDLER_11, PLAYER_ACTION_HANDLER_8, -PLAYER_ACTION_HANDLER_7,
|
||||||
};
|
};
|
||||||
|
|
||||||
static s8 sActionHandlerList2[] = {
|
static s8 sActionHandlerList2[] = {
|
||||||
PLAYER_ACTION_HANDLER_13, PLAYER_ACTION_HANDLER_1, PLAYER_ACTION_HANDLER_2, PLAYER_ACTION_HANDLER_5,
|
PLAYER_ACTION_HANDLER_13, PLAYER_ACTION_HANDLER_1, PLAYER_ACTION_HANDLER_2, PLAYER_ACTION_HANDLER_5,
|
||||||
PLAYER_ACTION_HANDLER_3, PLAYER_ACTION_HANDLER_4, PLAYER_ACTION_HANDLER_9, PLAYER_ACTION_HANDLER_10,
|
PLAYER_ACTION_HANDLER_3, PLAYER_ACTION_HANDLER_TALK, PLAYER_ACTION_HANDLER_9, PLAYER_ACTION_HANDLER_10,
|
||||||
PLAYER_ACTION_HANDLER_11, PLAYER_ACTION_HANDLER_7, PLAYER_ACTION_HANDLER_8, -PLAYER_ACTION_HANDLER_ROLL,
|
PLAYER_ACTION_HANDLER_11, PLAYER_ACTION_HANDLER_7, PLAYER_ACTION_HANDLER_8, -PLAYER_ACTION_HANDLER_ROLL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static s8 sActionHandlerList3[] = {
|
static s8 sActionHandlerList3[] = {
|
||||||
PLAYER_ACTION_HANDLER_13, PLAYER_ACTION_HANDLER_1, PLAYER_ACTION_HANDLER_2, PLAYER_ACTION_HANDLER_3,
|
PLAYER_ACTION_HANDLER_13, PLAYER_ACTION_HANDLER_1, PLAYER_ACTION_HANDLER_2, PLAYER_ACTION_HANDLER_3,
|
||||||
PLAYER_ACTION_HANDLER_4, PLAYER_ACTION_HANDLER_9, PLAYER_ACTION_HANDLER_10, PLAYER_ACTION_HANDLER_11,
|
PLAYER_ACTION_HANDLER_TALK, PLAYER_ACTION_HANDLER_9, PLAYER_ACTION_HANDLER_10, PLAYER_ACTION_HANDLER_11,
|
||||||
PLAYER_ACTION_HANDLER_8, PLAYER_ACTION_HANDLER_7, -PLAYER_ACTION_HANDLER_ROLL,
|
PLAYER_ACTION_HANDLER_8, PLAYER_ACTION_HANDLER_7, -PLAYER_ACTION_HANDLER_ROLL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static s8 sActionHandlerList4[] = {
|
static s8 sActionHandlerList4[] = {
|
||||||
PLAYER_ACTION_HANDLER_13, PLAYER_ACTION_HANDLER_2, PLAYER_ACTION_HANDLER_4, PLAYER_ACTION_HANDLER_9,
|
PLAYER_ACTION_HANDLER_13, PLAYER_ACTION_HANDLER_2, PLAYER_ACTION_HANDLER_TALK, PLAYER_ACTION_HANDLER_9,
|
||||||
PLAYER_ACTION_HANDLER_10, PLAYER_ACTION_HANDLER_11, PLAYER_ACTION_HANDLER_8, -PLAYER_ACTION_HANDLER_7,
|
PLAYER_ACTION_HANDLER_10, PLAYER_ACTION_HANDLER_11, PLAYER_ACTION_HANDLER_8, -PLAYER_ACTION_HANDLER_7,
|
||||||
};
|
};
|
||||||
|
|
||||||
static s8 sActionHandlerList5[] = {
|
static s8 sActionHandlerList5[] = {
|
||||||
PLAYER_ACTION_HANDLER_13, PLAYER_ACTION_HANDLER_2, PLAYER_ACTION_HANDLER_4,
|
PLAYER_ACTION_HANDLER_13, PLAYER_ACTION_HANDLER_2, PLAYER_ACTION_HANDLER_TALK,
|
||||||
PLAYER_ACTION_HANDLER_9, PLAYER_ACTION_HANDLER_10, PLAYER_ACTION_HANDLER_11,
|
PLAYER_ACTION_HANDLER_9, PLAYER_ACTION_HANDLER_10, PLAYER_ACTION_HANDLER_11,
|
||||||
PLAYER_ACTION_HANDLER_12, PLAYER_ACTION_HANDLER_8, -PLAYER_ACTION_HANDLER_7,
|
PLAYER_ACTION_HANDLER_12, PLAYER_ACTION_HANDLER_8, -PLAYER_ACTION_HANDLER_7,
|
||||||
};
|
};
|
||||||
|
@ -3972,20 +3972,20 @@ static s8 sActionHandlerList6[] = {
|
||||||
|
|
||||||
static s8 sActionHandlerList7[] = {
|
static s8 sActionHandlerList7[] = {
|
||||||
PLAYER_ACTION_HANDLER_0, PLAYER_ACTION_HANDLER_11, PLAYER_ACTION_HANDLER_1, PLAYER_ACTION_HANDLER_2,
|
PLAYER_ACTION_HANDLER_0, PLAYER_ACTION_HANDLER_11, PLAYER_ACTION_HANDLER_1, PLAYER_ACTION_HANDLER_2,
|
||||||
PLAYER_ACTION_HANDLER_3, PLAYER_ACTION_HANDLER_5, PLAYER_ACTION_HANDLER_4, PLAYER_ACTION_HANDLER_9,
|
PLAYER_ACTION_HANDLER_3, PLAYER_ACTION_HANDLER_5, PLAYER_ACTION_HANDLER_TALK, PLAYER_ACTION_HANDLER_9,
|
||||||
PLAYER_ACTION_HANDLER_8, PLAYER_ACTION_HANDLER_7, -PLAYER_ACTION_HANDLER_ROLL,
|
PLAYER_ACTION_HANDLER_8, PLAYER_ACTION_HANDLER_7, -PLAYER_ACTION_HANDLER_ROLL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static s8 sActionHandlerList8[] = {
|
static s8 sActionHandlerList8[] = {
|
||||||
PLAYER_ACTION_HANDLER_0, PLAYER_ACTION_HANDLER_11, PLAYER_ACTION_HANDLER_1, PLAYER_ACTION_HANDLER_2,
|
PLAYER_ACTION_HANDLER_0, PLAYER_ACTION_HANDLER_11, PLAYER_ACTION_HANDLER_1, PLAYER_ACTION_HANDLER_2,
|
||||||
PLAYER_ACTION_HANDLER_3, PLAYER_ACTION_HANDLER_12, PLAYER_ACTION_HANDLER_5, PLAYER_ACTION_HANDLER_4,
|
PLAYER_ACTION_HANDLER_3, PLAYER_ACTION_HANDLER_12, PLAYER_ACTION_HANDLER_5, PLAYER_ACTION_HANDLER_TALK,
|
||||||
PLAYER_ACTION_HANDLER_9, PLAYER_ACTION_HANDLER_8, PLAYER_ACTION_HANDLER_7, -PLAYER_ACTION_HANDLER_ROLL,
|
PLAYER_ACTION_HANDLER_9, PLAYER_ACTION_HANDLER_8, PLAYER_ACTION_HANDLER_7, -PLAYER_ACTION_HANDLER_ROLL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static s8 sActionHandlerList9[] = {
|
static s8 sActionHandlerList9[] = {
|
||||||
PLAYER_ACTION_HANDLER_13, PLAYER_ACTION_HANDLER_1, PLAYER_ACTION_HANDLER_2, PLAYER_ACTION_HANDLER_3,
|
PLAYER_ACTION_HANDLER_13, PLAYER_ACTION_HANDLER_1, PLAYER_ACTION_HANDLER_2, PLAYER_ACTION_HANDLER_3,
|
||||||
PLAYER_ACTION_HANDLER_12, PLAYER_ACTION_HANDLER_5, PLAYER_ACTION_HANDLER_4, PLAYER_ACTION_HANDLER_9,
|
PLAYER_ACTION_HANDLER_12, PLAYER_ACTION_HANDLER_5, PLAYER_ACTION_HANDLER_TALK, PLAYER_ACTION_HANDLER_9,
|
||||||
PLAYER_ACTION_HANDLER_10, PLAYER_ACTION_HANDLER_11, PLAYER_ACTION_HANDLER_8, PLAYER_ACTION_HANDLER_7,
|
PLAYER_ACTION_HANDLER_10, PLAYER_ACTION_HANDLER_11, PLAYER_ACTION_HANDLER_8, PLAYER_ACTION_HANDLER_7,
|
||||||
-PLAYER_ACTION_HANDLER_ROLL,
|
-PLAYER_ACTION_HANDLER_ROLL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3999,14 +3999,14 @@ static s8 sActionHandlerList11[] = {
|
||||||
PLAYER_ACTION_HANDLER_0,
|
PLAYER_ACTION_HANDLER_0,
|
||||||
PLAYER_ACTION_HANDLER_12,
|
PLAYER_ACTION_HANDLER_12,
|
||||||
PLAYER_ACTION_HANDLER_5,
|
PLAYER_ACTION_HANDLER_5,
|
||||||
-PLAYER_ACTION_HANDLER_4,
|
-PLAYER_ACTION_HANDLER_TALK,
|
||||||
};
|
};
|
||||||
|
|
||||||
s32 Player_ActionHandler_0(Player* this, PlayState* play);
|
s32 Player_ActionHandler_0(Player* this, PlayState* play);
|
||||||
s32 Player_ActionHandler_1(Player* this, PlayState* play);
|
s32 Player_ActionHandler_1(Player* this, PlayState* play);
|
||||||
s32 Player_ActionHandler_2(Player* this, PlayState* play);
|
s32 Player_ActionHandler_2(Player* this, PlayState* play);
|
||||||
s32 Player_ActionHandler_3(Player* this, PlayState* play);
|
s32 Player_ActionHandler_3(Player* this, PlayState* play);
|
||||||
s32 Player_ActionHandler_4(Player* this, PlayState* play);
|
s32 Player_ActionHandler_Talk(Player* this, PlayState* play);
|
||||||
s32 Player_ActionHandler_5(Player* this, PlayState* play);
|
s32 Player_ActionHandler_5(Player* this, PlayState* play);
|
||||||
s32 Player_ActionHandler_Roll(Player* this, PlayState* play);
|
s32 Player_ActionHandler_Roll(Player* this, PlayState* play);
|
||||||
s32 Player_ActionHandler_7(Player* this, PlayState* play);
|
s32 Player_ActionHandler_7(Player* this, PlayState* play);
|
||||||
|
@ -4022,7 +4022,7 @@ static s32 (*sActionHandlerFuncs[])(Player* this, PlayState* play) = {
|
||||||
Player_ActionHandler_1, // PLAYER_ACTION_HANDLER_1
|
Player_ActionHandler_1, // PLAYER_ACTION_HANDLER_1
|
||||||
Player_ActionHandler_2, // PLAYER_ACTION_HANDLER_2
|
Player_ActionHandler_2, // PLAYER_ACTION_HANDLER_2
|
||||||
Player_ActionHandler_3, // PLAYER_ACTION_HANDLER_3
|
Player_ActionHandler_3, // PLAYER_ACTION_HANDLER_3
|
||||||
Player_ActionHandler_4, // PLAYER_ACTION_HANDLER_4
|
Player_ActionHandler_Talk, // PLAYER_ACTION_HANDLER_TALK
|
||||||
Player_ActionHandler_5, // PLAYER_ACTION_HANDLER_5
|
Player_ActionHandler_5, // PLAYER_ACTION_HANDLER_5
|
||||||
Player_ActionHandler_Roll, // PLAYER_ACTION_HANDLER_ROLL
|
Player_ActionHandler_Roll, // PLAYER_ACTION_HANDLER_ROLL
|
||||||
Player_ActionHandler_7, // PLAYER_ACTION_HANDLER_7
|
Player_ActionHandler_7, // PLAYER_ACTION_HANDLER_7
|
||||||
|
@ -5941,76 +5941,105 @@ s32 Player_ActionHandler_13(Player* this, PlayState* play) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 Player_ActionHandler_4(Player* this, PlayState* play) {
|
s32 Player_ActionHandler_Talk(Player* this, PlayState* play) {
|
||||||
Actor* sp34 = this->talkActor;
|
Actor* talkOfferActor = this->talkActor;
|
||||||
Actor* sp30 = this->focusActor;
|
Actor* lockOnActor = this->focusActor;
|
||||||
Actor* sp2C = NULL;
|
Actor* cUpTalkActor = NULL;
|
||||||
s32 sp28 = 0;
|
s32 forceTalkToNavi = false;
|
||||||
s32 sp24;
|
s32 canTalkToLockOnWithCUp;
|
||||||
|
|
||||||
sp24 = (sp30 != NULL) && (CHECK_FLAG_ALL(sp30->flags, ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_18) ||
|
canTalkToLockOnWithCUp =
|
||||||
(sp30->naviEnemyId != NAVI_ENEMY_NONE));
|
(lockOnActor != NULL) && (CHECK_FLAG_ALL(lockOnActor->flags, ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_18) ||
|
||||||
|
(lockOnActor->naviEnemyId != NAVI_ENEMY_NONE));
|
||||||
|
|
||||||
if (sp24 || (this->naviTextId != 0)) {
|
if (canTalkToLockOnWithCUp || (this->naviTextId != 0)) {
|
||||||
sp28 = (this->naviTextId < 0) && ((ABS(this->naviTextId) & 0xFF00) != 0x200);
|
// If `naviTextId` is negative and outside the 0x2XX range, talk to Navi instantly
|
||||||
if (sp28 || !sp24) {
|
forceTalkToNavi = (this->naviTextId < 0) && ((ABS(this->naviTextId) & 0xFF00) != 0x200);
|
||||||
sp2C = this->naviActor;
|
|
||||||
if (sp28) {
|
if (forceTalkToNavi || !canTalkToLockOnWithCUp) {
|
||||||
sp30 = NULL;
|
// If `lockOnActor` can't be talked to with c-up, the only option left is Navi
|
||||||
sp34 = NULL;
|
cUpTalkActor = this->naviActor;
|
||||||
|
|
||||||
|
if (forceTalkToNavi) {
|
||||||
|
// Clearing these pointers guarantees that `cUpTalkActor` will take priority
|
||||||
|
lockOnActor = NULL;
|
||||||
|
talkOfferActor = NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
sp2C = sp30;
|
// Navi is not the talk actor, so the only option left for talking with c-up is `lockOnActor`
|
||||||
|
// (though, `lockOnActor` may be NULL at this point).
|
||||||
|
cUpTalkActor = lockOnActor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((sp34 != NULL) || (sp2C != NULL)) {
|
if ((talkOfferActor != NULL) || (cUpTalkActor != NULL)) {
|
||||||
if ((sp30 == NULL) || (sp30 == sp34) || (sp30 == sp2C)) {
|
if ((lockOnActor != NULL) && (lockOnActor != talkOfferActor) && (lockOnActor != cUpTalkActor)) {
|
||||||
if (!(this->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) ||
|
goto dont_talk;
|
||||||
((this->heldActor != NULL) && (sp28 || (sp34 == this->heldActor) || (sp2C == this->heldActor) ||
|
}
|
||||||
((sp34 != NULL) && (sp34->flags & ACTOR_FLAG_16))))) {
|
|
||||||
if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->stateFlags1 & PLAYER_STATE1_23) ||
|
|
||||||
(func_808332B8(this) && !(this->stateFlags2 & PLAYER_STATE2_10))) {
|
|
||||||
|
|
||||||
if (sp34 != NULL) {
|
if (this->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) {
|
||||||
this->stateFlags2 |= PLAYER_STATE2_1;
|
if ((this->heldActor == NULL) ||
|
||||||
if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A) || (sp34->flags & ACTOR_FLAG_16)) {
|
(!forceTalkToNavi && (talkOfferActor != this->heldActor) && (cUpTalkActor != this->heldActor) &&
|
||||||
sp2C = NULL;
|
((talkOfferActor == NULL) || !(talkOfferActor->flags & ACTOR_FLAG_16)))) {
|
||||||
} else if (sp2C == NULL) {
|
goto dont_talk;
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sp2C != NULL) {
|
|
||||||
if (!sp28) {
|
|
||||||
this->stateFlags2 |= PLAYER_STATE2_21;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!CHECK_BTN_ALL(sControlInput->press.button, BTN_CUP) && !sp28) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
sp34 = sp2C;
|
|
||||||
this->talkActor = NULL;
|
|
||||||
|
|
||||||
if (sp28 || !sp24) {
|
|
||||||
sp2C->textId = ABS(this->naviTextId);
|
|
||||||
} else {
|
|
||||||
if (sp2C->naviEnemyId != NAVI_ENEMY_NONE) {
|
|
||||||
sp2C->textId = sp2C->naviEnemyId + 0x600;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this->currentMask = D_80858AA4;
|
|
||||||
func_80853148(play, sp34);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
|
||||||
|
if (!(this->stateFlags1 & PLAYER_STATE1_23) &&
|
||||||
|
!(func_808332B8(this) && !(this->stateFlags2 & PLAYER_STATE2_10))) {
|
||||||
|
goto dont_talk;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (talkOfferActor != NULL) {
|
||||||
|
// At this point the talk offer can be accepted.
|
||||||
|
// "Speak" or "Check" will appear on the A button in the HUD.
|
||||||
|
this->stateFlags2 |= PLAYER_STATE2_CAN_ACCEPT_TALK_OFFER;
|
||||||
|
|
||||||
|
if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A) || (talkOfferActor->flags & ACTOR_FLAG_16)) {
|
||||||
|
// Clearing `cUpTalkActor` guarantees that `talkOfferActor` is the actor that will be spoken to
|
||||||
|
cUpTalkActor = NULL;
|
||||||
|
} else if (cUpTalkActor == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cUpTalkActor != NULL) {
|
||||||
|
if (!forceTalkToNavi) {
|
||||||
|
this->stateFlags2 |= PLAYER_STATE2_21;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!CHECK_BTN_ALL(sControlInput->press.button, BTN_CUP) && !forceTalkToNavi) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
talkOfferActor = cUpTalkActor;
|
||||||
|
this->talkActor = NULL;
|
||||||
|
|
||||||
|
if (forceTalkToNavi || !canTalkToLockOnWithCUp) {
|
||||||
|
cUpTalkActor->textId = ABS(this->naviTextId);
|
||||||
|
} else if (cUpTalkActor->naviEnemyId != NAVI_ENEMY_NONE) {
|
||||||
|
cUpTalkActor->textId = cUpTalkActor->naviEnemyId + 0x600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// `sSavedCurrentMask` saves the current mask just before the current action runs on this frame.
|
||||||
|
// This saved mask value is then restored just before starting a conversation.
|
||||||
|
//
|
||||||
|
// This handles an edge case where a conversation is started on the same frame that a mask was taken on or off.
|
||||||
|
// Because Player updates early before most actors, the text ID being offered comes from the previous frame.
|
||||||
|
// If a mask was taken on or off the same frame this function runs, the wrong text will be used.
|
||||||
|
// This is especially important to prevent unwanted behavior with regards to mask trading.
|
||||||
|
this->currentMask = sSavedCurrentMask;
|
||||||
|
|
||||||
|
func_80853148(play, talkOfferActor);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
dont_talk:
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 func_8083B8F4(Player* this, PlayState* play) {
|
s32 func_8083B8F4(Player* this, PlayState* play) {
|
||||||
|
@ -8617,7 +8646,7 @@ s32 func_808428D8(Player* this, PlayState* play) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int func_80842964(Player* this, PlayState* play) {
|
int func_80842964(Player* this, PlayState* play) {
|
||||||
return Player_ActionHandler_13(this, play) || Player_ActionHandler_4(this, play) ||
|
return Player_ActionHandler_13(this, play) || Player_ActionHandler_Talk(this, play) ||
|
||||||
Player_ActionHandler_2(this, play);
|
Player_ActionHandler_2(this, play);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9898,7 +9927,7 @@ void Player_Action_80845CA4(Player* this, PlayState* play) {
|
||||||
Camera_SetFinishedFlag(Play_GetCamera(play, CAM_ID_MAIN));
|
Camera_SetFinishedFlag(Play_GetCamera(play, CAM_ID_MAIN));
|
||||||
func_80845C68(play, gSaveContext.respawn[RESPAWN_MODE_DOWN].data);
|
func_80845C68(play, gSaveContext.respawn[RESPAWN_MODE_DOWN].data);
|
||||||
|
|
||||||
if (!Player_ActionHandler_4(this, play)) {
|
if (!Player_ActionHandler_Talk(this, play)) {
|
||||||
func_8083CF5C(this, play);
|
func_8083CF5C(this, play);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10528,7 +10557,7 @@ void Player_UpdateInterface(PlayState* play, Player* this) {
|
||||||
doAction = DO_ACTION_CLIMB;
|
doAction = DO_ACTION_CLIMB;
|
||||||
} else if ((this->stateFlags1 & PLAYER_STATE1_23) && !EN_HORSE_CHECK_4((EnHorse*)this->rideActor) &&
|
} else if ((this->stateFlags1 & PLAYER_STATE1_23) && !EN_HORSE_CHECK_4((EnHorse*)this->rideActor) &&
|
||||||
(Player_Action_8084D3E4 != this->actionFunc)) {
|
(Player_Action_8084D3E4 != this->actionFunc)) {
|
||||||
if ((this->stateFlags2 & PLAYER_STATE2_1) && (this->talkActor != NULL)) {
|
if ((this->stateFlags2 & PLAYER_STATE2_CAN_ACCEPT_TALK_OFFER) && (this->talkActor != NULL)) {
|
||||||
if (this->talkActor->category == ACTORCAT_NPC) {
|
if (this->talkActor->category == ACTORCAT_NPC) {
|
||||||
doAction = DO_ACTION_SPEAK;
|
doAction = DO_ACTION_SPEAK;
|
||||||
} else {
|
} else {
|
||||||
|
@ -10537,7 +10566,7 @@ void Player_UpdateInterface(PlayState* play, Player* this) {
|
||||||
} else if (!func_8002DD78(this) && !(this->stateFlags1 & PLAYER_STATE1_20)) {
|
} else if (!func_8002DD78(this) && !(this->stateFlags1 & PLAYER_STATE1_20)) {
|
||||||
doAction = DO_ACTION_FASTER;
|
doAction = DO_ACTION_FASTER;
|
||||||
}
|
}
|
||||||
} else if ((this->stateFlags2 & PLAYER_STATE2_1) && (this->talkActor != NULL)) {
|
} else if ((this->stateFlags2 & PLAYER_STATE2_CAN_ACCEPT_TALK_OFFER) && (this->talkActor != NULL)) {
|
||||||
if (this->talkActor->category == ACTORCAT_NPC) {
|
if (this->talkActor->category == ACTORCAT_NPC) {
|
||||||
doAction = DO_ACTION_SPEAK;
|
doAction = DO_ACTION_SPEAK;
|
||||||
} else {
|
} else {
|
||||||
|
@ -11557,7 +11586,7 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) {
|
||||||
func_8083D6EC(play, this);
|
func_8083D6EC(play, this);
|
||||||
|
|
||||||
if ((this->focusActor == NULL) && (this->naviTextId == 0)) {
|
if ((this->focusActor == NULL) && (this->naviTextId == 0)) {
|
||||||
this->stateFlags2 &= ~(PLAYER_STATE2_1 | PLAYER_STATE2_21);
|
this->stateFlags2 &= ~(PLAYER_STATE2_CAN_ACCEPT_TALK_OFFER | PLAYER_STATE2_21);
|
||||||
}
|
}
|
||||||
|
|
||||||
this->stateFlags1 &=
|
this->stateFlags1 &=
|
||||||
|
@ -11578,7 +11607,7 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) {
|
||||||
|
|
||||||
D_808535EC = 1.0f / D_808535E8;
|
D_808535EC = 1.0f / D_808535E8;
|
||||||
sUseHeldItem = sHeldItemButtonIsHeldDown = false;
|
sUseHeldItem = sHeldItemButtonIsHeldDown = false;
|
||||||
D_80858AA4 = this->currentMask;
|
sSavedCurrentMask = this->currentMask;
|
||||||
|
|
||||||
if (!(this->stateFlags3 & PLAYER_STATE3_2)) {
|
if (!(this->stateFlags3 & PLAYER_STATE3_2)) {
|
||||||
this->actionFunc(this, play);
|
this->actionFunc(this, play);
|
||||||
|
@ -12907,7 +12936,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_4(this, play)) &&
|
(!func_8083224C(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) {
|
||||||
|
@ -15480,7 +15509,7 @@ void func_80852944(PlayState* play, Player* this, CsCmdActorCue* cue) {
|
||||||
func_80832340(play, this);
|
func_80832340(play, this);
|
||||||
} else {
|
} else {
|
||||||
func_8083C148(this, play);
|
func_8083C148(this, play);
|
||||||
if (!Player_ActionHandler_4(this, play)) {
|
if (!Player_ActionHandler_Talk(this, play)) {
|
||||||
Player_ActionHandler_2(this, play);
|
Player_ActionHandler_2(this, play);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue