Skip to content

Commit

Permalink
[Mode] Hyrule Warriors-style Link (#665)
Browse files Browse the repository at this point in the history
* Add persistent bunny mask enhancement

* Adds option for HW styled Young Link

* Moves the enhancement to Modes

* Formatting

* Renamed HW>Hyrule Warriors/Changed rotate angles to hex

* Formatting again

* updated includes and stuff

dealing with a crash on my machine, gotta figure out what's up with that

* Added the enhancement toggle to the modern menu

Ok, I think that's just about everything
once again, should be ready to go

* Formatting

* removed unnecessary header include

---------

Co-authored-by: Garrett Cox <[email protected]>
  • Loading branch information
OtherBlue and garrettjoecox authored Nov 26, 2024
1 parent 329fb15 commit 6ca355f
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 0 deletions.
3 changes: 3 additions & 0 deletions mm/2s2h/BenGui/BenMenuBar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -714,6 +714,9 @@ void DrawEnhancementsMenu() {
if (UIWidgets::BeginMenu("Modes")) {
UIWidgets::CVarCheckbox("Play As Kafei", "gModes.PlayAsKafei",
{ .tooltip = "Requires scene reload to take effect." });
UIWidgets::CVarCheckbox("Hyrule Warriors Young Link", "gModes.HyruleWarriorsStyledLink",
{ .tooltip = "When acquired, places the Keaton and Fierce Deity masks on Link "
"similarly to how he wears them in Hyrule Warriors" });
if (UIWidgets::CVarCheckbox("Time Moves When You Move", "gModes.TimeMovesWhenYouMove")) {
RegisterTimeMovesWhenYouMove();
}
Expand Down
4 changes: 4 additions & 0 deletions mm/2s2h/BenGui/SearchableMenuItems.h
Original file line number Diff line number Diff line change
Expand Up @@ -1099,6 +1099,10 @@ void AddEnhancements() {
WIDGET_CVAR_CHECKBOX } },
{ { .widgetName = "Modes", .widgetType = WIDGET_SEPARATOR_TEXT },
{ "Play as Kafei", "gModes.PlayAsKafei", "Requires scene reload to take effect.", WIDGET_CVAR_CHECKBOX },
{ "Hyrule Warriors Styled Link", "gModes.HyruleWarriorsStyledLink",
"When acquired, places the Keaton and Fierce Deity masks on Link similarly to how he wears them in "
"Hyrule Warriors",
WIDGET_CVAR_CHECKBOX },
{ "Time Moves when you Move",
"gModes.TimeMovesWhenYouMove",
"Time only moves when Link is not standing still.",
Expand Down
1 change: 1 addition & 0 deletions mm/2s2h/Enhancements/Enhancements.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ void InitEnhancements() {

// Graphics
RegisterDisableBlackBars();
RegisterHyruleWarriorsStyledLink();
Register3DItemDrops();

// Masks
Expand Down
1 change: 1 addition & 0 deletions mm/2s2h/Enhancements/Graphics/Graphics.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ void RegisterDisableBlackBars();
void MotionBlur_RenderMenuOptions();
void RegisterPlayAsKafei();
void RegisterTextBasedClock();
void RegisterHyruleWarriorsStyledLink();

#ifdef __cplusplus
#include <libultraship/libultraship.h>
Expand Down
64 changes: 64 additions & 0 deletions mm/2s2h/Enhancements/Graphics/HyruleWarriorsStyledLink.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#include "libultraship/libultraship.h"
#include "2s2h/GameInteractor/GameInteractor.h"
#include "Enhancements/FrameInterpolation/FrameInterpolation.h"

extern "C" {
#include "z64.h"
#include "z64player.h"
#include "functions.h"
#include "macros.h"
#include "src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"

extern PlayState* gPlayState;
extern const char* D_801C0B20[28];
extern SaveContext gSaveContext;
#include "objects/object_link_child/object_link_child.h"
void ResourceMgr_PatchGfxByName(const char* path, const char* patchName, int index, Gfx instruction);
void ResourceMgr_UnpatchGfxByName(const char* path, const char* patchName);
}

void UpdateHyruleWarriorsStyledLink() {
GameInteractor::Instance->RegisterGameHookForID<GameInteractor::OnPlayerPostLimbDraw>(
PLAYER_LIMB_HEAD, [](Player* player, s32 limbIndex) {
if (CVarGetInteger("gModes.HyruleWarriorsStyledLink", 0) && player->currentMask == PLAYER_MASK_NONE &&
player->transformation == PLAYER_FORM_HUMAN && INV_CONTENT(ITEM_MASK_KEATON) == ITEM_MASK_KEATON) {
OPEN_DISPS(gPlayState->state.gfxCtx);
Matrix_Push();
Matrix_RotateYS(0x38e3, MTXMODE_APPLY);
Matrix_RotateZS(-0x12F6, MTXMODE_APPLY);
Matrix_Translate(300.0f, -250.0f, 77.7f, MTXMODE_APPLY);
Matrix_Scale(0.648f, 0.648f, 0.648f, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gPlayState->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, (Gfx*)D_801C0B20[PLAYER_MASK_KEATON - 1]);
Matrix_Pop();
CLOSE_DISPS(gPlayState->state.gfxCtx);
}
});
GameInteractor::Instance->RegisterGameHookForID<GameInteractor::OnPlayerPostLimbDraw>(
PLAYER_LIMB_WAIST, [](Player* player, s32 limbIndex) {
if (CVarGetInteger("gModes.HyruleWarriorsStyledLink", 0) && player->transformation == PLAYER_FORM_HUMAN &&
player->itemAction != PLAYER_IA_MASK_FIERCE_DEITY &&
INV_CONTENT(ITEM_MASK_FIERCE_DEITY) == ITEM_MASK_FIERCE_DEITY) {
OPEN_DISPS(gPlayState->state.gfxCtx);
Matrix_Push();
Matrix_RotateXS(-0x61A8, MTXMODE_APPLY);
Matrix_RotateYS(-0x7D0, MTXMODE_APPLY);
Matrix_RotateZS(-0x3A98, MTXMODE_APPLY);
Matrix_Translate(-85.0f, 658.0f, -165.0f, MTXMODE_APPLY);
Matrix_Scale(0.635f, 0.635f, 0.635f, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gPlayState->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, (Gfx*)D_801C0B20[PLAYER_MASK_FIERCE_DEITY - 1]);
Matrix_Pop();
CLOSE_DISPS(gPlayState->state.gfxCtx);
}
});
}

void RegisterHyruleWarriorsStyledLink() {
UpdateHyruleWarriorsStyledLink();

GameInteractor::Instance->RegisterGameHook<GameInteractor::OnSceneInit>(
[](s8 sceneId, s8 spawnNum) { UpdateHyruleWarriorsStyledLink(); });
}

0 comments on commit 6ca355f

Please sign in to comment.