Fix custom tunics not updating on scene change (#6026)

This commit is contained in:
aMannus
2025-12-31 00:21:53 +01:00
committed by GitHub
parent fbfef95617
commit e96503c0bd
6 changed files with 21 additions and 17 deletions

View File

@@ -8,21 +8,8 @@ extern "C" {
extern PlayState* gPlayState;
}
static void UpdateCustomSkeletonOnEquipTunic() {
if (!GameInteractor::IsSaveLoaded() || gPlayState == NULL) {
return;
}
static int8_t previousTunic = -1;
int8_t equippedTunic = CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC);
if (equippedTunic != previousTunic) {
SOH::SkeletonPatcher::UpdateCustomSkeletons();
previousTunic = equippedTunic;
}
}
static void UpdateCustomSkeletonOnAssetAltChange() {
if (!GameInteractor::IsSaveLoaded() || gPlayState == NULL) {
static void UpdateCustomSkeleton() {
if (!GameInteractor::IsSaveLoaded(true) || gPlayState == NULL) {
return;
}
@@ -30,8 +17,9 @@ static void UpdateCustomSkeletonOnAssetAltChange() {
}
static void RegisterCustomSkeletons() {
COND_HOOK(OnGameFrameUpdate, true, UpdateCustomSkeletonOnEquipTunic);
COND_HOOK(OnAssetAltChange, true, UpdateCustomSkeletonOnAssetAltChange);
COND_HOOK(OnAssetAltChange, true, UpdateCustomSkeleton);
COND_HOOK(OnLinkSkeletonInit, true, SOH::SkeletonPatcher::UpdateCustomSkeletons);
COND_HOOK(OnLinkEquipmentChange, true, SOH::SkeletonPatcher::UpdateCustomSkeletons);
}
static RegisterShipInitFunc initFunc(RegisterCustomSkeletons);

View File

@@ -22,6 +22,8 @@ DEFINE_HOOK(OnSceneFlagUnset, (int16_t sceneNum, int16_t flagType, int16_t flag)
DEFINE_HOOK(OnFlagSet, (int16_t flagType, int16_t flag));
DEFINE_HOOK(OnFlagUnset, (int16_t flagType, int16_t flag));
DEFINE_HOOK(OnSceneSpawnActors, ());
DEFINE_HOOK(OnLinkSkeletonInit, ());
DEFINE_HOOK(OnLinkEquipmentChange, ());
DEFINE_HOOK(OnPlayerUpdate, ());
DEFINE_HOOK(OnSetDoAction, (uint16_t action));
DEFINE_HOOK(OnPlayerSfx, (u16 sfxId));

View File

@@ -86,6 +86,14 @@ void GameInteractor_ExecuteOnSceneSpawnActors() {
GameInteractor::Instance->ExecuteHooks<GameInteractor::OnSceneSpawnActors>();
}
void GameInteractor_ExecuteOnLinkSkeletonInit() {
GameInteractor::Instance->ExecuteHooks<GameInteractor::OnLinkSkeletonInit>();
}
void GameInteractor_ExecuteOnLinkEquipmentChange() {
GameInteractor::Instance->ExecuteHooks<GameInteractor::OnLinkEquipmentChange>();
}
void GameInteractor_ExecuteOnPlayerUpdate() {
GameInteractor::Instance->ExecuteHooks<GameInteractor::OnPlayerUpdate>();
}

View File

@@ -25,6 +25,8 @@ void GameInteractor_ExecuteOnSceneFlagUnset(int16_t sceneNum, int16_t flagType,
void GameInteractor_ExecuteOnFlagSet(int16_t flagType, int16_t flag);
void GameInteractor_ExecuteOnFlagUnset(int16_t flagType, int16_t flag);
void GameInteractor_ExecuteOnSceneSpawnActors();
void GameInteractor_ExecuteOnLinkSkeletonInit();
void GameInteractor_ExecuteOnLinkEquipmentChange();
void GameInteractor_ExecuteOnPlayerUpdate();
void GameInteractor_ExecuteOnSetDoAction(uint16_t action);
void GameInteractor_ExecuteOnPlayerSfx(u16 sfxId);

View File

@@ -187,6 +187,8 @@ u8 gItemSlots[] = {
void Inventory_ChangeEquipment(s16 equipment, u16 value) {
gSaveContext.equips.equipment &= gEquipNegMasks[equipment];
gSaveContext.equips.equipment |= value << gEquipShifts[equipment];
GameInteractor_ExecuteOnLinkEquipmentChange();
}
u8 Inventory_DeleteEquipment(PlayState* play, s16 equipment) {

View File

@@ -1140,6 +1140,8 @@ void SkelAnime_InitLink(PlayState* play, SkelAnime* skelAnime, FlexSkeletonHeade
}
LinkAnimation_Change(play, skelAnime, animation, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f);
GameInteractor_ExecuteOnLinkSkeletonInit();
}
/**