Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Early Eyeball Frog #4120

Merged
merged 6 commits into from
Sep 12, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions soh/soh/SohMenuBar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1371,6 +1371,8 @@ void DrawEnhancementsMenu() {
UIWidgets::Tooltip("Restore a bug from NTSC 1.0 that allows bypassing Bongo Bongo's intro cutscene to quickly kill him");
UIWidgets::PaddedEnhancementCheckbox("Original RBA Values", CVAR_ENHANCEMENT("RestoreRBAValues"), true, false);
UIWidgets::Tooltip("Restores the original outcomes when performing Reverse Bottle Adventure.");
UIWidgets::PaddedEnhancementCheckbox("Early Eyeball Frog", CVAR_ENHANCEMENT("EarlyEyeballFrog"), true, false);
UIWidgets::Tooltip("Restores a bug from NTSC 1.0/1.1 that allows you to obtain the eyeball frog from King Zora instead of the Zora Tunic by holding shield.");

ImGui::EndMenu();
}
Expand Down
115 changes: 85 additions & 30 deletions soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,18 +128,41 @@ s16 func_80A9C6C0(PlayState* play, Actor* thisx) {

switch (Message_GetState(&play->msgCtx)) {
case TEXT_STATE_DONE:
ret = NPC_TALK_STATE_IDLE;
switch (this->actor.textId) {
case 0x4012:
Flags_SetInfTable(INFTABLE_139);
ret = NPC_TALK_STATE_ACTION;
break;
case 0x401B:
ret = !Message_ShouldAdvance(play) ? NPC_TALK_STATE_TALKING : NPC_TALK_STATE_ACTION;
break;
case 0x401F:
Flags_SetInfTable(INFTABLE_139);
break;
if (CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) {
if (Message_ShouldAdvance(play)) {
ret = NPC_TALK_STATE_ITEM_GIVEN;
}
} else {
ret = NPC_TALK_STATE_IDLE;
switch (this->actor.textId) {
case 0x4012:
Flags_SetInfTable(INFTABLE_139);
ret = NPC_TALK_STATE_ACTION;
break;
case 0x401B:
ret = !Message_ShouldAdvance(play) ? NPC_TALK_STATE_TALKING : NPC_TALK_STATE_ACTION;
break;
case 0x401F:
Flags_SetInfTable(INFTABLE_139);
break;
}
}
break;
case TEXT_STATE_CLOSING:
if (CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) {
ret = NPC_TALK_STATE_IDLE;
switch (this->actor.textId) {
case 0x4012:
Flags_SetInfTable(INFTABLE_139);
ret = NPC_TALK_STATE_ACTION;
break;
case 0x401B:
ret = !Message_ShouldAdvance(play) ? NPC_TALK_STATE_TALKING : NPC_TALK_STATE_ACTION;
break;
case 0x401F:
Flags_SetInfTable(INFTABLE_139);
break;
}
}
break;
case TEXT_STATE_DONE_FADING:
Expand All @@ -159,8 +182,10 @@ s16 func_80A9C6C0(PlayState* play, Actor* thisx) {
break;
}
if (this->actor.textId == 0x4014) {
if (play->msgCtx.choiceIndex == 0) {
EnKz_SetupGetItem(this, play);
if (play->msgCtx.choiceIndex == 0 && (CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0) && this->actor.textId == 0x4014)) {
if (!CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) {
EnKz_SetupGetItem(this, play);
}
ret = NPC_TALK_STATE_ACTION;
} else {
this->actor.textId = 0x4016;
inspectredc marked this conversation as resolved.
Show resolved Hide resolved
Expand All @@ -175,7 +200,6 @@ s16 func_80A9C6C0(PlayState* play, Actor* thisx) {
break;
case TEXT_STATE_NONE:
case TEXT_STATE_DONE_HAS_NEXT:
case TEXT_STATE_CLOSING:
case TEXT_STATE_SONG_DEMO_DONE:
case TEXT_STATE_8:
case TEXT_STATE_9:
Expand Down Expand Up @@ -207,25 +231,34 @@ s32 func_80A9C95C(PlayState* play, EnKz* this, s16* talkState, f32 unkf, NpcGetT
return 1;
}

if (*talkState != NPC_TALK_STATE_IDLE) {
*talkState = updateTalkState(play, &this->actor);
return 0;
}
if (!CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) {
if (*talkState != NPC_TALK_STATE_IDLE) {
*talkState = updateTalkState(play, &this->actor);
return 0;
}

yaw = Math_Vec3f_Yaw(&this->actor.home.pos, &player->actor.world.pos);
yaw -= this->actor.shape.rot.y;
if ((fabsf(yaw) > 1638.0f) || (this->actor.xzDistToPlayer < 265.0f)) {
this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
return 0;
}
yaw = Math_Vec3f_Yaw(&this->actor.home.pos, &player->actor.world.pos);
yaw -= this->actor.shape.rot.y;
if ((fabsf(yaw) > 1638.0f) || (this->actor.xzDistToPlayer < 265.0f)) {
this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
return 0;
}

this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}

Actor_GetScreenPos(play, &this->actor, &sp32, &sp30);
if (!((sp32 >= -30) && (sp32 < 361) && (sp30 >= -10) && (sp30 < 241))) {
return 0;
}

if (CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) {
if (*talkState != NPC_TALK_STATE_IDLE) {
*talkState = updateTalkState(play, &this->actor);
return 0;
}
}

xzDistToPlayer = this->actor.xzDistToPlayer;
this->actor.xzDistToPlayer = Math_Vec3f_DistXZ(&this->actor.home.pos, &player->actor.world.pos);
if (func_8002F2CC(&this->actor, play, unkf) == 0) {
Expand All @@ -241,6 +274,18 @@ s32 func_80A9C95C(PlayState* play, EnKz* this, s16* talkState, f32 unkf, NpcGetT
void func_80A9CB18(EnKz* this, PlayState* play) {
Player* player = GET_PLAYER(play);

if (CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) {
f32 yaw;
yaw = Math_Vec3f_Yaw(&this->actor.home.pos, &player->actor.world.pos);
yaw -= this->actor.shape.rot.y;
if ((fabsf(yaw) > 1638.0f) || (this->actor.xzDistToPlayer < 265.0f)) {
this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
return 0;
}

this->actor.flags |= ACTOR_FLAG_TARGETABLE;
}

if (func_80A9C95C(play, this, &this->interactInfo.talkState, 340.0f, EnKz_GetText, func_80A9C6C0)) {
if (GameInteractor_Should(VB_BE_ABLE_TO_EXCHANGE_RUTOS_LETTER, (this->actor.textId == 0x401A), this) &&
!Flags_GetEventChkInf(EVENTCHKINF_KING_ZORA_MOVED))
Expand All @@ -262,12 +307,15 @@ void func_80A9CB18(EnKz* this, PlayState* play) {
this->actor.textId = 0x4014;
this->sfxPlayed = false;
player->actor.textId = this->actor.textId;
this->isTrading = true;
if (!CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) {
this->isTrading = true;
}
return;
}
}

this->isTrading = false;
if (!CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) {
this->isTrading = false;
}
if (Flags_GetInfTable(INFTABLE_139)) {
this->actor.textId = CHECK_QUEST_ITEM(QUEST_SONG_SERENADE) ? 0x4045 : 0x401A;
player->actor.textId = this->actor.textId;
Expand Down Expand Up @@ -434,6 +482,9 @@ void EnKz_StopMweep(EnKz* this, PlayState* play) {

void EnKz_Wait(EnKz* this, PlayState* play) {
if (this->interactInfo.talkState == NPC_TALK_STATE_ACTION) {
if (CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) {
this->interactInfo.talkState = NPC_TALK_STATE_IDLE;
}
this->actionFunc = EnKz_SetupGetItem;
EnKz_SetupGetItem(this, play);
} else {
Expand All @@ -460,7 +511,11 @@ void EnKz_SetupGetItem(EnKz* this, PlayState* play) {
Flags_SetRandomizerInf(RAND_INF_ADULT_TRADES_ZD_TRADE_PRESCRIPTION);
}
} else {
getItemId = this->isTrading ? GI_FROG : GI_TUNIC_ZORA;
if (CVarGetInteger(CVAR_ENHANCEMENT("EarlyEyeballFrog"), 0)) {
getItemId = func_8002F368(play) == EXCH_ITEM_PRESCRIPTION ? GI_FROG : GI_TUNIC_ZORA;
} else {
getItemId = this->isTrading ? GI_FROG : GI_TUNIC_ZORA;
}
yRange = fabsf(this->actor.yDistToPlayer) + 1.0f;
xzRange = this->actor.xzDistToPlayer + 1.0f;
Actor_OfferGetItem(&this->actor, play, getItemId, xzRange, yRange);
Expand Down
Loading