Fix missable Malon check (#6299)

Added a case for the VB_MALON_RETURN_FROM_CASTLE vanilla behavior flag.
This lets Malon stay until you both get the egg and wake up Talon making the egg flag unmissable.
This commit is contained in:
Jerom Venneker
2026-02-28 15:57:27 +01:00
committed by GitHub
parent 00ac1d566d
commit a393f48c7c
6 changed files with 41 additions and 1 deletions

View File

@@ -135,6 +135,9 @@ typedef enum {
TEXT_MALON_HOW_IS_EPONA_DOING = 0x2001,
TEXT_MALON_EPONA_LOOKS_GREAT = 0x2002,
TEXT_MALON_OBSTICLE_COURSE = 0x2003,
TEXT_MALON_MEET_EPONA = 0x2047,
TEXT_MALON_EPONA_IS_AFRAID = 0x2048,
TEXT_MALON_LETS_SING_THIS_SONG = 0x2049,
TEXT_MALON_EVERYONE_TURNING_EVIL = 0x204C,
TEXT_MALON_I_SING_THIS_SONG = 0x2050,
TEXT_MALON_EVERYONE_LIKED_SONG = 0x2051,

View File

@@ -1419,6 +1419,14 @@ typedef enum {
// - None
VB_MALON_RETURN_FROM_CASTLE,
// #### `result`
// ```c
// true
// ```
// #### `args`
// - None
VB_SEND_MALON_HOME,
// #### `result`
// ```c
// CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)

View File

@@ -39,10 +39,23 @@ void BuildShootingGalleryNoBowMessage(uint16_t* textId, bool* loadFromMessageTab
*loadFromMessageTable = false;
}
void BuildFixedMallonAtCastleMessage(uint16_t* textId, bool* loadFromMessageTable) {
CustomMessage msg =
CustomMessage("Looks like my dad already went back to the %rranch%w. You should come visit sometime!",
"Mein Vater ist wohl schon wieder auf der %rFarm%w, du solltest ihn mal besuchen kommen!",
"On dirait que père est déjà rentré au %rranch%w. Tu devrais nous rendre visite à l'occasion!");
msg.AutoFormat();
msg.LoadIntoFont();
*loadFromMessageTable = false;
}
void RegisterMiscellaneousMessages() {
COND_ID_HOOK(OnOpenText, TEXT_LAKE_HYLIA_WATER_SWITCH_NAVI, IS_RANDO, BuildWaterSwitchMessage);
COND_ID_HOOK(OnOpenText, TEXT_LAKE_HYLIA_WATER_SWITCH_SIGN, IS_RANDO, BuildWaterSwitchMessage);
COND_ID_HOOK(OnOpenText, TEXT_SHOOTING_GALLERY_MAN_COME_BACK_WITH_BOW, IS_RANDO, BuildShootingGalleryNoBowMessage);
COND_ID_HOOK(OnOpenText, TEXT_MALON_MEET_EPONA, IS_RANDO, BuildFixedMallonAtCastleMessage);
COND_ID_HOOK(OnOpenText, TEXT_MALON_EPONA_IS_AFRAID, IS_RANDO, BuildFixedMallonAtCastleMessage);
COND_ID_HOOK(OnOpenText, TEXT_MALON_LETS_SING_THIS_SONG, IS_RANDO, BuildFixedMallonAtCastleMessage);
}
static RegisterShipInitFunc initFunc(RegisterMiscellaneousMessages, { "IS_RANDO" });

View File

@@ -253,6 +253,12 @@ void RandomizerOnFlagSetHandler(int16_t flagType, int16_t flag) {
Flags_SetRandomizerInf(RAND_INF_ZELDAS_LETTER);
}
if (flagType == FLAG_EVENT_CHECK_INF && flag == EVENTCHKINF_TALON_RETURNED_FROM_CASTLE) {
if (Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_POCKET_EGG)) {
Flags_SetRandomizerInf(RAND_INF_TALON_SENT_MALON_HOME);
}
}
RandomizerCheck rc = GetRandomizerCheckFromFlag(flagType, flag);
if (rc == RC_UNKNOWN_CHECK)
return;
@@ -932,6 +938,13 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
*should = true;
}
break;
case VB_MALON_RETURN_FROM_CASTLE:
*should = Flags_GetEventChkInf(EVENTCHKINF_TALON_RETURNED_FROM_CASTLE) &&
Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_POCKET_EGG);
break;
case VB_SEND_MALON_HOME:
*should = Flags_GetRandomizerInf(RAND_INF_TALON_SENT_MALON_HOME);
break;
case VB_MIDO_CONSIDER_DEKU_TREE_DEAD:
*should = Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_KOKIRI_EMERALD_DEKU_TREE_DEAD);
break;

View File

@@ -2112,3 +2112,4 @@ DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8)
DEFINE_RAND_INF(RAND_INF_OBTAINED_RUTOS_LETTER)
DEFINE_RAND_INF(RAND_INF_OBTAINED_NAYRUS_LOVE)
DEFINE_RAND_INF(RAND_INF_OBTAINED_ROCS_FEATHER)
DEFINE_RAND_INF(RAND_INF_TALON_SENT_MALON_HOME)

View File

@@ -329,7 +329,9 @@ void func_80AA0D88(EnMa1* this, PlayState* play) {
}
if ((play->sceneNum == SCENE_HYRULE_CASTLE) && malonReturnedFromCastle) {
Actor_Kill(&this->actor);
if (GameInteractor_Should(VB_SEND_MALON_HOME, true)) {
Actor_Kill(&this->actor);
}
} else if (!malonReturnedFromCastle || malonTaughtEponasSong) {
if (this->interactInfo.talkState == NPC_TALK_STATE_ACTION) {
this->actionFunc = func_80AA0EA0;