mirror of
https://github.com/zeldaret/mm.git
synced 2026-06-10 12:54:55 -04:00
+14
-8
@@ -1934,9 +1934,16 @@ s16 D_801AED48[] = {
|
||||
HALFDAYBIT_DAY4_NIGHT,
|
||||
};
|
||||
|
||||
s32 Actor_ProcessTalkRequest(Actor* actor, GameState* gameState) {
|
||||
if (actor->flags & ACTOR_FLAG_TALK_REQUESTED) {
|
||||
actor->flags &= ~ACTOR_FLAG_TALK_REQUESTED;
|
||||
/**
|
||||
* When a given talk offer is accepted, Player will set `ACTOR_FLAG_TALK` for that actor.
|
||||
* This function serves to acknowledge that the offer was accepted by Player, and notifies the actor
|
||||
* that it should proceed with its own internal processes for handling dialogue.
|
||||
*
|
||||
* @return true if the talk offer was accepted, false otherwise
|
||||
*/
|
||||
s32 Actor_TalkOfferAccepted(Actor* actor, GameState* gameState) {
|
||||
if (actor->flags & ACTOR_FLAG_TALK) {
|
||||
actor->flags &= ~ACTOR_FLAG_TALK;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1973,8 +1980,7 @@ s32 Actor_OfferTalkExchange(Actor* actor, PlayState* play, f32 xzRange, f32 yRan
|
||||
PlayerItemAction exchangeItemAction) {
|
||||
Player* player = GET_PLAYER(play);
|
||||
|
||||
if ((player->actor.flags & ACTOR_FLAG_TALK_REQUESTED) ||
|
||||
((exchangeItemAction > PLAYER_IA_NONE) && Player_InCsMode(play)) ||
|
||||
if ((player->actor.flags & ACTOR_FLAG_TALK) || ((exchangeItemAction > PLAYER_IA_NONE) && Player_InCsMode(play)) ||
|
||||
(!actor->isLockedOn &&
|
||||
((fabsf(actor->playerHeightRel) > fabsf(yRange)) || (actor->xzDistToPlayer > player->talkActorDistance) ||
|
||||
(xzRange < actor->xzDistToPlayer)))) {
|
||||
@@ -2016,7 +2022,7 @@ s32 Actor_OfferTalkNearColChkInfoCylinder(Actor* actor, PlayState* play) {
|
||||
|
||||
s32 Actor_TextboxIsClosing(Actor* actor, PlayState* play) {
|
||||
if (Message_GetState(&play->msgCtx) == TEXT_STATE_CLOSING) {
|
||||
actor->flags &= ~ACTOR_FLAG_TALK_REQUESTED;
|
||||
actor->flags &= ~ACTOR_FLAG_TALK;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -2033,7 +2039,7 @@ s32 Actor_ChangeFocus(Actor* actor1, PlayState* play, Actor* actor2) {
|
||||
|
||||
talkActor = player->talkActor;
|
||||
|
||||
if ((player->actor.flags & ACTOR_FLAG_TALK_REQUESTED) && (talkActor != NULL)) {
|
||||
if ((player->actor.flags & ACTOR_FLAG_TALK) && (talkActor != NULL)) {
|
||||
player->talkActor = actor2;
|
||||
player->lockOnActor = actor2;
|
||||
return true;
|
||||
@@ -4260,7 +4266,7 @@ void Actor_GetClosestPosOnPath(Vec3s* points, s32 numPoints, Vec3f* srcPos, Vec3
|
||||
*/
|
||||
s32 Npc_UpdateTalking(PlayState* play, Actor* actor, s16* talkState, f32 interactRange, NpcGetTextIdFunc getTextId,
|
||||
NpcUpdateTalkStateFunc updateTalkState) {
|
||||
if (Actor_ProcessTalkRequest(actor, &play->state)) {
|
||||
if (Actor_TalkOfferAccepted(actor, &play->state)) {
|
||||
*talkState = NPC_TALK_STATE_TALKING;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ void EnAObj_Destroy(Actor* thisx, PlayState* play) {
|
||||
void EnAObj_Idle(EnAObj* this, PlayState* play) {
|
||||
s32 yawDiff;
|
||||
|
||||
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
|
||||
if (Actor_TalkOfferAccepted(&this->actor, &play->state)) {
|
||||
this->actionFunc = EnAObj_Talk;
|
||||
} else {
|
||||
yawDiff = ABS_ALT((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y));
|
||||
|
||||
Reference in New Issue
Block a user