diff --git a/soh/assets/custom/objects/custom_snowball/LightNoise.rgba32 b/soh/assets/custom/objects/custom_snowball/LightNoise.rgba32
new file mode 100644
index 000000000..73bcf2a59
Binary files /dev/null and b/soh/assets/custom/objects/custom_snowball/LightNoise.rgba32 differ
diff --git a/soh/assets/custom/objects/custom_snowball/mat_snowball_snow b/soh/assets/custom/objects/custom_snowball/mat_snowball_snow
new file mode 100644
index 000000000..49b24d2b5
--- /dev/null
+++ b/soh/assets/custom/objects/custom_snowball/mat_snowball_snow
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/custom_snowball/model.xml b/soh/assets/custom/objects/custom_snowball/model.xml
new file mode 100644
index 000000000..8e2e4aa6e
--- /dev/null
+++ b/soh/assets/custom/objects/custom_snowball/model.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/custom_snowball/snowball b/soh/assets/custom/objects/custom_snowball/snowball
new file mode 100644
index 000000000..ca9fb8e40
--- /dev/null
+++ b/soh/assets/custom/objects/custom_snowball/snowball
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/custom_snowball/snowball_tri_0 b/soh/assets/custom/objects/custom_snowball/snowball_tri_0
new file mode 100644
index 000000000..7c4fb871d
--- /dev/null
+++ b/soh/assets/custom/objects/custom_snowball/snowball_tri_0
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/custom_snowball/snowball_vtx_0 b/soh/assets/custom/objects/custom_snowball/snowball_vtx_0
new file mode 100644
index 000000000..69080c089
--- /dev/null
+++ b/soh/assets/custom/objects/custom_snowball/snowball_vtx_0
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/custom/objects/custom_snowball/snowball_vtx_cull b/soh/assets/custom/objects/custom_snowball/snowball_vtx_cull
new file mode 100644
index 000000000..8e2e4aa6e
--- /dev/null
+++ b/soh/assets/custom/objects/custom_snowball/snowball_vtx_cull
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/soh_assets.h b/soh/assets/soh_assets.h
index 9e171a023..28902f3e7 100644
--- a/soh/assets/soh_assets.h
+++ b/soh/assets/soh_assets.h
@@ -59,6 +59,9 @@ static const ALIGN_ASSET(2) char gSkullTreasureChestFrontTex[] = dgSkullTreasure
#define dgSkullTreasureChestSideAndTopTex "__OTR__objects/object_box/gSkullTreasureChestSideAndTopTex"
static const ALIGN_ASSET(2) char gSkullTreasureChestSideAndTopTex[] = dgSkullTreasureChestSideAndTopTex;
+#define dgSnowballDL "__OTR__objects/custom_snowball/snowball"
+static const ALIGN_ASSET(2) char gSnowballDL[] = dgSnowballDL;
+
#define dgTitleRandomizerSubtitleTex "__OTR__objects/object_mag/gTitleRandomizerSubtitleTex"
static const ALIGN_ASSET(2) char gTitleRandomizerSubtitleTex[] = dgTitleRandomizerSubtitleTex;
diff --git a/soh/soh/Enhancements/Holiday/Archez.cpp b/soh/soh/Enhancements/Holiday/Archez.cpp
new file mode 100644
index 000000000..0665c9d29
--- /dev/null
+++ b/soh/soh/Enhancements/Holiday/Archez.cpp
@@ -0,0 +1,123 @@
+#include "Holiday.hpp"
+#include "Archez.h"
+#include
+#include "soh/UIWidgets.hpp"
+#include "soh/Enhancements/game-interactor/GameInteractor.h"
+#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh_assets.h"
+
+extern "C" {
+#include "macros.h"
+#include "functions.h"
+#include "variables.h"
+#include "objects/object_goroiwa/object_goroiwa.h"
+
+extern PlayState* gPlayState;
+}
+
+#define AUTHOR "Archez"
+#define CVAR(v) "gHoliday." AUTHOR "." v
+
+static bool sSkipNextLimb = false;
+static bool sSkipNextSkeleton = false;
+
+extern "C" void SkipOverrideNextLimb() {
+ sSkipNextLimb = true;
+}
+
+extern "C" void SkipOverrideNextSkeleton() {
+ sSkipNextSkeleton = true;
+}
+
+extern "C" void ClearOverrideSkips() {
+ sSkipNextLimb = false;
+ sSkipNextSkeleton = false;
+}
+
+static void ConfigurationChanged() {
+ COND_VB_SHOULD(VB_DRAW_SKEL_LIMB, CVarGetInteger(CVAR("SnowGolems"), 0), {
+ if (!*should) {
+ return;
+ }
+
+ if (sSkipNextLimb) {
+ sSkipNextLimb = false;
+ return;
+ }
+
+ if (sSkipNextSkeleton) {
+ return;
+ }
+
+ Gfx** gfxP = va_arg(args, Gfx**);
+ void* dList = va_arg(args, void*);
+
+ *should = false;
+
+ Gfx* gfx = *gfxP;
+
+ Matrix_Push();
+
+ Matrix_Scale(0.55f, 0.55f, 0.55f, MTXMODE_APPLY);
+ gSPMatrix(gfx++, Matrix_NewMtx(gPlayState->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_LOAD);
+ gSPDisplayList(gfx++, (Gfx*)gSnowballDL);
+
+ Matrix_Pop();
+
+ gSPMatrix(gfx++, Matrix_NewMtx(gPlayState->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_LOAD);
+
+ *gfxP = gfx;
+ });
+
+ COND_VB_SHOULD(VB_DRAW_SKEL_FLEX_LIMB, CVarGetInteger(CVAR("SnowGolems"), 0), {
+ if (!*should) {
+ return;
+ }
+
+ if (sSkipNextLimb) {
+ sSkipNextLimb = false;
+ }
+
+ if (sSkipNextSkeleton) {
+ return;
+ }
+
+ Gfx** gfxP = va_arg(args, Gfx**);
+ void* dList = va_arg(args, void*);
+ Mtx* mtx = va_arg(args, Mtx*);
+
+ *should = false;
+
+ Gfx* gfx = *gfxP;
+ MtxF mtxF;
+
+ Matrix_Push();
+ Matrix_MtxToMtxF(mtx, &mtxF);
+ Matrix_Put(&mtxF);
+
+ Matrix_Scale(0.55f, 0.55f, 0.55f, MTXMODE_APPLY);
+ gSPMatrix(gfx++, Matrix_NewMtx(gPlayState->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_LOAD);
+ gSPDisplayList(gfx++, (Gfx*)gSnowballDL);
+
+ Matrix_Pop();
+
+ gSPMatrix(gfx++, mtx, G_MTX_LOAD);
+
+ *gfxP = gfx;
+ });
+}
+
+static void DrawMenu() {
+ ImGui::SeparatorText(AUTHOR);
+
+ if (UIWidgets::EnhancementCheckbox("Snow Golems", CVAR("SnowGolems"))) {
+ ConfigurationChanged();
+ }
+ UIWidgets::Tooltip("Overrides most charactor skeletons with snow balls to make them look like Snow Golems");
+}
+
+static void RegisterMod() {
+ ConfigurationChanged();
+}
+
+static Holiday holiday(DrawMenu, RegisterMod);
diff --git a/soh/soh/Enhancements/Holiday/Archez.h b/soh/soh/Enhancements/Holiday/Archez.h
new file mode 100644
index 000000000..93bd27457
--- /dev/null
+++ b/soh/soh/Enhancements/Holiday/Archez.h
@@ -0,0 +1,17 @@
+#ifndef ARCHEZ_H
+#define ARCHEZ_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void SkipOverrideNextLimb();
+void SkipOverrideNextSkeleton();
+void ClearOverrideSkips();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // ARCHEZ_H
diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h
index 105a44334..1fb5d2d90 100644
--- a/soh/soh/Enhancements/game-interactor/GameInteractor.h
+++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h
@@ -502,6 +502,9 @@ typedef enum {
// Vanilla condition: Actor is ACTOR_EN_ELF, ACTOR_EN_FISH, ACTOR_EN_ICE_HONO, or ACTOR_EN_INSECT
// Opt: *Actor
VB_BOTTLE_ACTOR,
+
+ VB_DRAW_SKEL_LIMB,
+ VB_DRAW_SKEL_FLEX_LIMB,
} GIVanillaBehavior;
#ifdef __cplusplus
diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c
index 52a2d49fa..576bf1eaf 100644
--- a/soh/src/code/z_player_lib.c
+++ b/soh/src/code/z_player_lib.c
@@ -12,6 +12,7 @@
#include
#include
+#include "soh/Enhancements/Holiday/Archez.h"
typedef struct {
/* 0x00 */ u8 flag;
@@ -1422,6 +1423,10 @@ s32 Player_OverrideLimbDrawGameplayDefault(PlayState* play, s32 limbIndex, Gfx**
sLeftHandType = PLAYER_MODELTYPE_LH_CLOSED;
}
+ if (sLeftHandType != PLAYER_MODELTYPE_LH_OPEN && sLeftHandType != PLAYER_MODELTYPE_LH_CLOSED) {
+ SkipOverrideNextLimb();
+ }
+
*dList = ResourceMgr_LoadGfxByName(dLists[sDListsLodOffset]);
} else if (limbIndex == PLAYER_LIMB_R_HAND) {
Gfx** dLists = this->rightHandDLists;
@@ -1433,8 +1438,13 @@ s32 Player_OverrideLimbDrawGameplayDefault(PlayState* play, s32 limbIndex, Gfx**
sRightHandType = PLAYER_MODELTYPE_RH_CLOSED;
}
+ if (sRightHandType != PLAYER_MODELTYPE_RH_OPEN && sRightHandType != PLAYER_MODELTYPE_RH_CLOSED) {
+ SkipOverrideNextLimb();
+ }
+
*dList = ResourceMgr_LoadGfxByName(dLists[sDListsLodOffset]);
} else if (limbIndex == PLAYER_LIMB_SHEATH) {
+ SkipOverrideNextLimb();
Gfx** dLists = this->sheathDLists;
if ((this->sheathType == PLAYER_MODELTYPE_SHEATH_18) || (this->sheathType == PLAYER_MODELTYPE_SHEATH_19)) {
@@ -1491,10 +1501,13 @@ s32 Player_OverrideLimbDrawGameplayFirstPerson(PlayState* play, s32 limbIndex, G
}
*dList = sFirstPersonLeftHandDLs[handOutDlIndex];
} else if (limbIndex == PLAYER_LIMB_R_SHOULDER) {
+ SkipOverrideNextLimb();
*dList = sFirstPersonRightShoulderDLs[gSaveContext.linkAge];
} else if (limbIndex == PLAYER_LIMB_R_FOREARM) {
+ SkipOverrideNextLimb();
*dList = sFirstPersonForearmDLs[gSaveContext.linkAge];
} else if (limbIndex == PLAYER_LIMB_R_HAND) {
+ SkipOverrideNextLimb();
s32 firstPersonWeaponIndex = gSaveContext.linkAge;
if (CVarGetInteger(CVAR_ENHANCEMENT("BowSlingshotAmmoFix"), 0) || CVarGetInteger(CVAR_ENHANCEMENT("EquipmentAlwaysVisible"), 0)) {
if (Player_HoldsBow(this)) {
diff --git a/soh/src/code/z_skelanime.c b/soh/src/code/z_skelanime.c
index e91de847b..d513973fb 100644
--- a/soh/src/code/z_skelanime.c
+++ b/soh/src/code/z_skelanime.c
@@ -5,6 +5,9 @@
#include
#include "soh/OTRGlobals.h"
#include "soh/ResourceManagerHelpers.h"
+#include "soh/Enhancements/game-interactor/GameInteractor.h"
+#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh/Enhancements/Holiday/Archez.h"
#define ANIM_INTERP 1
@@ -45,7 +48,7 @@ void SkelAnime_DrawLimbLod(PlayState* play, s32 limbIndex, void** skeleton, Vec3
if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, limbIndex, &dList, &pos, &rot, arg)) {
Matrix_TranslateRotateZYX(&pos, &rot);
- if (dList != NULL) {
+ if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, dList != NULL, &POLY_OPA_DISP, dList)) {
gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_LOAD);
gSPDisplayList(POLY_OPA_DISP++, dList);
}
@@ -105,7 +108,7 @@ void SkelAnime_DrawLod(PlayState* play, void** skeleton, Vec3s* jointTable,
if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, 1, &dList, &pos, &rot, arg)) {
Matrix_TranslateRotateZYX(&pos, &rot);
- if (dList != NULL) {
+ if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, dList != NULL, &POLY_OPA_DISP, dList)) {
gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_LOAD);
gSPDisplayList(POLY_OPA_DISP++, dList);
}
@@ -122,6 +125,8 @@ void SkelAnime_DrawLod(PlayState* play, void** skeleton, Vec3s* jointTable,
Matrix_Pop();
CLOSE_DISPS(play->state.gfxCtx);
+
+ ClearOverrideSkips();
}
/**
@@ -158,8 +163,10 @@ void SkelAnime_DrawFlexLimbLod(PlayState* play, s32 limbIndex, void** skeleton,
MATRIX_TOMTX(*mtx);
{
OPEN_DISPS(play->state.gfxCtx);
- gSPMatrix(POLY_OPA_DISP++, *mtx, G_MTX_LOAD);
- gSPDisplayList(POLY_OPA_DISP++, newDList);
+ if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, true, &POLY_OPA_DISP, newDList, *mtx)) {
+ gSPMatrix(POLY_OPA_DISP++, *mtx, G_MTX_LOAD);
+ gSPDisplayList(POLY_OPA_DISP++, newDList);
+ }
CLOSE_DISPS(play->state.gfxCtx);
}
(*mtx)++;
@@ -231,8 +238,10 @@ void SkelAnime_DrawFlexLod(PlayState* play, void** skeleton, Vec3s* jointTable,
if (newDList != NULL) {
MATRIX_TOMTX(mtx);
gDPNoOpString(POLY_OPA_DISP++, "T5ST", 0);
- gSPMatrix(POLY_OPA_DISP++, mtx, G_MTX_LOAD);
- gSPDisplayList(POLY_OPA_DISP++, newDList);
+ if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, true, &POLY_OPA_DISP, newDList, *mtx)) {
+ gSPMatrix(POLY_OPA_DISP++, mtx, G_MTX_LOAD);
+ gSPDisplayList(POLY_OPA_DISP++, newDList);
+ }
mtx++;
} else if (limbDList != NULL) {
MATRIX_TOMTX(mtx);
@@ -251,6 +260,8 @@ void SkelAnime_DrawFlexLod(PlayState* play, void** skeleton, Vec3s* jointTable,
Matrix_Pop();
CLOSE_DISPS(play->state.gfxCtx);
+
+ ClearOverrideSkips();
}
/**
@@ -276,7 +287,7 @@ void SkelAnime_DrawLimbOpa(PlayState* play, s32 limbIndex, void** skeleton, Vec3
if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, limbIndex, &dList, &pos, &rot, arg)) {
Matrix_TranslateRotateZYX(&pos, &rot);
- if (dList != NULL) {
+ if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, dList != NULL, &POLY_OPA_DISP, dList)) {
gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_LOAD);
gSPDisplayList(POLY_OPA_DISP++, dList);
}
@@ -358,7 +369,7 @@ void SkelAnime_DrawOpa(PlayState* play, void** skeleton, Vec3s* jointTable,
if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, 1, &dList, &pos, &rot, arg)) {
Matrix_TranslateRotateZYX(&pos, &rot);
- if (dList != NULL) {
+ if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, dList != NULL, &POLY_OPA_DISP, dList)) {
gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_LOAD);
gSPDisplayList(POLY_OPA_DISP++, dList);
}
@@ -375,6 +386,8 @@ void SkelAnime_DrawOpa(PlayState* play, void** skeleton, Vec3s* jointTable,
Matrix_Pop();
CLOSE_DISPS(play->state.gfxCtx);
+
+ ClearOverrideSkips();
}
/**
@@ -409,8 +422,10 @@ void SkelAnime_DrawFlexLimbOpa(PlayState* play, s32 limbIndex, void** skeleton,
Matrix_TranslateRotateZYX(&pos, &rot);
if (newDList != NULL) {
MATRIX_TOMTX(*limbMatricies);
- gSPMatrix(POLY_OPA_DISP++, *limbMatricies, G_MTX_LOAD);
- gSPDisplayList(POLY_OPA_DISP++, newDList);
+ if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, true, &POLY_OPA_DISP, newDList, *limbMatricies)) {
+ gSPMatrix(POLY_OPA_DISP++, *limbMatricies, G_MTX_LOAD);
+ gSPDisplayList(POLY_OPA_DISP++, newDList);
+ }
(*limbMatricies)++;
} else if (limbDList != NULL) {
MATRIX_TOMTX(*limbMatricies);
@@ -478,8 +493,10 @@ void SkelAnime_DrawFlexOpa(PlayState* play, void** skeleton, Vec3s* jointTable,
Matrix_TranslateRotateZYX(&pos, &rot);
if (newDList != NULL) {
MATRIX_TOMTX(mtx);
- gSPMatrix(POLY_OPA_DISP++, mtx, G_MTX_LOAD);
- gSPDisplayList(POLY_OPA_DISP++, newDList);
+ if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, true, &POLY_OPA_DISP, newDList, *mtx)) {
+ gSPMatrix(POLY_OPA_DISP++, mtx, G_MTX_LOAD);
+ gSPDisplayList(POLY_OPA_DISP++, newDList);
+ }
mtx++;
} else if (limbDList != NULL) {
MATRIX_TOMTX(mtx);
@@ -498,6 +515,8 @@ void SkelAnime_DrawFlexOpa(PlayState* play, void** skeleton, Vec3s* jointTable,
Matrix_Pop();
CLOSE_DISPS(play->state.gfxCtx);
+
+ ClearOverrideSkips();
}
/**
@@ -576,7 +595,7 @@ Gfx* SkelAnime_DrawLimb(PlayState* play, s32 limbIndex, void** skeleton, Vec3s*
if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, limbIndex, &dList, &pos, &rot, arg, &gfx)) {
Matrix_TranslateRotateZYX(&pos, &rot);
- if (dList != NULL) {
+ if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, dList != NULL, &gfx, dList)) {
gSPMatrix(gfx++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_LOAD);
gSPDisplayList(gfx++, dList);
}
@@ -634,7 +653,7 @@ Gfx* SkelAnime_Draw(PlayState* play, void** skeleton, Vec3s* jointTable, Overrid
if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, 1, &dList, &pos, &rot, arg, &gfx)) {
Matrix_TranslateRotateZYX(&pos, &rot);
- if (dList != NULL) {
+ if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, dList != NULL, &gfx, dList)) {
gSPMatrix(gfx++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_LOAD);
gSPDisplayList(gfx++, dList);
}
@@ -651,6 +670,8 @@ Gfx* SkelAnime_Draw(PlayState* play, void** skeleton, Vec3s* jointTable, Overrid
Matrix_Pop();
+ ClearOverrideSkips();
+
return gfx;
}
@@ -681,8 +702,10 @@ Gfx* SkelAnime_DrawFlexLimb(PlayState* play, s32 limbIndex, void** skeleton, Vec
Matrix_TranslateRotateZYX(&pos, &rot);
if (newDList != NULL) {
MATRIX_TOMTX(*mtx);
- gSPMatrix(gfx++, *mtx, G_MTX_LOAD);
- gSPDisplayList(gfx++, newDList);
+ if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, true, &gfx, newDList, *mtx)) {
+ gSPMatrix(gfx++, *mtx, G_MTX_LOAD);
+ gSPDisplayList(gfx++, newDList);
+ }
(*mtx)++;
} else if (limbDList != NULL) {
MATRIX_TOMTX(*mtx);
@@ -746,8 +769,10 @@ Gfx* SkelAnime_DrawFlex(PlayState* play, void** skeleton, Vec3s* jointTable, s32
Matrix_TranslateRotateZYX(&pos, &rot);
if (newDList != NULL) {
MATRIX_TOMTX(mtx);
- gSPMatrix(gfx++, mtx, G_MTX_LOAD);
- gSPDisplayList(gfx++, newDList);
+ if (GameInteractor_Should(VB_DRAW_SKEL_LIMB, true, &gfx, newDList, *mtx)) {
+ gSPMatrix(gfx++, mtx, G_MTX_LOAD);
+ gSPDisplayList(gfx++, newDList);
+ }
mtx++;
} else if (limbDList != NULL) {
MATRIX_TOMTX(mtx);
@@ -764,6 +789,8 @@ Gfx* SkelAnime_DrawFlex(PlayState* play, void** skeleton, Vec3s* jointTable, s32
Matrix_Pop();
+ ClearOverrideSkips();
+
return gfx;
}
diff --git a/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c b/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c
index e256042ee..468f8059e 100644
--- a/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c
+++ b/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c
@@ -15,6 +15,8 @@
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#include "soh_assets.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED)
typedef enum {
@@ -1351,6 +1353,8 @@ s32 BossGanondrof_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList,
case 15:
if ((this->actionFunc == BossGanondrof_Intro) && this->work[GND_MASK_OFF]) {
*dList = gPhantomGanonFaceDL;
+ } else {
+ SkipOverrideNextLimb();
}
rot->y += this->rideRotY[limbIndex];
rot->z += this->rideRotZ[limbIndex];
@@ -1410,6 +1414,10 @@ s32 BossGanondrof_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList,
break;
}
+ if (limbIndex == 12) {
+ SkipOverrideNextLimb();
+ }
+
return 0;
}
diff --git a/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c b/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c
index e3551d90f..d2ce91a69 100644
--- a/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c
+++ b/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c
@@ -8,6 +8,8 @@
#include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED)
// IRIS_FOLLOW: gohma looks towards the player (iris rotation)
@@ -1980,6 +1982,7 @@ s32 BossGoma_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
switch (limbIndex) {
case BOSSGOMA_LIMB_EYE:
+ SkipOverrideNextLimb();
if (this->eyeState == EYESTATE_IRIS_FOLLOW_BONUS_IFRAMES && this->eyeLidBottomRotX < -0xA8C) {
*dList = NULL;
} else if (this->invincibilityFrames != 0) {
@@ -1992,10 +1995,12 @@ s32 BossGoma_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
break;
case BOSSGOMA_LIMB_EYE_LID_BOTTOM_ROOT2:
+ SkipOverrideNextLimb();
rot->x += this->eyeLidBottomRotX;
break;
case BOSSGOMA_LIMB_EYE_LID_TOP_ROOT2:
+ SkipOverrideNextLimb();
rot->x += this->eyeLidTopRotX;
break;
diff --git a/soh/src/overlays/actors/ovl_Boss_Sst/z_boss_sst.c b/soh/src/overlays/actors/ovl_Boss_Sst/z_boss_sst.c
index 005a8a089..0126ce3de 100644
--- a/soh/src/overlays/actors/ovl_Boss_Sst/z_boss_sst.c
+++ b/soh/src/overlays/actors/ovl_Boss_Sst/z_boss_sst.c
@@ -15,6 +15,8 @@
#include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_DRAGGED_BY_HOOKSHOT)
#define vParity actionVar
@@ -2862,6 +2864,11 @@ s32 BossSst_OverrideHeadDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
rot->z -= 0x200;
}
}
+
+ if (limbIndex == 7) {
+ SkipOverrideNextLimb();
+ }
+
return false;
}
diff --git a/soh/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c b/soh/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c
index 0e3c3ba08..cc6fa356b 100644
--- a/soh/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c
+++ b/soh/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c
@@ -8,6 +8,7 @@
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#include
+#include "soh/Enhancements/Holiday/Archez.h"
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED)
@@ -3191,6 +3192,10 @@ s32 BossTw_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
}
}
+ if (limbIndex == 14) {
+ SkipOverrideNextLimb();
+ }
+
return false;
}
@@ -3621,6 +3626,10 @@ s32 BossTw_TwinrovaOverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList,
*dList = NULL;
}
+ if (limbIndex == 34 || limbIndex == 40) {
+ SkipOverrideNextLimb();
+ }
+
CLOSE_DISPS(play->state.gfxCtx);
return false;
diff --git a/soh/src/overlays/actors/ovl_Boss_Va/z_boss_va.c b/soh/src/overlays/actors/ovl_Boss_Va/z_boss_va.c
index 8a7368647..327e3b053 100644
--- a/soh/src/overlays/actors/ovl_Boss_Va/z_boss_va.c
+++ b/soh/src/overlays/actors/ovl_Boss_Va/z_boss_va.c
@@ -19,6 +19,8 @@
#include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED)
#define GET_BODY(this) ((BossVa*)(this)->actor.parent)
@@ -3265,6 +3267,7 @@ void BossVa_Draw(Actor* thisx, PlayState* play) {
break;
default:
if (!this->isDead) {
+ SkipOverrideNextSkeleton();
SkelAnime_DrawSkeletonOpa(play, &this->skelAnime,
BossVa_BariOverrideLimbDraw, BossVa_BariPostLimbDraw, this);
Collider_UpdateSpheres(0, &this->colliderSph);
diff --git a/soh/src/overlays/actors/ovl_Door_Killer/z_door_killer.c b/soh/src/overlays/actors/ovl_Door_Killer/z_door_killer.c
index aeb3e1f33..01245ccb2 100644
--- a/soh/src/overlays/actors/ovl_Door_Killer/z_door_killer.c
+++ b/soh/src/overlays/actors/ovl_Door_Killer/z_door_killer.c
@@ -13,6 +13,8 @@
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#include "soh/ResourceManagerHelpers.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED
typedef enum {
@@ -533,6 +535,7 @@ void DoorKiller_DrawDoor(Actor* thisx, PlayState* play) {
Gfx_SetupDL_37Opa(play->state.gfxCtx);
DoorKiller_SetTexture(&this->actor, play);
+ SkipOverrideNextSkeleton();
SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, NULL, NULL);
}
diff --git a/soh/src/overlays/actors/ovl_En_Am/z_en_am.c b/soh/src/overlays/actors/ovl_En_Am/z_en_am.c
index a619b2bf0..8a4fdd006 100644
--- a/soh/src/overlays/actors/ovl_En_Am/z_en_am.c
+++ b/soh/src/overlays/actors/ovl_En_Am/z_en_am.c
@@ -11,6 +11,8 @@
#include "soh_assets.h"
#include "soh/ResourceManagerHelpers.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_CAN_PRESS_SWITCH)
void EnAm_Init(Actor* thisx, PlayState* play);
@@ -978,6 +980,7 @@ void EnAm_Draw(Actor* thisx, PlayState* play) {
Gfx_SetupDL_25Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, this->textureBlend);
+ SkipOverrideNextSkeleton();
SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, EnAm_PostLimbDraw,
this);
diff --git a/soh/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c b/soh/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c
index c13833d6d..7323509d1 100644
--- a/soh/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c
+++ b/soh/src/overlays/actors/ovl_En_Arrow/z_en_arrow.c
@@ -8,6 +8,8 @@
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_gi_nuts/object_gi_nuts.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED)
void EnArrow_Init(Actor* thisx, PlayState* play);
@@ -501,6 +503,7 @@ void EnArrow_Draw(Actor* thisx, PlayState* play) {
if (this->actor.params <= ARROW_0E) {
Gfx_SetupDL_25Opa(play->state.gfxCtx);
+ SkipOverrideNextSkeleton();
SkelAnime_DrawLod(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, this,
(this->actor.projectedPos.z < MREG(95)) ? 0 : 1);
} else if (this->actor.speedXZ != 0.0f) {
diff --git a/soh/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c b/soh/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
index ca210b62b..95bf11825 100644
--- a/soh/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
+++ b/soh/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
@@ -3,6 +3,8 @@
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#include "soh/ResourceManagerHelpers.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED)
void EnBigokuta_Init(Actor* thisx, PlayState* play);
@@ -868,6 +870,11 @@ s32 EnBigokuta_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
Matrix_Scale(1.0f, 1.25f - temp_f0, 1.25f - temp_f0, MTXMODE_APPLY);
}
}
+
+ if (limbIndex == 15 || limbIndex == 16 || limbIndex == CVarGetInteger("gMyThing", 0)) {
+ SkipOverrideNextLimb();
+ }
+
return false;
}
diff --git a/soh/src/overlays/actors/ovl_En_Door/z_en_door.c b/soh/src/overlays/actors/ovl_En_Door/z_en_door.c
index 56f1f5b1e..621b0d79f 100644
--- a/soh/src/overlays/actors/ovl_En_Door/z_en_door.c
+++ b/soh/src/overlays/actors/ovl_En_Door/z_en_door.c
@@ -12,6 +12,8 @@
#include "objects/object_haka_door/object_haka_door.h"
#include "soh/ResourceManagerHelpers.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED
#define DOOR_AJAR_SLAM_RANGE 120.0f
@@ -339,6 +341,7 @@ void EnDoor_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
Gfx_SetupDL_25Opa(play->state.gfxCtx);
+ SkipOverrideNextSkeleton();
SkelAnime_DrawSkeletonOpa(play, &this->skelAnime,
EnDoor_OverrideLimbDraw,
NULL, &this->actor);
diff --git a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c
index e538949b8..767e1a244 100644
--- a/soh/src/overlays/actors/ovl_En_Go/z_en_go.c
+++ b/soh/src/overlays/actors/ovl_En_Go/z_en_go.c
@@ -6,6 +6,8 @@
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
#include "soh/OTRGlobals.h"
+#include "soh_assets.h"
+
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED)
void EnGo_Init(Actor* thisx, PlayState* play);
@@ -1055,10 +1057,15 @@ void EnGo_DrawCurledUp(EnGo* this, PlayState* play) {
Matrix_Push();
Gfx_SetupDL_25Opa(play->state.gfxCtx);
- gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
-
- gSPDisplayList(POLY_OPA_DISP++, gGoronDL_00BD80);
+ if (CVarGetInteger("gHoliday.Archez.SnowGolems", 0)) {
+ Matrix_Translate(0.0f, 10.0f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.75f, 1.75f, 1.75f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSnowballDL);
+ } else {
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gGoronDL_00BD80);
+ }
Matrix_MultVec3f(&D_80A41BB4, &this->actor.focus.pos);
Matrix_Pop();
@@ -1075,9 +1082,15 @@ void EnGo_DrawRolling(EnGo* this, PlayState* play) {
Gfx_SetupDL_25Opa(play->state.gfxCtx);
Matrix_RotateZYX((s16)(play->state.frames * ((s16)this->actor.speedXZ * 1400)), 0, this->actor.shape.rot.z,
MTXMODE_APPLY);
- gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, gGoronDL_00C140);
+ if (CVarGetInteger("gHoliday.Archez.SnowGolems", 0)) {
+ Matrix_Translate(0.0f, -10.0f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.75f, 1.75f, 1.75f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSnowballDL);
+ } else {
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gGoronDL_00C140);
+ }
Matrix_MultVec3f(&D_80A41BC0, &this->actor.focus.pos);
Matrix_Pop();
diff --git a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c
index a483de7d5..5028a997a 100644
--- a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c
+++ b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c
@@ -8,6 +8,8 @@
#include "soh/ResourceManagerHelpers.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh_assets.h"
+
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED)
/*
@@ -2010,9 +2012,15 @@ s32 EnGo2_DrawCurledUp(EnGo2* this, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
Gfx_SetupDL_25Opa(play->state.gfxCtx);
- gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, gGoronDL_00BD80);
+ if (CVarGetInteger("gHoliday.Archez.SnowGolems", 0)) {
+ Matrix_Translate(0.0f, 10.0f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.75f, 1.75f, 1.75f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSnowballDL);
+ } else {
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gGoronDL_00BD80);
+ }
CLOSE_DISPS(play->state.gfxCtx);
Matrix_MultVec3f(&D_80A48554, &this->actor.focus.pos);
@@ -2028,9 +2036,17 @@ s32 EnGo2_DrawRolling(EnGo2* this, PlayState* play) {
Gfx_SetupDL_25Opa(play->state.gfxCtx);
speedXZ = this->actionFunc == EnGo2_ReverseRolling ? 0.0f : this->actor.speedXZ;
Matrix_RotateZYX((play->state.frames * ((s16)speedXZ * 1400)), 0, this->actor.shape.rot.z, MTXMODE_APPLY);
- gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, gGoronDL_00C140);
+ if (CVarGetInteger("gHoliday.Archez.SnowGolems", 0)) {
+ Matrix_Translate(0.0f, -10.0f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(1.75f, 1.75f, 1.75f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gSnowballDL);
+ } else {
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, gGoronDL_00C140);
+ }
CLOSE_DISPS(play->state.gfxCtx);
Matrix_MultVec3f(&D_80A48560, &this->actor.focus.pos);
return 1;
diff --git a/soh/src/overlays/actors/ovl_En_Hata/z_en_hata.c b/soh/src/overlays/actors/ovl_En_Hata/z_en_hata.c
index 6e36e2027..4a5917733 100644
--- a/soh/src/overlays/actors/ovl_En_Hata/z_en_hata.c
+++ b/soh/src/overlays/actors/ovl_En_Hata/z_en_hata.c
@@ -7,6 +7,8 @@
#include "z_en_hata.h"
#include "objects/object_hata/object_hata.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS 0
void EnHata_Init(Actor* thisx, PlayState* play);
@@ -130,6 +132,11 @@ s32 EnHata_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
rot->y += limbs[limbIndex].y;
rot->z += limbs[limbIndex].z;
}
+
+ if (limbIndex == FLAGPOLE_LIMB_POLE_BASE || limbIndex == FLAGPOLE_LIMB_POLE) {
+ SkipOverrideNextLimb();
+ }
+
return false;
}
diff --git a/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c b/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c
index 90d47b098..a0dc814ad 100644
--- a/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c
+++ b/soh/src/overlays/actors/ovl_En_Heishi1/z_en_heishi1.c
@@ -9,6 +9,8 @@
#include "vt.h"
#include "soh/ResourceManagerHelpers.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED
void EnHeishi1_Init(Actor* thisx, PlayState* play);
@@ -498,6 +500,10 @@ s32 EnHeishi1_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3
rot->x += (s16)this->headAngle;
}
+ if (limbIndex == 15) {
+ SkipOverrideNextLimb();
+ }
+
return false;
}
diff --git a/soh/src/overlays/actors/ovl_En_Heishi2/z_en_heishi2.c b/soh/src/overlays/actors/ovl_En_Heishi2/z_en_heishi2.c
index 763f73df4..6adccbb1a 100644
--- a/soh/src/overlays/actors/ovl_En_Heishi2/z_en_heishi2.c
+++ b/soh/src/overlays/actors/ovl_En_Heishi2/z_en_heishi2.c
@@ -13,6 +13,8 @@
#include "overlays/actors/ovl_Bg_Spot15_Saku/z_bg_spot15_saku.h"
#include "soh/ResourceManagerHelpers.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
void EnHeishi2_Init(Actor* thisx, PlayState* play);
@@ -817,6 +819,10 @@ s32 EnHeishi2_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3
}
}
+ if (limbIndex == 15) {
+ SkipOverrideNextLimb();
+ }
+
return false;
}
diff --git a/soh/src/overlays/actors/ovl_En_Heishi3/z_en_heishi3.c b/soh/src/overlays/actors/ovl_En_Heishi3/z_en_heishi3.c
index 755c687bf..8a8113de3 100644
--- a/soh/src/overlays/actors/ovl_En_Heishi3/z_en_heishi3.c
+++ b/soh/src/overlays/actors/ovl_En_Heishi3/z_en_heishi3.c
@@ -9,6 +9,8 @@
#include "vt.h"
#include "soh/ResourceManagerHelpers.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS 0
void EnHeishi3_Init(Actor* thisx, PlayState* play);
@@ -245,6 +247,10 @@ s32 EnHeishi3_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3
rot->z += this->unk_264;
}
+ if (limbIndex == 15) {
+ SkipOverrideNextLimb();
+ }
+
return false;
}
diff --git a/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c b/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c
index 40d61a15e..4d590711c 100644
--- a/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c
+++ b/soh/src/overlays/actors/ovl_En_Heishi4/z_en_heishi4.c
@@ -5,6 +5,8 @@
#include "soh/OTRGlobals.h"
#include "soh/ResourceManagerHelpers.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)
void EnHeishi4_Init(Actor* thisx, PlayState* play);
@@ -414,6 +416,11 @@ s32 EnHeishi_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
rot->x += this->unk_260.y;
rot->z += this->unk_260.z;
}
+
+ if (limbIndex == 15) {
+ SkipOverrideNextLimb();
+ }
+
return false;
}
diff --git a/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c b/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c
index 53712235e..bba742b73 100644
--- a/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c
+++ b/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c
@@ -12,6 +12,8 @@
#include "soh_assets.h"
#include "soh/ResourceManagerHelpers.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS ACTOR_FLAG_UPDATE_WHILE_CULLED
typedef void (*EnIkDrawFunc)(struct EnIk*, PlayState*);
@@ -846,6 +848,11 @@ s32 EnIk_OverrideLimbDraw3(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
*dList = NULL;
}
}
+
+ if (limbIndex == 17) {
+ SkipOverrideNextLimb();
+ }
+
return false;
}
@@ -1193,6 +1200,10 @@ s32 EnIk_OverrideLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
}
}
+ if (limbIndex == 17) {
+ SkipOverrideNextLimb();
+ }
+
return 0;
}
@@ -1359,6 +1370,7 @@ s32 EnIk_OverrideLimbDraw1(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
if (curFrame < 120.0f) {
*dList = NULL;
} else {
+ SkipOverrideNextLimb();
func_80A76E2C(this, play, pos);
}
break;
diff --git a/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c b/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c
index fa1a4a776..7e1b72518 100644
--- a/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c
+++ b/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c
@@ -10,6 +10,8 @@
#include "soh_assets.h"
#include "soh/ResourceManagerHelpers.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED)
typedef enum {
@@ -340,6 +342,7 @@ void EnJj_Draw(Actor* thisx, PlayState* play2) {
Matrix_Translate(0.0f, (cosf(this->skelAnime.curFrame * (M_PI / 41.0f)) * 10.0f) - 10.0f, 0.0f, MTXMODE_APPLY);
Matrix_Scale(10.0f, 10.0f, 10.0f, MTXMODE_APPLY);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(eyeTextures[this->eyeIndex]));
+ SkipOverrideNextSkeleton();
SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, EnJj_PostLimbDraw, this);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c b/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c
index 979cc8d68..c92ac65fd 100644
--- a/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c
+++ b/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c
@@ -9,6 +9,8 @@
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#include "soh/ResourceManagerHelpers.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
/*
* This actor can have three behaviors:
* - "Spear Guard" (variable -1): uses a spear, walks around home point, charges player if too close
@@ -1551,6 +1553,22 @@ void EnMb_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
}
}
+s32 EnMb_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) {
+ EnMb* this = (EnMb*)thisx;
+
+ if (this->actor.params == ENMB_TYPE_CLUB) {
+ if (limbIndex == ENMB_LIMB_LHAND) {
+ SkipOverrideNextLimb();
+ }
+ } else {
+ if (limbIndex == ENMB_LIMB_RHAND) {
+ SkipOverrideNextLimb();
+ }
+ }
+
+ return 0;
+}
+
void EnMb_Draw(Actor* thisx, PlayState* play) {
static Vec3f frontShieldingTriModel0[] = {
{ 4000.0f, 7000.0f, 3500.0f },
@@ -1570,7 +1588,7 @@ void EnMb_Draw(Actor* thisx, PlayState* play) {
EnMb* this = (EnMb*)thisx;
Gfx_SetupDL_25Opa(play->state.gfxCtx);
- SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, NULL, EnMb_PostLimbDraw, thisx);
+ SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnMb_OverrideLimbDraw, EnMb_PostLimbDraw, thisx);
if (thisx->params != ENMB_TYPE_CLUB) {
if (this->attack > ENMB_ATTACK_NONE) {
diff --git a/soh/src/overlays/actors/ovl_En_Snowball/z_en_snowball.c b/soh/src/overlays/actors/ovl_En_Snowball/z_en_snowball.c
index a6c07a245..39df87867 100644
--- a/soh/src/overlays/actors/ovl_En_Snowball/z_en_snowball.c
+++ b/soh/src/overlays/actors/ovl_En_Snowball/z_en_snowball.c
@@ -218,12 +218,12 @@ void EnSnowball_Draw(Actor* thisx, PlayState* play) {
Gfx_SetupDL_25Opa(play->state.gfxCtx);
Matrix_RotateZYX(this->sRot, thisx->world.rot.y, 0, MTXMODE_APPLY);
-
- Matrix_Translate(0.0f, 7600.0f, -148.649f, MTXMODE_APPLY);
- Matrix_Scale(4.844f, 4.844f, 4.844f, MTXMODE_APPLY);
+
+ Matrix_Translate(0.0f, 5.0f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(0.5f, 0.5f, 0.5f, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, gLinkAdultPompomDL);
+ gSPDisplayList(POLY_OPA_DISP++, gSnowballDL);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/soh/src/overlays/actors/ovl_En_Test/z_en_test.c b/soh/src/overlays/actors/ovl_En_Test/z_en_test.c
index 2306ef2f9..5603aa253 100644
--- a/soh/src/overlays/actors/ovl_En_Test/z_en_test.c
+++ b/soh/src/overlays/actors/ovl_En_Test/z_en_test.c
@@ -10,6 +10,8 @@
#include "soh_assets.h"
#include "soh/ResourceManagerHelpers.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED)
void EnTest_Init(Actor* thisx, PlayState* play);
@@ -1845,6 +1847,10 @@ s32 EnTest_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
*dList = NULL;
}
+ if (limbIndex == STALFOS_LIMB_SWORD || limbIndex == STALFOS_LIMB_SHIELD) {
+ SkipOverrideNextLimb();
+ }
+
return false;
}
diff --git a/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c b/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c
index 28bc936c5..4186534c1 100644
--- a/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c
+++ b/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c
@@ -8,6 +8,8 @@
#include "objects/object_torch2/object_torch2.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED)
typedef enum {
@@ -772,6 +774,10 @@ s32 EnTorch2_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
Gfx** gfx) {
Player* this = (Player*)thisx;
+ if (limbIndex == PLAYER_LIMB_L_HAND || limbIndex == PLAYER_LIMB_R_HAND) {
+ SkipOverrideNextLimb();
+ }
+
return Player_OverrideLimbDrawGameplayCommon(play, limbIndex, dList, pos, rot, &this->actor);
}
diff --git a/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c b/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c
index d30607ea0..02c4190a1 100644
--- a/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c
+++ b/soh/src/overlays/actors/ovl_En_Vm/z_en_vm.c
@@ -12,6 +12,8 @@
#include "soh_assets.h"
#include "soh/ResourceManagerHelpers.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UPDATE_WHILE_CULLED)
void EnVm_Init(Actor* thisx, PlayState* play);
@@ -544,6 +546,7 @@ void EnVm_Draw(Actor* thisx, PlayState* play2) {
Gfx_SetupDL_25Opa(play->state.gfxCtx);
Gfx_SetupDL_25Xlu(play->state.gfxCtx);
+ SkipOverrideNextSkeleton();
SkelAnime_DrawSkeletonOpa(play, &this->skelAnime, EnVm_OverrideLimbDraw,
EnVm_PostLimbDraw, this);
actorPos = this->actor.world.pos;
diff --git a/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c b/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c
index 2ef15102c..81fbb684d 100644
--- a/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c
+++ b/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c
@@ -10,6 +10,8 @@
#include "soh_assets.h"
#include "soh/ResourceManagerHelpers.h"
+#include "soh/Enhancements/Holiday/Archez.h"
+
#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_WHILE_CULLED)
void EnZf_Init(Actor* thisx, PlayState* play);
@@ -2132,11 +2134,13 @@ s32 EnZf_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
rot->y -= this->headRot;
break;
case ENZF_LIMB_SWORD:
+ SkipOverrideNextLimb();
if (this->swordSheathed) {
*dList = gZfEmptyHandDL;
}
break;
case ENZF_LIMB_SCABBARD:
+ SkipOverrideNextLimb();
if (this->swordSheathed) {
*dList = gZfSheathedSwordDL;
}
@@ -2434,4 +2438,4 @@ s32 EnZf_DodgeRangedWaiting(PlayState* play, EnZf* this) {
void EnZf_Reset(void) {
D_80B4A1B0 = 0;
D_80B4A1B4 = 1;
-}
\ No newline at end of file
+}