diff options
| -rw-r--r-- | mm/2s2h/Rando/ActorBehavior/EnJs.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/mm/2s2h/Rando/ActorBehavior/EnJs.cpp b/mm/2s2h/Rando/ActorBehavior/EnJs.cpp index f67ae0295..018254e4f 100644 --- a/mm/2s2h/Rando/ActorBehavior/EnJs.cpp +++ b/mm/2s2h/Rando/ActorBehavior/EnJs.cpp @@ -2,12 +2,19 @@ #include <libultraship/bridge/consolevariablebridge.h> #include "2s2h/Rando/Logic/Logic.h" #include "2s2h/CustomMessage/CustomMessage.h" +#include "2s2h/Enhancements/FrameInterpolation/FrameInterpolation.h" extern "C" { #include "variables.h" #include "overlays/actors/ovl_En_Js/z_en_js.h" +#include "objects/object_stk/object_stk.h" +s32 func_80968DD0(EnJs* enJs, PlayState* play); +void func_8096971C(EnJs* enJs, PlayState* play); +extern Vec3f D_8096AC30; } +void EnJs_PromptForDialog(EnJs* enJs, PlayState* play); + void OverrideSubJsText(u16* textId, bool* loadFromMessageTable) { Player* player = GET_PLAYER(gPlayState); if (player->talkActor == NULL) { @@ -143,6 +150,50 @@ void OverrideMainJsText(u16* textId, bool* loadFromMessageTable) { } } +void EnJs_PostLimbDraw_NoMask(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) { + if (limbIndex == MOONCHILD_LIMB_HEAD) { + Matrix_MultVec3f(&D_8096AC30, &thisx->focus.pos); + OPEN_DISPS(play->state.gfxCtx); + Matrix_RotateZYX(0x8000, 0x8000, -0x4000, MTXMODE_APPLY); + Matrix_Translate(-128.0, -256.0, 0.0, MTXMODE_APPLY); + MATRIX_FINALIZE_AND_LOAD(POLY_OPA_DISP++, play->state.gfxCtx); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gSkullKidLinkMask1DL); + CLOSE_DISPS(play->state.gfxCtx); + } +} + +void EnJs_Draw_NoMask(Actor* thisx, PlayState* play) { + EnJs* enJs = (EnJs*)thisx; + + Gfx_SetupDL25_Opa(play->state.gfxCtx); + SkelAnime_DrawFlexOpa(play, enJs->skelAnime.skeleton, enJs->skelAnime.jointTable, enJs->skelAnime.dListCount, NULL, + EnJs_PostLimbDraw_NoMask, &enJs->actor); +} + +void EnJs_ResetTime(EnJs* enJs, PlayState* play) { + func_8096971C(enJs, play); + if (play->msgCtx.ocarinaMode == OCARINA_MODE_APPLY_SOT) { + play->nextEntrance = ENTRANCE(CUTSCENE, 0); + gSaveContext.nextCutsceneIndex = 0xFFF7; + play->transitionTrigger = TRANS_TRIGGER_START; + enJs->actionFunc = func_8096971C; + } else if (Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(play) && + play->msgCtx.choiceIndex == 1) { + enJs->actionFunc = EnJs_PromptForDialog; + } +} + +void EnJs_PromptForDialog(EnJs* enJs, PlayState* play) { + func_8096971C(enJs, play); + if (Actor_TalkOfferAccepted(&enJs->actor, &play->state)) { + enJs->actionFunc = EnJs_ResetTime; + Message_StartTextbox(play, 0x1B8A, &enJs->actor); + play->msgCtx.ocarinaMode = OCARINA_MODE_PROCESS_SOT; + } else if (func_80968DD0(enJs, play)) { + Actor_OfferTalk(&enJs->actor, play, 120.0f); + } +} + void Rando::ActorBehavior::InitEnJsBehavior() { COND_VB_SHOULD(VB_JS_CONSIDER_ELIGIBLE_FOR_DEITY, IS_RANDO, { *should = false; }); @@ -172,6 +223,19 @@ void Rando::ActorBehavior::InitEnJsBehavior() { } }); + COND_ID_HOOK(OnSceneInit, SCENE_SOUGEN, IS_RANDO, [](s8 sceneId, s8 spawnNum) { + u32 params = 8; + Actor* actor = Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_JS, -150, 40, 50, 0, -15000, 0, params); + actor->draw = EnJs_Draw_NoMask; + }); + + COND_ID_HOOK(OnActorInit, ACTOR_EN_JS, IS_RANDO, [](Actor* actor) { + if (actor->draw == EnJs_Draw_NoMask) { + ((EnJs*)actor)->actionFunc = EnJs_PromptForDialog; + actor->world.pos.y = 0; + } + }); + COND_ID_HOOK(OnOpenText, 0x2215, IS_RANDO, OverrideSubJsText); COND_ID_HOOK(OnOpenText, 0x2216, IS_RANDO, OverrideSubJsText); COND_ID_HOOK(OnOpenText, 0x21FC, IS_RANDO, OverrideMainJsText); |
