Add fast mask transformation enhancement (#244)

This commit is contained in:
Garrett Cox
2024-05-22 09:05:03 -05:00
parent d10dd13972
commit 1b6397eca9
7 changed files with 56 additions and 0 deletions
+1
View File
@@ -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."
});
+1
View File
@@ -9,6 +9,7 @@ void InitEnhancements() {
RegisterEndOfCycleSaveHooks();
// Masks
RegisterFastTransformation();
RegisterFierceDeityAnywhere();
// Restorations
+1
View File
@@ -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
@@ -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
@@ -0,0 +1,44 @@
#include <libultraship/bridge.h>
#include "Enhancements/GameInteractor/GameInteractor.h"
extern "C" {
#include <z64.h>
#include <macros.h>
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);
}
});
}
@@ -0,0 +1,6 @@
#ifndef MASKS_FAST_TRANSFORMATION_H
#define MASKS_FAST_TRANSFORMATION_H
void RegisterFastTransformation();
#endif // MASKS_FAST_TRANSFORMATION_H
@@ -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;