1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
#include "ActorBehavior.h"
#include <libultraship/bridge/consolevariablebridge.h>
#include "2s2h/Rando/Logic/Logic.h"
extern "C" {
#include "variables.h"
#include "src/overlays/actors/ovl_En_Toto/z_en_toto.h"
extern void func_80BA36C0(EnToto* enToto, PlayState* play, s32 index);
}
void Rando::ActorBehavior::InitEnTotoBehavior() {
COND_VB_SHOULD(VB_GIVE_ITEM_FROM_OFFER, IS_RANDO, {
GetItemId* item = va_arg(args, GetItemId*);
Actor* refActor = va_arg(args, Actor*);
Player* player = GET_PLAYER(gPlayState);
if (refActor->id != ACTOR_EN_TOTO) {
return;
}
RANDO_SAVE_CHECKS[RC_MILK_BAR_CIRCUS_LEADER_MASK].eligible = true;
*should = false;
refActor->parent = &player->actor;
player->talkActor = refActor;
player->talkActorDistance = refActor->xzDistToPlayer;
player->exchangeItemAction = PLAYER_IA_MINUS1;
func_80BA36C0((EnToto*)refActor, gPlayState, 0); // Advance Toto to "Wanna play again?" state
});
/*
* "Please take my mask"
* Notebook events usually pop by immediately following a textbox. Since the Get Item animation is at the tail end
* of a cutscene, and the player may have GI animations skipped, there is no subsequent textbox to trigger notebook
* events. So, we queue the relevant notebook events manually with the final textbox of the cutscene.
*/
COND_ID_HOOK(OnOpenText, 0x2B3B, IS_RANDO, [](u16* textId, bool* loadFromMessageTable) {
Message_BombersNotebookQueueEvent(gPlayState, BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK);
Message_BombersNotebookQueueEvent(gPlayState, BOMBERS_NOTEBOOK_EVENT_MET_TOTO);
Message_BombersNotebookQueueEvent(gPlayState, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN);
});
COND_VB_SHOULD(VB_TOTO_START_SOUND_CHECK, IS_RANDO && RANDO_SAVE_OPTIONS[RO_SHUFFLE_OCARINA_BUTTONS], {
EnToto* totoActor = va_arg(args, EnToto*);
if (totoActor->text->textId == 0x2B24) {
if (!(Rando::Logic::canPlaySong(OCARINA_SONG_WIND_FISH_HUMAN) &&
Rando::Logic::canPlaySong(OCARINA_SONG_WIND_FISH_DEKU) &&
Rando::Logic::canPlaySong(OCARINA_SONG_WIND_FISH_GORON) &&
Rando::Logic::canPlaySong(OCARINA_SONG_WIND_FISH_ZORA))) {
Message_ContinueTextbox(gPlayState, 0x2B25);
func_80BA36C0(totoActor, gPlayState, 0);
Flags_UnsetSwitch(gPlayState, ENTOTO_GET_SWITCH_FLAG_1(&totoActor->actor));
*should = false;
}
}
});
}
|