From 14b3492792a4d04b935ae81dc5774c4bc9da73fb Mon Sep 17 00:00:00 2001 From: Reonu <15913880+Reonu@users.noreply.github.com> Date: Sat, 2 Aug 2025 23:39:02 +0100 Subject: [PATCH] WIP fix for pamela's dad anims --- patches/custom_syms.toml | 10 ++ .../object_harfgibud/object_harfgibud.h | 22 ++++ patches/specific_actor_transform_tagging.c | 122 ++++++++++++++++++ 3 files changed, 154 insertions(+) create mode 100644 patches/dummy_headers/objects/object_harfgibud/object_harfgibud.h diff --git a/patches/custom_syms.toml b/patches/custom_syms.toml index 9128278..716e089 100644 --- a/patches/custom_syms.toml +++ b/patches/custom_syms.toml @@ -14,3 +14,13 @@ symbols = [ { name = "FileSelect_Init_NORELOCATE", vram = 0x80813C98 }, { name = "DayTelop_Init_NORELOCATE", vram = 0x80815820 }, ] + +[[section]] +name = "..ovl_En_Hg" +rom = 0x01034170 +vram = 0x80BCF1D0 +size = 0x10E0 + +symbols = [ + { name = "sPamelasFatherAnimationInfo", vram = 0x80bd0008 }, +] diff --git a/patches/dummy_headers/objects/object_harfgibud/object_harfgibud.h b/patches/dummy_headers/objects/object_harfgibud/object_harfgibud.h new file mode 100644 index 0000000..1d4b540 --- /dev/null +++ b/patches/dummy_headers/objects/object_harfgibud/object_harfgibud.h @@ -0,0 +1,22 @@ +typedef enum PamelasFatherGibdoLimb { + /* 0x00 */ PAMELAS_FATHER_GIBDO_LIMB_NONE, + /* 0x01 */ PAMELAS_FATHER_GIBDO_LIMB_ROOT, + /* 0x02 */ PAMELAS_FATHER_GIBDO_LIMB_ABDOMEN, + /* 0x03 */ PAMELAS_FATHER_GIBDO_LIMB_CHEST, + /* 0x04 */ PAMELAS_FATHER_GIBDO_LIMB_LEFT_UPPER_ARM, + /* 0x05 */ PAMELAS_FATHER_GIBDO_LIMB_LEFT_FOREARM, + /* 0x06 */ PAMELAS_FATHER_GIBDO_LIMB_LEFT_HAND, + /* 0x07 */ PAMELAS_FATHER_GIBDO_LIMB_RIGHT_UPPER_ARM, + /* 0x08 */ PAMELAS_FATHER_GIBDO_LIMB_RIGHT_FOREARM, + /* 0x09 */ PAMELAS_FATHER_GIBDO_LIMB_RIGHT_HAND, + /* 0x0A */ PAMELAS_FATHER_GIBDO_LIMB_EYEBROWS, + /* 0x0B */ PAMELAS_FATHER_GIBDO_LIMB_HEAD, + /* 0x0C */ PAMELAS_FATHER_GIBDO_LIMB_PELVIS, + /* 0x0D */ PAMELAS_FATHER_GIBDO_LIMB_LEFT_THIGH, + /* 0x0E */ PAMELAS_FATHER_GIBDO_LIMB_LEFT_SHIN, + /* 0x0F */ PAMELAS_FATHER_GIBDO_LIMB_LEFT_FOOT, + /* 0x10 */ PAMELAS_FATHER_GIBDO_LIMB_RIGHT_THIGH, + /* 0x11 */ PAMELAS_FATHER_GIBDO_LIMB_RIGHT_SHIN, + /* 0x12 */ PAMELAS_FATHER_GIBDO_LIMB_RIGHT_FOOT, + /* 0x13 */ PAMELAS_FATHER_GIBDO_LIMB_MAX +} PamelasFatherGibdoLimb; diff --git a/patches/specific_actor_transform_tagging.c b/patches/specific_actor_transform_tagging.c index 38459ad..76ce327 100644 --- a/patches/specific_actor_transform_tagging.c +++ b/patches/specific_actor_transform_tagging.c @@ -1397,3 +1397,125 @@ RECOMP_PATCH void func_80AADB4C(Actor* thisx, PlayState* play) { func_80AADF54(play, this); } } + + + +#include "overlays/actors/ovl_En_Hg/z_en_hg.h" + +extern AnimationInfo sPamelasFatherAnimationInfo[]; +extern void EnHg_SetupWait(EnHg* this); + +typedef enum { + /* 0 */ HG_ANIM_IDLE, + /* 1 */ HG_ANIM_LURCH_FORWARD, + /* 2 */ HG_ANIM_RECOIL, + /* 3 */ HG_ANIM_LEAN_FORWARD, + /* 4 */ HG_ANIM_REACH_FORWARD, + /* 5 */ HG_ANIM_CURL_UP, + /* 6 */ HG_ANIM_CROUCHED_PANIC, + /* 7 */ HG_ANIM_PANIC, + /* 8 */ HG_ANIM_MAX +} HgAnimation; + +typedef enum { + /* 0 */ HG_CS_FIRST_ENCOUNTER, + /* 1 */ HG_CS_GET_MASK, + /* 2 */ HG_CS_SUBSEQUENT_ENCOUNTER, + /* 3 */ HG_CS_SONG_OF_HEALING +} HgCsIndex; + +void EnHg_HandleCutscene(EnHg* this, PlayState* play) { + if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_484)) { + s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_484); + + if (this->csIdList[3] != play->csCtx.actorCues[cueChannel]->id) { + this->csIdList[3] = play->csCtx.actorCues[cueChannel]->id; + switch (play->csCtx.actorCues[cueChannel]->id) { + case 1: + this->animIndex = HG_ANIM_IDLE; + Actor_ChangeAnimationByInfo(&this->skelAnime, sPamelasFatherAnimationInfo, HG_ANIM_IDLE); + break; + + case 2: + this->csIdList[2] = 0; + this->animIndex = HG_ANIM_LEAN_FORWARD; + Actor_ChangeAnimationByInfo(&this->skelAnime, sPamelasFatherAnimationInfo, HG_ANIM_LEAN_FORWARD); + break; + + case 3: + this->csIdList[2] = 0; + this->animIndex = HG_ANIM_CURL_UP; + Actor_ChangeAnimationByInfo(&this->skelAnime, sPamelasFatherAnimationInfo, HG_ANIM_CURL_UP); + break; + + case 4: + this->csIdList[2] = 0; + this->animIndex = HG_ANIM_PANIC; + if ((this->csIdIndex == HG_CS_GET_MASK) || (this->csIdIndex == HG_CS_SONG_OF_HEALING)) { + Audio_PlaySfx_2(NA_SE_EN_HALF_REDEAD_TRANS); + } + Actor_ChangeAnimationByInfo(&this->skelAnime, sPamelasFatherAnimationInfo, HG_ANIM_PANIC); + break; + + case 5: + this->animIndex = HG_ANIM_LURCH_FORWARD; + Actor_ChangeAnimationByInfo(&this->skelAnime, sPamelasFatherAnimationInfo, HG_ANIM_LURCH_FORWARD); + break; + + case 6: + SET_WEEKEVENTREG(WEEKEVENTREG_75_20); + Actor_Kill(&this->actor); + break; + + default: + break; + } + actor_set_interpolation_skipped(&this->actor); + } else if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { + switch (this->animIndex) { + case HG_ANIM_LEAN_FORWARD: + this->animIndex = HG_ANIM_REACH_FORWARD; + Actor_ChangeAnimationByInfo(&this->skelAnime, sPamelasFatherAnimationInfo, HG_ANIM_REACH_FORWARD); + break; + + case HG_ANIM_CURL_UP: + this->animIndex = HG_ANIM_CROUCHED_PANIC; + Actor_ChangeAnimationByInfo(&this->skelAnime, sPamelasFatherAnimationInfo, HG_ANIM_CROUCHED_PANIC); + break; + + default: + break; + } + actor_set_interpolation_skipped(&this->actor); + } + + switch (this->animIndex) { + case HG_ANIM_LEAN_FORWARD: + case HG_ANIM_REACH_FORWARD: + Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_HALF_REDEAD_LOOP - SFX_FLAG); + break; + + case HG_ANIM_CURL_UP: + case HG_ANIM_CROUCHED_PANIC: + Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_HALF_REDEAD_SCREAME - SFX_FLAG); + break; + + case HG_ANIM_PANIC: + if ((this->csIdIndex == HG_CS_FIRST_ENCOUNTER) || (this->csIdIndex == HG_CS_SUBSEQUENT_ENCOUNTER)) { + Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_HALF_REDEAD_SCREAME - SFX_FLAG); + } + break; + + default: + break; + } + + Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel); + return; + + } else if (play->csCtx.state == CS_STATE_IDLE) { + EnHg_SetupWait(this); + } + + this->csIdList[3] = 99; +}