diff --git a/mm/2s2h/BenGui/BenMenuBar.cpp b/mm/2s2h/BenGui/BenMenuBar.cpp index 568ef7d16..83f2b3756 100644 --- a/mm/2s2h/BenGui/BenMenuBar.cpp +++ b/mm/2s2h/BenGui/BenMenuBar.cpp @@ -309,6 +309,7 @@ void DrawEnhancementsMenu() { } if (UIWidgets::BeginMenu("Masks")) { + UIWidgets::CVarCheckbox("Fast Transformation", "gEnhancements.Masks.FastTransformation"); UIWidgets::CVarCheckbox("Fierce Deity's Mask Anywhere", "gEnhancements.Masks.FierceDeitysAnywhere", { .tooltip = "Allow using Fierce Deity's mask outside of boss rooms." }); diff --git a/mm/2s2h/Enhancements/Enhancements.cpp b/mm/2s2h/Enhancements/Enhancements.cpp index 443c0a3d3..74a71960a 100644 --- a/mm/2s2h/Enhancements/Enhancements.cpp +++ b/mm/2s2h/Enhancements/Enhancements.cpp @@ -9,6 +9,7 @@ void InitEnhancements() { RegisterEndOfCycleSaveHooks(); // Masks + RegisterFastTransformation(); RegisterFierceDeityAnywhere(); // Restorations diff --git a/mm/2s2h/Enhancements/Enhancements.h b/mm/2s2h/Enhancements/Enhancements.h index 6e4504006..4b01d646d 100644 --- a/mm/2s2h/Enhancements/Enhancements.h +++ b/mm/2s2h/Enhancements/Enhancements.h @@ -6,6 +6,7 @@ #include "Cycle/EndOfCycle.h" #include "Masks/FierceDeityAnywhere.h" #include "Restorations/SideRoll.h" +#include "Masks/FastTransformation.h" #include "TimeSavers/TimeSavers.h" #ifdef __cplusplus diff --git a/mm/2s2h/Enhancements/GameInteractor/GameInteractor.h b/mm/2s2h/Enhancements/GameInteractor/GameInteractor.h index 7b19376f2..e3cadbec9 100644 --- a/mm/2s2h/Enhancements/GameInteractor/GameInteractor.h +++ b/mm/2s2h/Enhancements/GameInteractor/GameInteractor.h @@ -33,6 +33,7 @@ typedef enum { GI_VB_PLAY_ENTRANCE_CS, GI_VB_DISABLE_FD_MASK, GI_VB_PATCH_SIDEROLL, + GI_VB_PREVENT_MASK_TRANSFORMATION_CS, } GIVanillaBehavior; #ifdef __cplusplus diff --git a/mm/2s2h/Enhancements/Masks/FastTransformation.cpp b/mm/2s2h/Enhancements/Masks/FastTransformation.cpp new file mode 100644 index 000000000..53538f3cc --- /dev/null +++ b/mm/2s2h/Enhancements/Masks/FastTransformation.cpp @@ -0,0 +1,44 @@ +#include +#include "Enhancements/GameInteractor/GameInteractor.h" + +extern "C" { +#include +#include +extern PlayState* gPlayState; +extern SaveContext gSaveContext; +extern ActorOverlay gActorOverlayTable[ACTOR_ID_MAX]; +extern s16 gPlayerFormObjectIds[PLAYER_FORM_MAX]; +void Player_PlaySfx(Player* player, u16 sfxId); +void PlayerCall_Init(Actor* thisx, PlayState* play); +void PlayerCall_Update(Actor* thisx, PlayState* play); +void PlayerCall_Draw(Actor* thisx, PlayState* play); +void TransitionFade_SetColor(void* thisx, u32 color); +} + +void RegisterFastTransformation() { + REGISTER_VB_SHOULD(GI_VB_PREVENT_MASK_TRANSFORMATION_CS, { + if (CVarGetInteger("gEnhancements.Masks.FastTransformation", 0)) { + *should = true; + Player* player = GET_PLAYER(gPlayState); + + // This was mostly copied directly from func_8012301C within z_player_lib.c + s16 objectId = gPlayerFormObjectIds[GET_PLAYER_FORM]; + + gActorOverlayTable[ACTOR_PLAYER].initInfo->objectId = objectId; + func_8012F73C(&gPlayState->objectCtx, player->actor.objectSlot, objectId); + player->actor.objectSlot = Object_GetSlot(&gPlayState->objectCtx, GAMEPLAY_KEEP); + + s32 objectSlot = Object_GetSlot(&gPlayState->objectCtx, gActorOverlayTable[ACTOR_PLAYER].initInfo->objectId); + player->actor.objectSlot = objectSlot; + player->actor.shape.rot.z = GET_PLAYER_FORM + 1; + player->actor.init = PlayerCall_Init; + player->actor.update = PlayerCall_Update; + player->actor.draw = PlayerCall_Draw; + gSaveContext.save.equippedMask = PLAYER_MASK_NONE; + + TransitionFade_SetColor(&gPlayState->unk_18E48, 0x000000); + R_TRANS_FADE_FLASH_ALPHA_STEP = -1; + Player_PlaySfx(GET_PLAYER(gPlayState), NA_SE_SY_TRANSFORM_MASK_FLASH); + } + }); +} diff --git a/mm/2s2h/Enhancements/Masks/FastTransformation.h b/mm/2s2h/Enhancements/Masks/FastTransformation.h new file mode 100644 index 000000000..6820c3c9a --- /dev/null +++ b/mm/2s2h/Enhancements/Masks/FastTransformation.h @@ -0,0 +1,6 @@ +#ifndef MASKS_FAST_TRANSFORMATION_H +#define MASKS_FAST_TRANSFORMATION_H + +void RegisterFastTransformation(); + +#endif // MASKS_FAST_TRANSFORMATION_H diff --git a/mm/src/overlays/actors/ovl_player_actor/z_player.c b/mm/src/overlays/actors/ovl_player_actor/z_player.c index d268bad7c..862bde7a8 100644 --- a/mm/src/overlays/actors/ovl_player_actor/z_player.c +++ b/mm/src/overlays/actors/ovl_player_actor/z_player.c @@ -18097,6 +18097,8 @@ void Player_Action_86(Player* this, PlayState* play) { struct_8085D910* sp4C = D_8085D910; s32 sp48 = false; + if (GameInteractor_Should(GI_VB_PREVENT_MASK_TRANSFORMATION_CS, false, NULL)) return; + func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_MASK_TRANSFORMATION]); sPlayerControlInput = play->state.input;