/* * File: z_en_zl3.c * Overlay: ovl_En_Zl3 * Description: Adult Zelda */ #include "z_en_zl3.h" #include "vt.h" #include "overlays/actors/ovl_En_Encount2/z_en_encount2.h" #include "overlays/actors/ovl_Door_Warp1/z_door_warp1.h" #include "objects/object_zl2/object_zl2.h" #include "objects/object_zl2_anime2/object_zl2_anime2.h" #define FLAGS ACTOR_FLAG_4 void EnZl3_Init(Actor* thisx, GlobalContext* globalCtx); void EnZl3_Destroy(Actor* thisx, GlobalContext* globalCtx); void EnZl3_Update(Actor* thisx, GlobalContext* globalCtx); void EnZl3_Draw(Actor* thisx, GlobalContext* globalCtx); void func_80B59AD0(EnZl3* this, GlobalContext* globalCtx); void EnZl3_Reset(void); static ColliderCylinderInitType1 sCylinderInit = { { COLTYPE_HIT0, AT_NONE, AC_NONE, OC1_ON | OC1_TYPE_PLAYER, COLSHAPE_CYLINDER, }, { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0x00000000, 0x00, 0x00 }, TOUCH_NONE, BUMP_NONE, OCELEM_ON, }, { 25, 80, 0, { 0, 0, 0 } }, }; static void* sEyeTextures[] = { gZelda2EyeOpenTex, gZelda2EyeHalfTex, gZelda2EyeShutTex, gZelda2Eye03Tex, gZelda2Eye04Tex, gZelda2Eye05Tex, gZelda2Eye06Tex, NULL }; static void* sMouthTextures[] = { gZelda2MouthSeriousTex, gZelda2MouthHappyTex, gZelda2MouthOpenTex }; s32 D_80B5A468 = 0; static Vec3f D_80B5A46C = { 0.0f, 0.0f, 0.0f }; static Vec3f D_80B5A478 = { 0.0f, 10.0f, 0.0f }; static f32 D_80B5A484 = 0.0f; static Vec3f D_80B5A488 = { 0.0f, 0.0f, 0.0f }; s32 D_80B5A494 = -1; static Vec3f D_80B5A498 = { 148.0f, 260.0f, -87.0f }; static Vec3f D_80B5A4A4 = { -12.0f, 260.0f, -147.0f }; static Vec3f D_80B5A4B0 = { 42.0f, 260.0f, 13.0f }; u32 D_80B5A4BC = 0; void func_80B533B0(Actor* thisx, GlobalContext* globalCtx) { EnZl3* this = (EnZl3*)thisx; Collider_InitCylinder(globalCtx, &this->collider); Collider_SetCylinderType1(globalCtx, &this->collider, &this->actor, &sCylinderInit); } void func_80B533FC(EnZl3* this, GlobalContext* globalCtx) { ColliderCylinder* collider = &this->collider; s32 pad[4]; Collider_UpdateCylinder(&this->actor, collider); CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &collider->base); } void EnZl3_Destroy(Actor* thisx, GlobalContext* globalCtx) { EnZl3* this = (EnZl3*)thisx; Collider_DestroyCylinder(globalCtx, &this->collider); } void func_80B53468(void) { Audio_QueueSeqCmd(SEQ_PLAYER_BGM_MAIN << 24 | NA_BGM_ESCAPE); } BossGanon2* func_80B53488(EnZl3* this, GlobalContext* globalCtx) { if (this->ganon == NULL) { Actor* actorIt = globalCtx->actorCtx.actorLists[ACTORCAT_BOSS].head; while (actorIt != NULL) { if (actorIt->id == ACTOR_BOSS_GANON2) { this->ganon = (BossGanon2*)actorIt; break; } actorIt = actorIt->next; } } return this->ganon; } void EnZl3_UpdateEyes(EnZl3* this) { s32 pad[2]; s16* eyeTexIndex = &this->eyeTexIndex; s16* blinkTimer = &this->blinkTimer; if (DECR(*blinkTimer) == 0) { *blinkTimer = Rand_S16Offset(60, 60); } *eyeTexIndex = *blinkTimer; if (*eyeTexIndex >= 3) { *eyeTexIndex = 0; } } void EnZl3_setEyeIndex(EnZl3* this, s16 index) { this->eyeTexIndex = index; } void EnZl3_setMouthIndex(EnZl3* this, s16 index) { this->mouthTexIndex = index; } void func_80B5357C(EnZl3* this, GlobalContext* globalCtx) { Vec3f* thisPos = &this->actor.world.pos; Vec3f sp20; sp20.x = thisPos->x + ((Rand_ZeroOne() - 0.5f) * 10.0f); sp20.y = thisPos->y; sp20.z = thisPos->z + ((Rand_ZeroOne() - 0.5f) * 10.0f); Item_DropCollectible(globalCtx, &sp20, 3); } void func_80B53614(EnZl3* this, GlobalContext* globalCtx) { Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_RIVER_SOUND, -442.0f, 4102.0f, -371.0f, 0, 0, 0, 0x12); } void func_80B5366C(EnZl3* this, GlobalContext* globalCtx) { Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 75.0f, 30.0f, 30.0f, 5); } void func_80B536B4(EnZl3* this) { this->actor.bgCheckFlags &= ~0x9; } void func_80B536C4(EnZl3* this) { s32 pad[2]; Vec3s* vec1 = &this->unk_3F8.unk_08; Vec3s* vec2 = &this->unk_3F8.unk_0E; Math_SmoothStepToS(&vec1->x, 0, 20, 6200, 100); Math_SmoothStepToS(&vec1->y, 0, 20, 6200, 100); Math_SmoothStepToS(&vec2->x, 0, 20, 6200, 100); Math_SmoothStepToS(&vec2->y, 0, 20, 6200, 100); } void func_80B53764(EnZl3* this, GlobalContext* globalCtx) { Player* player = GET_PLAYER(globalCtx); this->unk_3F8.unk_18 = player->actor.world.pos; this->unk_3F8.unk_14 = kREG(16) - 16.0f; func_80034A14(&this->actor, &this->unk_3F8, kREG(17) + 0xC, 2); } s32 func_80B537E8(EnZl3* this) { s16 yawTowardsPlayer = this->actor.yawTowardsPlayer; s16* rotY = &this->actor.world.rot.y; s16* unk_3D0 = &this->unk_3D0; s16 retVal; s16 pad[2]; Math_SmoothStepToS(unk_3D0, ABS((s16)(yawTowardsPlayer - *rotY)), 5, 6200, 100); retVal = Math_SmoothStepToS(rotY, yawTowardsPlayer, 5, *unk_3D0, 100); this->actor.shape.rot.y = *rotY; return retVal; } void func_80B538B0(EnZl3* this) { s16 yawTowardsPlayer = this->actor.yawTowardsPlayer; s16* rotY = &this->actor.world.rot.y; if (ABS((s16)(yawTowardsPlayer - *rotY)) >= 0x1556) { D_80B5A468 = 1; } if (D_80B5A468 != 0) { if (!func_80B537E8(this)) { D_80B5A468 = 0; } } else { this->unk_3D0 = 0; } } s32 EnZl3_UpdateSkelAnime(EnZl3* this) { return SkelAnime_Update(&this->skelAnime); } s32 func_80B5396C(EnZl3* this) { return this->unk_3C8; } void func_80B53974(EnZl3* this, u8 arg1) { this->unk_3C8 = arg1; } void func_80B53980(EnZl3* thisx, s16 y, s32 idx) { EnZl3* this = (EnZl3*)thisx; // this function might take thisx s32 action = this->action; s16 y2 = y; s32 yTemp; f32 curFrame; f32 unk_3DC; if (this->unk_2FC != 0) { SkelAnime* skelAnime = &this->skelAnime; s32 temp25C = this->unk_25C[idx]; s32 temp28C = (s16)(y + this->unk_28C[idx]); s32 temp2BC = y - this->unk_2BC[idx]; if ((s32)fabsf(temp2BC) > 0x8000) { if (y2 > 0) { temp2BC -= 0x10000; } else { temp2BC += 0x10000; } } if ((idx != 0 || action != 4) && (temp2BC != 0)) { temp25C += (temp2BC - temp25C) / 16; } if (temp25C != 0) { temp25C -= temp25C / 10; } if ((s16)(temp28C - y) != 0) { temp25C -= (s16)(temp28C - y) / 50; } temp28C += temp25C; if (((this->unk_25C[idx] * temp25C) <= 0) && (((s16)(temp28C - y) > -0x64) && ((s16)(temp28C - y) < 0x64))) { temp28C = y; temp25C = 0; } if (idx == 0 && action == 3) { yTemp = y + -11000; if (skelAnime->mode == 2) { curFrame = skelAnime->curFrame; unk_3DC = this->unk_3DC; yTemp = (s32)((curFrame / unk_3DC) * -11000) + y; if (temp28C >= yTemp) { temp28C = yTemp; if (temp25C > 0) { temp25C /= -2; } } } else { if (temp28C >= yTemp) { temp28C = yTemp; if (temp25C > 0) { temp25C /= -2; } } } } this->unk_25C[idx] = temp25C; this->unk_28C[idx] = temp28C - y; } this->unk_2BC[idx] = y; } void func_80B53B64(EnZl3* this, s16 z, s32 idx) { SkelAnime* skelAnime = &this->skelAnime; s32 action = this->action; s32 phi_a1; s32 idx25C; s16 temp_t1; s32 temp_a0; s32 phi_v0; s32 phi_v1; s32 phi_v1_2; if (idx == 2) { phi_a1 = 15000; idx25C = 0; } else if (idx == 5) { phi_a1 = 13000; idx25C = 3; } else if (idx == 8) { phi_a1 = 12000; idx25C = 6; } else if (idx == 11) { phi_a1 = 0x4000; idx25C = 9; } else if (idx == 14) { phi_a1 = 0x4000; idx25C = 12; } else if (idx == 17) { phi_a1 = 0x4000; idx25C = 15; } else { phi_a1 = 0x4000; idx25C = 18; } if (this->unk_2FC != 0) { phi_v0 = this->unk_25C[idx]; temp_a0 = (s16)(z + this->unk_28C[idx]); phi_v1 = z - this->unk_2BC[idx]; if ((s32)fabsf(phi_v1) > 0x8000) { if (z > 0) { phi_v1 -= 0x10000; } else { phi_v1 += 0x10000; } } if (idx25C >= 0) { phi_v1 += ABS(this->unk_25C[idx25C]) / 3; } if (idx == 2 && (action == 5 || action == 24)) { if (phi_v1 != 0) { phi_v0 -= (phi_v1 - phi_v0) / 10; } } else if (idx == 2 && action == 22 && skelAnime->mode == 2) { if (phi_v1 != 0) { phi_v0 -= (phi_v1 - phi_v0) / 10; } } else if (idx == 2 && (action == 20 || action == 21) && skelAnime->mode == 2) { if (phi_v1 != 0) { phi_v0 -= (phi_v1 - phi_v0) / 10; } } else { if (phi_v1 != 0) { phi_v0 += (phi_v1 - phi_v0) / 16; } } if (phi_v0 != 0) { phi_v0 -= phi_v0 / 10; } if ((s16)(temp_a0 - phi_a1) != 0) { phi_v0 -= (s16)(temp_a0 - phi_a1) / 50; } temp_a0 += phi_v0; phi_v1 = (s16)(temp_a0 - phi_a1); if (((this->unk_25C[idx] * phi_v0) <= 0) && (phi_v1 > -100) && (phi_v1 < 100)) { temp_a0 = phi_a1; phi_v0 = 0; } if (idx == 2) { if (action == 4) { if (skelAnime->mode == 2) { f32 curFrame = skelAnime->curFrame; f32 unk_3E0 = this->unk_3E0; phi_v1_2 = (s32)(((unk_3E0 - curFrame) / unk_3E0) * -2000.0f) + phi_a1; if (phi_v1_2 >= temp_a0) { temp_a0 = phi_v1_2; if (phi_v0 < 0) { phi_v0 /= -2; } } } } else if (action == 5) { if (skelAnime->mode == 2) { f32 curFrame = skelAnime->curFrame; f32 unk_3E4 = this->unk_3E4; phi_v1_2 = (s32)((curFrame / unk_3E4) * -2000.0f) + phi_a1; if (phi_v1_2 >= temp_a0) { temp_a0 = phi_v1_2; if (phi_v0 < 0) { phi_v0 /= -2; } } } else { phi_v1_2 = phi_a1 - 2000; if (phi_v1_2 >= temp_a0) { temp_a0 = phi_v1_2; if (phi_v0 < 0) { phi_v0 /= -2; } } } } else if ((action == 20) || (action == 21)) { if (skelAnime->mode == 2) { f32 curFrame = skelAnime->curFrame; f32 unk_3F4 = this->unk_3F4; if (curFrame <= 42.0f) { phi_v1_2 = phi_a1 - 2000; } else { phi_v1_2 = (s32)((((curFrame - 42.0f) * 6200.0f) / (unk_3F4 - 42.0f)) + -2000.0f) + phi_a1; } if (phi_v1_2 >= temp_a0) { temp_a0 = phi_v1_2; if (phi_v0 < 0) { phi_v0 /= -2; } } } else { phi_v1_2 = phi_a1 + 4200; if (phi_v1_2 >= temp_a0) { temp_a0 = phi_v1_2; if (phi_v0 < 0) { phi_v0 /= -2; } } } } else if (action == 22) { if (skelAnime->mode == 2) { f32 curFrame = skelAnime->curFrame; f32 unk_3EC = this->unk_3EC; phi_v1_2 = (s32)(((curFrame / unk_3EC) * -5200.0f) + 4200.0f) + phi_a1; if (phi_v1_2 >= temp_a0) { temp_a0 = phi_v1_2; if (phi_v0 < 0) { phi_v0 /= -2; } } } else { phi_v1_2 = phi_a1 - 2000; if (phi_v1_2 >= temp_a0) { temp_a0 = phi_v1_2; if (phi_v0 < 0) { phi_v0 /= -2; } } } } else if (action == 23) { if (skelAnime->mode == 2) { f32 curFrame = skelAnime->curFrame; f32 unk_3F0 = this->unk_3F0; phi_v1_2 = (s32)(((curFrame / unk_3F0) * -7600.0f) + -2000.0f) + phi_a1; if (phi_v1_2 >= temp_a0) { temp_a0 = phi_v1_2; if (phi_v0 < 0) { phi_v0 /= -2; } } } else { phi_v1_2 = phi_a1 - 9600; if (phi_v1_2 >= temp_a0) { temp_a0 = phi_v1_2; if (phi_v0 < 0) { phi_v0 /= -2; } } } } else if (action == 24) { if (skelAnime->mode == 2) { f32 curFrame = skelAnime->curFrame; f32 unk_3E8 = this->unk_3E8; phi_v1_2 = (s32)(((curFrame / unk_3E8) * 21000.0f) + -9600.0f) + phi_a1; if (phi_v1_2 >= temp_a0) { temp_a0 = phi_v1_2; if (phi_v0 < 0) { phi_v0 /= -2; } } } else { phi_v1_2 = phi_a1 + 11400; if (phi_v1_2 >= temp_a0) { temp_a0 = phi_v1_2; if (phi_v0 < 0) { phi_v0 /= -2; } } } } } else if (idx == 11 || idx == 17) { if (action == 4) { if (skelAnime->mode == 2) { f32 curFrame = skelAnime->curFrame; f32 unk_3E0 = this->unk_3E0; phi_v1_2 = (s32)((curFrame / unk_3E0) * -7000.0f) + phi_a1; if (temp_a0 >= phi_v1_2) { temp_a0 = phi_v1_2; if (phi_v0 > 0) { phi_v0 /= -2; } } } else { phi_v1_2 = phi_a1 - 7000; if (temp_a0 >= phi_v1_2) { temp_a0 = phi_v1_2; if (phi_v0 > 0) { phi_v0 /= -2; } } } } else if (action == 5) { if (skelAnime->mode == 2) { f32 curFrame = skelAnime->curFrame; f32 unk_3E4 = this->unk_3E4; phi_v1_2 = (s32)(((unk_3E4 - curFrame) / unk_3E4) * -7000.0f) + phi_a1; if (temp_a0 >= phi_v1_2) { temp_a0 = phi_v1_2; if (phi_v0 > 0) { phi_v0 /= -2; } } } } } this->unk_25C[idx] = phi_v0; this->unk_28C[idx] = temp_a0 - z; } this->unk_2BC[idx] = z; } void func_80B54360(EnZl3* this, s16 arg1, s32 arg2) { if (this->unk_2FC != 0) { s32 temp_v1 = this->unk_28C[arg2] - arg1; s16 temp_t0 = temp_v1; s32 temp_t2 = temp_t0; s32 temp_t3 = this->unk_25C[arg2]; s32 phi_v0 = temp_t3; s32 index25C; s32 phi_t5; temp_t3 = arg1 - this->unk_2BC[arg2]; if (arg2 == 1) { index25C = 0; phi_t5 = this->unk_25C[index25C]; } else if (arg2 == 4) { index25C = 3; phi_t5 = this->unk_25C[index25C]; } else if (arg2 == 7) { index25C = 6; phi_t5 = this->unk_25C[index25C]; } else if (arg2 == 10) { index25C = 9; phi_t5 = ABS(this->unk_25C[index25C]); } else if (arg2 == 13) { index25C = 12; phi_t5 = ABS(this->unk_25C[index25C]); } else if (arg2 == 16) { index25C = 15; phi_t5 = -ABS(this->unk_25C[index25C]); } else { index25C = 18; phi_t5 = -ABS(this->unk_25C[index25C]); } if ((s32)fabsf(temp_t3) > 0x8000) { if (arg1 > 0) { temp_t3 -= 0x10000; } else { temp_t3 += 0x10000; } } if (index25C >= 0) { temp_t3 += phi_t5 / 3; } if (temp_t3 != 0) { phi_v0 += (temp_t3 - phi_v0) / 16; } if (phi_v0 != 0) { phi_v0 -= phi_v0 / 10; } if (temp_t0 != 0) { phi_v0 -= temp_t0 / 50; } temp_v1 += phi_v0; if (((this->unk_25C[arg2] * phi_v0) <= 0) && (temp_t2 > -0x64) && (temp_t2 < 0x64)) { temp_v1 = 0; phi_v0 = 0; } this->unk_25C[arg2] = phi_v0; this->unk_28C[arg2] = arg1 + temp_v1; } this->unk_2BC[arg2] = arg1; } s32 func_80B5458C(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx, Gfx** gfx) { s32 pad[3]; EnZl3* this = (EnZl3*)thisx; s16* unk_28C = this->unk_28C; Mtx* sp78; MtxF sp38; Vec3s sp30; Vec3s* unk_3F8_unk_08 = &this->unk_3F8.unk_08; Vec3s* unk_3F8_unk_0E = &this->unk_3F8.unk_0E; if (limbIndex == 14) { sp78 = Graph_Alloc(globalCtx->state.gfxCtx, sizeof(Mtx) * 7); rot->x += unk_3F8_unk_08->y; rot->z += unk_3F8_unk_08->x; gSPSegment((*gfx)++, 0x0C, sp78); Matrix_Push(); Matrix_Translate(pos->x, pos->y, pos->z, MTXMODE_APPLY); Matrix_RotateZYX(rot->x, rot->y, rot->z, MTXMODE_APPLY); Matrix_Push(); Matrix_Translate(362.0f, -133.0f, 0.0f, MTXMODE_APPLY); Matrix_Get(&sp38); Matrix_MtxFToYXZRotS(&sp38, &sp30, 0); if (!FrameAdvance_IsEnabled(globalCtx)) { func_80B53980(this, sp30.y, 0); func_80B54360(this, sp30.x, 1); func_80B53B64(this, sp30.z, 2); } Matrix_RotateZYX(unk_28C[0] + kREG(31), unk_28C[1] + kREG(32), unk_28C[2] + kREG(33), MTXMODE_APPLY); Matrix_Translate(-188.0f, -184.0f, 0.0f, MTXMODE_APPLY); MATRIX_TOMTX(&sp78[0]); Matrix_Get(&sp38); Matrix_MtxFToYXZRotS(&sp38, &sp30, 0); if (!FrameAdvance_IsEnabled(globalCtx)) { func_80B53980(this, sp30.y, 3); } Matrix_RotateZYX(unk_28C[3] + kREG(34), unk_28C[4] + kREG(35), unk_28C[5] + kREG(36), MTXMODE_APPLY); Matrix_Translate(-410.0f, -184.0f, 0.0f, MTXMODE_APPLY); MATRIX_TOMTX(&sp78[1]); Matrix_Get(&sp38); Matrix_MtxFToYXZRotS(&sp38, &sp30, 0); if (!FrameAdvance_IsEnabled(globalCtx)) { func_80B54360(this, sp30.x, 7); } Matrix_RotateZYX(unk_28C[6] + kREG(37), unk_28C[7] + kREG(38), unk_28C[8] + kREG(39), MTXMODE_APPLY); Matrix_Translate(-1019.0f, -26.0f, 0.0f, MTXMODE_APPLY); MATRIX_TOMTX(&sp78[2]); Matrix_Pop(); Matrix_Push(); Matrix_Translate(467.0f, 265.0f, 389.0f, MTXMODE_APPLY); Matrix_Get(&sp38); Matrix_MtxFToYXZRotS(&sp38, &sp30, 0); if (!FrameAdvance_IsEnabled(globalCtx)) { func_80B53980(this, sp30.y, 9); func_80B54360(this, sp30.x, 10); func_80B53B64(this, sp30.z, 11); } Matrix_RotateZYX(unk_28C[9] + kREG(40), unk_28C[10] + kREG(41), unk_28C[11] + kREG(42), MTXMODE_APPLY); Matrix_Translate(-427.0f, -1.0f, -3.0f, MTXMODE_APPLY); MATRIX_TOMTX(&sp78[3]); Matrix_Get(&sp38); Matrix_MtxFToYXZRotS(&sp38, &sp30, 0); if (!FrameAdvance_IsEnabled(globalCtx)) { func_80B53980(this, sp30.y, 12); func_80B54360(this, sp30.x, 13); func_80B53B64(this, sp30.z, 14); } Matrix_RotateZYX(unk_28C[12] + kREG(43), unk_28C[13] + kREG(44), unk_28C[14] + kREG(45), MTXMODE_APPLY); Matrix_Translate(-446.0f, -52.0f, 84.0f, MTXMODE_APPLY); MATRIX_TOMTX(&sp78[4]); Matrix_Pop(); Matrix_Push(); Matrix_Translate(467.0f, 265.0f, -389.0f, MTXMODE_APPLY); Matrix_Get(&sp38); Matrix_MtxFToYXZRotS(&sp38, &sp30, 0); if (!FrameAdvance_IsEnabled(globalCtx)) { func_80B53980(this, sp30.y, 15); func_80B54360(this, sp30.x, 16); func_80B53B64(this, sp30.z, 17); } Matrix_RotateZYX(unk_28C[15] + kREG(46), unk_28C[16] + kREG(47), unk_28C[17] + kREG(48), MTXMODE_APPLY); Matrix_Translate(-427.0f, -1.0f, 3.0f, MTXMODE_APPLY); MATRIX_TOMTX(&sp78[5]); Matrix_Get(&sp38); Matrix_MtxFToYXZRotS(&sp38, &sp30, 0); if (!FrameAdvance_IsEnabled(globalCtx)) { func_80B53980(this, sp30.y, 18); func_80B54360(this, sp30.x, 19); func_80B53B64(this, sp30.z, 20); } Matrix_RotateZYX(unk_28C[18] + kREG(49), unk_28C[19] + kREG(50), unk_28C[20] + kREG(51), MTXMODE_APPLY); Matrix_Translate(-446.0f, -52.0f, -84.0f, MTXMODE_APPLY); MATRIX_TOMTX(&sp78[6]); Matrix_Pop(); Matrix_Pop(); this->unk_2FC = 1; } else if (limbIndex == 7) { rot->x += unk_3F8_unk_0E->y; rot->y -= unk_3F8_unk_0E->x; } return false; } void EnZl3_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx, Gfx** gfx) { EnZl3* this = (EnZl3*)thisx; s32 pad; Vec3f sp34; s32 pad2; Vec3f sp24; Vec3f sp18; if (limbIndex == 13) { sp34 = D_80B5A46C; Matrix_MultVec3f(&sp34, &this->unk_31C); } else if (limbIndex == 14) { sp24 = D_80B5A478; Matrix_MultVec3f(&sp24, &sp18); this->actor.focus.pos.x = sp18.x; this->actor.focus.pos.y = sp18.y; this->actor.focus.pos.z = sp18.z; this->actor.focus.rot.x = this->actor.world.rot.x; this->actor.focus.rot.y = this->actor.world.rot.y; this->actor.focus.rot.z = this->actor.world.rot.z; } } s32 func_80B54DB4(EnZl3* this) { s32 params = this->actor.params >> 8; return params & 0xFF; } s32 func_80B54DC4(EnZl3* this) { s32 params = this->actor.params >> 4; return params & 0xF; } s32 func_80B54DD4(EnZl3* this) { s32 params = this->actor.params; return params & 0xF; } void func_80B54DE0(EnZl3* this, GlobalContext* globalCtx) { s32 idx = this->unk_318; gSegments[6] = VIRTUAL_TO_PHYSICAL(globalCtx->objectCtx.status[idx].segment); } void func_80B54E14(EnZl3* this, AnimationHeader* animation, u8 arg2, f32 transitionRate, s32 arg4) { f32 frameCount = Animation_GetLastFrame(animation); f32 playbackSpeed; f32 unk0; f32 fc; if (arg4 == 0) { unk0 = 0.0f; fc = frameCount; playbackSpeed = 1.0f; } else { unk0 = frameCount; fc = 0.0f; playbackSpeed = -1.0f; } Animation_Change(&this->skelAnime, animation, playbackSpeed, unk0, fc, arg2, transitionRate); } void func_80B54EA4(EnZl3* this, GlobalContext* globalCtx) { f32 posX = this->actor.world.pos.x; f32 posY = this->actor.world.pos.y; f32 posZ = this->actor.world.pos.z; Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_EG, posX, posY, posZ, 0, 0, 0, 0); } void func_80B54EF4(EnZl3* this) { func_80078914(&this->actor.projectedPos, NA_SE_VO_Z1_PAIN); } void func_80B54F18(EnZl3* this, GlobalContext* globalCtx) { if (this->unk_2F8 == 0) { f32 posX = this->actor.world.pos.x; f32 posY = this->actor.world.pos.y + (kREG(5) + -26.0f); f32 posZ = this->actor.world.pos.z; Actor_SpawnAsChild(&globalCtx->actorCtx, &this->actor, globalCtx, ACTOR_DOOR_WARP1, posX, posY, posZ, 0, 0x4000, 0, WARP_PURPLE_CRYSTAL); this->unk_2F8 = 1; } } void func_80B54FB4(EnZl3* this, GlobalContext* globalCtx) { osSyncPrintf("ゼルダ姫のEn_Zl3_Actor_inFinal_Init通すよ!!!!!!!!!!!!!!!!!!!!!!!!!\n"); func_80B54E14(this, &gZelda2Anime2Anim_008AD0, 0, 0.0f, 0); EnZl3_setEyeIndex(this, 4); EnZl3_setMouthIndex(this, 2); this->action = 1; this->drawConfig = 1; func_80B54F18(this, globalCtx); this->actor.shape.rot.z = 0; this->unk_3C4 = this->actor.world.rot.z; this->actor.world.rot.z = this->actor.shape.rot.z; osSyncPrintf("ゼルダ姫のEn_Zl3_Actor_inFinal_Initは通った!!!!!!!!!!!!!!!!!!!!!!!!!\n"); } void func_80B55054(EnZl3* this) { if (this->unk_328 != 0) { Actor* child = this->actor.child; if (child != NULL) { f32* temp_v0 = &this->unk_2EC; if (*temp_v0 < 19.0f) { ((DoorWarp1*)child)->crystalAlpha = (20.0f - *temp_v0) * 12.75f; *temp_v0 += 1.0f; } else { Actor_Kill(child); this->actor.child = NULL; } } } } void func_80B550F0(EnZl3* this) { Actor* child = this->actor.child; if (child != NULL) { child->world.pos.x = this->actor.world.pos.x; child->world.pos.y = this->actor.world.pos.y + (kREG(5) + -26.0f); child->world.pos.z = this->actor.world.pos.z; } } void func_80B55144(EnZl3* this) { f32* fl = &D_80B5A484; if (*fl < 2.0f) { *fl += 1.0f; EnZl3_setEyeIndex(this, 2); } else if (*fl < 4.0f) { *fl += 1.0f; EnZl3_setEyeIndex(this, 1); } else { EnZl3_UpdateEyes(this); } } void func_80B551E0(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_008AD0, 0, 0.0f, 0); this->action = 1; } void func_80B55220(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_0091D8, 2, 0.0f, 0); this->action = 2; EnZl3_setMouthIndex(this, 0); } void func_80B55268(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_0091D8, 2, 0.0f, 0); this->action = 3; } void func_80B552A8(EnZl3* this, s32 arg1) { if (arg1 != 0) { func_80B54E14(this, &gZelda2Anime2Anim_0099A0, 0, 0.0f, 0); } } void func_80B552DC(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_00A598, 2, -8.0f, 0); func_80B54EF4(this); EnZl3_setMouthIndex(this, 2); this->action = 4; func_80B53468(); } void func_80B55334(EnZl3* this, s32 arg1) { if (arg1 != 0) { func_80B54E14(this, &gZelda2Anime2Anim_00AACC, 0, 0.0f, 0); } } void func_80B55368(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_00A334, 2, -8.0f, 0); EnZl3_setMouthIndex(this, 0); this->action = 5; } void func_80B553B4(EnZl3* this, s32 arg1) { if (arg1 != 0) { func_80B54E14(this, &gZelda2Anime2Anim_009FBC, 0, 0.0f, 0); } } void func_80B553E8(EnZl3* this, GlobalContext* globalCtx) { func_80B59AD0(this, globalCtx); } void func_80B55408(EnZl3* this) { Actor* child = this->actor.child; if (child != NULL) { Actor_Kill(child); } Actor_Kill(&this->actor); } void func_80B55444(EnZl3* this, GlobalContext* globalCtx) { s32 temp_v0 = func_80B5396C(this); if (temp_v0 >= 0) { s32 unk_2F0 = this->unk_2F0; if (temp_v0 != unk_2F0) { switch (temp_v0) { case 0: func_80B551E0(this); break; case 1: EnZl3_setEyeIndex(this, 3); func_80B54EF4(this); break; case 3: func_80B55220(this); break; case 4: func_80B55268(this); break; case 5: func_80B552DC(this); break; case 6: func_80B55368(this); break; case 7: func_80B553E8(this, globalCtx); break; case 2: func_80B55408(this); break; case 8: this->unk_328 = 1; default: osSyncPrintf("En_Zl3_inFinal_Check_DemoMode:そんな動作は無い!!!!!!!!\n"); } this->unk_2F0 = temp_v0; } } } void func_80B55550(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateSkelAnime(this); func_80B550F0(this); func_80B55444(this, globalCtx); } void func_80B555A4(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_setEyeIndex(this, 2); func_80B550F0(this); func_80B55054(this); func_80B55444(this, globalCtx); } void func_80B55604(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B5366C(this, globalCtx); func_80B55144(this); func_80B552A8(this, EnZl3_UpdateSkelAnime(this)); func_80B55054(this); func_80B55444(this, globalCtx); } void func_80B5566C(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); func_80B55334(this, EnZl3_UpdateSkelAnime(this)); func_80B55444(this, globalCtx); } void func_80B556CC(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); func_80B553B4(this, EnZl3_UpdateSkelAnime(this)); func_80B55444(this, globalCtx); } void func_80B5572C(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B55444(this, globalCtx); } void func_80B55780(EnZl3* this, GlobalContext* globalCtx) { osSyncPrintf("ゼルダ姫のEn_Zl3_Actor_inFinal2_Init通すよ!!!!!!!!!!!!!!!!!!!!!!!!!\n"); func_80B54E14(this, &gZelda2Anime2Anim_005A0C, 0, 0.0f, 0); this->action = 7; this->drawConfig = 1; osSyncPrintf("ゼルダ姫のEn_Zl3_Actor_inFinal2_Initは通った!!!!!!!!!!!!!!!!!!!!!!!!!\n"); EnZl3_setMouthIndex(this, 1); this->actor.flags &= ~ACTOR_FLAG_0; } void func_80B55808(EnZl3* this) { func_80078914(&this->actor.projectedPos, NA_SE_VO_Z1_PAIN); } void func_80B5582C(EnZl3* this) { Audio_PlaySoundRandom(&D_80B5A488, NA_SE_VO_Z1_CRY_0, NA_SE_VO_Z1_CRY_1 - NA_SE_VO_Z1_CRY_0 + 1); } void func_80B5585C(EnZl3* this) { SkelAnime* skelAnime = &this->skelAnime; if ((skelAnime->mode == 2) && Animation_OnFrame(skelAnime, 4.0f)) { func_80078914(&this->actor.projectedPos, NA_SE_VO_Z1_PAIN); } } void func_80B558A8(EnZl3* this) { s32 pad[4]; s16 thisRotY = this->actor.world.rot.y; Vec3f* unk_338 = &this->unk_338; *unk_338 = this->unk_32C = this->actor.world.pos; unk_338->z += (-1.6074f * Math_CosS(thisRotY)) - (3.1620007f * Math_SinS(thisRotY)); unk_338->x += (-1.6074f * Math_SinS(thisRotY)) + (3.1620007f * Math_CosS(thisRotY)); unk_338->y += -0.012199402f; } void func_80B559C4(EnZl3* this) { Vec3f* thisPos = &this->actor.world.pos; Vec3f* unk_32C = &this->unk_32C; Vec3f* unk_338 = &this->unk_338; f32 temp_f0 = Environment_LerpWeightAccelDecel(Animation_GetLastFrame(&gZelda2Anime2Anim_005248), 0, (s32)this->skelAnime.curFrame, 3, 3); thisPos->x = unk_32C->x + (temp_f0 * (unk_338->x - unk_32C->x)); thisPos->z = unk_32C->z + (temp_f0 * (unk_338->z - unk_32C->z)); } void func_80B55A58(EnZl3* this, GlobalContext* globalCtx) { if (globalCtx->activeCamera == MAIN_CAM) { func_80B537E8(this); } } void func_80B55A84(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_005A0C, 0, 0.0f, 0); this->action = 7; } void func_80B55AC4(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_00499C, 2, -8.0f, 0); this->action = 8; } void func_80B55B04(EnZl3* this, s32 arg1) { if (arg1 != 0) { func_80B54E14(this, &gZelda2Anime2Anim_004408, 0, 0.0f, 0); } } void func_80B55B38(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_006508, 2, -8.0f, 0); this->action = 9; } void func_80B55B78(EnZl3* this, s32 arg1) { if (arg1 != 0) { func_80B54E14(this, &gZelda2Anime2Anim_0061C4, 0, 0.0f, 0); } } void func_80B55BAC(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_005248, 2, -8.0f, 0); func_80B558A8(this); func_80B55808(this); EnZl3_setMouthIndex(this, 2); this->action = 10; } void func_80B55C0C(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_0054E0, 0, 0.0f, 0); this->action = 11; } void func_80B55C4C(EnZl3* this, s32 arg1) { if (arg1 != 0) { func_80B55C0C(this); } } void func_80B55C70(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_008684, 2, -8.0f, 0); this->action = 12; this->actor.flags &= ~(ACTOR_FLAG_0 | ACTOR_FLAG_3); this->actor.flags &= ~ACTOR_FLAG_0; } void func_80B55CCC(EnZl3* this, s32 arg1) { if (arg1 != 0) { func_80B54E14(this, &gZelda2Anime2Anim_006F04, 0, 0.0f, 0); } } void func_80B55D00(EnZl3* this, GlobalContext* globalCtx) { if (Actor_ProcessTalkRequest(&this->actor, globalCtx)) { this->action = 13; } else if (ABS((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y)) <= 0x4300) { this->actor.flags |= ACTOR_FLAG_0 | ACTOR_FLAG_3; this->actor.flags |= ACTOR_FLAG_0; this->actor.textId = 0x70D5; func_8002F2F4(&this->actor, globalCtx); } else { this->actor.flags &= ~(ACTOR_FLAG_0 | ACTOR_FLAG_3); this->actor.flags &= ~ACTOR_FLAG_0; } } void func_80B55DB0(EnZl3* this, GlobalContext* globalCtx) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CLOSING) { this->actor.flags &= ~(ACTOR_FLAG_0 | ACTOR_FLAG_3); this->actor.flags &= ~ACTOR_FLAG_0; this->action = 12; } } void func_80B55E08(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_006AB0, 2, -8.0f, 0); this->action = 14; } void func_80B55E48(EnZl3* this, s32 arg1) { if (arg1 != 0) { func_80B54E14(this, &gZelda2Anime2Anim_008050, 0, 0.0f, 0); } } void func_80B55E7C(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_007A78, 2, -8.0f, 0); this->action = 15; } void func_80B55EBC(EnZl3* this, s32 arg1) { if (arg1 != 0) { func_80B54E14(this, &gZelda2Anime2Anim_007C84, 0, 0.0f, 0); } } void func_80B55EF0(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_0082F8, 2, -8.0f, 0); this->action = 16; EnZl3_setMouthIndex(this, 0); } void func_80B55F38(EnZl3* this, s32 arg1) { if (arg1 != 0) { func_80B54E14(this, &gZelda2Anime2Anim_003FF8, 0, 0.0f, 0); } } void func_80B55F6C(EnZl3* this, GlobalContext* globalCtx) { if (Actor_ProcessTalkRequest(&this->actor, globalCtx)) { this->action = 0x12; } else if (ABS((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y)) <= 0x4300) { BossGanon2* bossGanon2 = func_80B53488(this, globalCtx); if ((bossGanon2 != NULL) && (bossGanon2->unk_324 <= (10.0f / 81.0f))) { this->actor.flags |= ACTOR_FLAG_0 | ACTOR_FLAG_3; this->actor.flags |= ACTOR_FLAG_0; this->actor.textId = 0x7059; func_8002F2F4(&this->actor, globalCtx); } } else { this->actor.flags &= ~(ACTOR_FLAG_0 | ACTOR_FLAG_3); this->actor.flags &= ~ACTOR_FLAG_0; } } void func_80B5604C(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_007664, 2, -8.0f, 0); this->action = 17; func_80B5582C(this); } void func_80B56090(EnZl3* this, s32 arg1) { s32* unk_2F0 = &this->unk_2F0; if (func_80B5396C(this) == *unk_2F0) { if (arg1 != 0) { func_80B54E14(this, &gZelda2Anime2Anim_003FF8, 0, 0.0f, 0); this->action = 16; func_80B53974(this, 7); this->unk_2F0 = 7; } } } void func_80B56108(EnZl3* this, GlobalContext* globalCtx) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CLOSING) { this->actor.flags &= ~(ACTOR_FLAG_0 | ACTOR_FLAG_3); this->actor.flags &= ~ACTOR_FLAG_0; this->action = 16; } } void func_80B56160(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_0001D8, 0, 0.0f, 0); this->action = 19; } void func_80B561A0(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_001110, 2, -8.0f, 0); this->action = 20; } void func_80B561E0(EnZl3* this, s32 arg1) { if (arg1 != 0) { func_80B54E14(this, &gZelda2Anime2Anim_0004F4, 0, 0.0f, 0); } } void func_80B56214(EnZl3* this, GlobalContext* globalCtx) { if (Actor_ProcessTalkRequest(&this->actor, globalCtx)) { this->action = 21; } else if (ABS((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y)) <= 0x4300) { BossGanon2* bossGanon2 = func_80B53488(this, globalCtx); if (bossGanon2 != NULL) { if (bossGanon2->unk_324 <= (10.0f / 81.0f)) { this->actor.flags |= ACTOR_FLAG_0 | ACTOR_FLAG_3; this->actor.flags |= ACTOR_FLAG_0; this->actor.textId = 0x7059; func_8002F2F4(&this->actor, globalCtx); } } } else { this->actor.flags &= ~(ACTOR_FLAG_0 | ACTOR_FLAG_3); this->actor.flags &= ~ACTOR_FLAG_0; } } void func_80B562F4(EnZl3* this, GlobalContext* globalCtx) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CLOSING) { this->actor.flags &= ~(ACTOR_FLAG_0 | ACTOR_FLAG_3); this->actor.flags &= ~ACTOR_FLAG_0; this->action = 20; } } void func_80B5634C(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_002348, 2, -8.0f, 0); this->action = 22; } void func_80B5638C(EnZl3* this, s32 arg1) { if (arg1 != 0) { func_80B54E14(this, &gZelda2Anime2Anim_00210C, 0, 0.0f, 0); } } void func_80B563C0(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_002E54, 2, -8.0f, 0); this->action = 23; } void func_80B56400(EnZl3* this, s32 arg1) { if (arg1 != 0) { func_80B54E14(this, &gZelda2Anime2Anim_002710, 0, 0.0f, 0); } } void func_80B56434(EnZl3* this) { func_80B54E14(this, &gZelda2Anime2Anim_001D8C, 2, -8.0f, 0); this->action = 24; } void func_80B56474(EnZl3* this, s32 arg1) { if (arg1 != 0) { func_80B54E14(this, &gZelda2Anime2Anim_0014DC, 0, 0.0f, 0); } } void func_80B564A8(EnZl3* this, GlobalContext* globalCtx) { s32 temp_v0; s32* val = &D_80B5A494; temp_v0 = func_80B5396C(this); if (*val > 0) { *val -= 1; } else if (*val == 0) { *val -= 1; if (temp_v0 == 8) { func_80B5604C(this); } } if (temp_v0 >= 0) { s32 unk_2F0 = this->unk_2F0; if (temp_v0 != unk_2F0) { switch (temp_v0) { case 0: func_80B55A84(this); break; case 1: func_80B55AC4(this); break; case 2: func_80B55B38(this); break; case 3: func_80B55BAC(this); break; case 4: func_80B55C70(this); break; case 5: func_80B55E08(this); break; case 6: func_80B55E7C(this); break; case 7: func_80B55EF0(this); break; case 8: *val = 10; break; case 9: func_80B56160(this); break; case 10: func_80B561A0(this); break; case 11: func_80B5634C(this); break; case 12: func_80B563C0(this); break; case 13: func_80B56434(this); break; case 14: Actor_Kill(&this->actor); break; default: osSyncPrintf("En_Zl3_inFinal2_Check_DemoMode:そんな動作は無い!!!!!!!!\n"); } this->unk_2F0 = temp_v0; } } } void func_80B56658(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B564A8(this, globalCtx); } void func_80B566AC(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); func_80B55B04(this, EnZl3_UpdateSkelAnime(this)); func_80B564A8(this, globalCtx); } void func_80B5670C(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); func_80B55B78(this, EnZl3_UpdateSkelAnime(this)); func_80B564A8(this, globalCtx); } void func_80B5676C(EnZl3* this, GlobalContext* globalCtx) { s32 something; func_80B54DE0(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); something = EnZl3_UpdateSkelAnime(this); func_80B559C4(this); func_80B55C4C(this, something); } void func_80B567CC(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B564A8(this, globalCtx); } void func_80B5682C(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B55A58(this, globalCtx); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); func_80B55CCC(this, EnZl3_UpdateSkelAnime(this)); func_80B564A8(this, globalCtx); func_80B55D00(this, globalCtx); } void func_80B568B4(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B537E8(this); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B55DB0(this, globalCtx); } void func_80B5691C(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); func_80B55E48(this, EnZl3_UpdateSkelAnime(this)); func_80B564A8(this, globalCtx); } void func_80B5697C(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); func_80B55EBC(this, EnZl3_UpdateSkelAnime(this)); func_80B5585C(this); func_80B564A8(this, globalCtx); } void func_80B569E4(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B533FC(this, globalCtx); func_80B537E8(this); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); func_80B55F38(this, EnZl3_UpdateSkelAnime(this)); func_80B564A8(this, globalCtx); func_80B55F6C(this, globalCtx); } void func_80B56A68(EnZl3* this, GlobalContext* globalCtx) { s32 something; func_80B54DE0(this, globalCtx); func_80B533FC(this, globalCtx); func_80B537E8(this); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); something = EnZl3_UpdateSkelAnime(this); func_80B564A8(this, globalCtx); func_80B56090(this, something); } void func_80B56AE0(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B533FC(this, globalCtx); func_80B537E8(this); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); func_80B55F38(this, EnZl3_UpdateSkelAnime(this)); func_80B56108(this, globalCtx); } void func_80B56B54(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B564A8(this, globalCtx); } void func_80B56BA8(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); func_80B561E0(this, EnZl3_UpdateSkelAnime(this)); func_80B564A8(this, globalCtx); func_80B56214(this, globalCtx); } void func_80B56C24(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B562F4(this, globalCtx); } void func_80B56C84(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); func_80B5638C(this, EnZl3_UpdateSkelAnime(this)); func_80B564A8(this, globalCtx); } void func_80B56CE4(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); func_80B56400(this, EnZl3_UpdateSkelAnime(this)); func_80B564A8(this, globalCtx); } void func_80B56D44(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); func_80B56474(this, EnZl3_UpdateSkelAnime(this)); func_80B564A8(this, globalCtx); } void func_80B56DA4(EnZl3* this) { func_800788CC(NA_SE_EV_ZELDA_POWER); } void func_80B56DC8(EnZl3* this) { func_80078914(&this->actor.projectedPos, NA_SE_VO_Z1_PAIN); } void func_80B56DEC(EnZl3* this) { SkelAnime* skelAnime = &this->skelAnime; if ((skelAnime->mode == 2) && Animation_OnFrame(skelAnime, 9.0f) != 0) { func_80078914(&this->actor.projectedPos, NA_SE_VO_Z1_OPENDOOR); } } void func_80B56E38(EnZl3* this, GlobalContext* globalCtx) { s32 pad[2]; s32 sfxId; SkelAnime* sp20 = &this->skelAnime; if ((Animation_OnFrame(sp20, 6.0f) || Animation_OnFrame(sp20, 0.0f)) && (this->actor.bgCheckFlags & 1)) { sfxId = 0x800; sfxId += SurfaceType_GetSfx(&globalCtx->colCtx, this->actor.floorPoly, this->actor.floorBgId); func_80078914(&this->actor.projectedPos, sfxId); } } void func_80B56EB8(EnZl3* this, GlobalContext* globalCtx) { Flags_SetSwitch(globalCtx, func_80B54DB4(this)); } s32 func_80B56EE4(EnZl3* this, GlobalContext* globalCtx) { return Flags_GetSwitch(globalCtx, func_80B54DB4(this)); } void func_80B56F10(EnZl3* this, GlobalContext* globalCtx) { s32 waypoint; Path* pathHead = globalCtx->setupPathList; if (pathHead != NULL) { waypoint = func_80B54DC4(this); pathHead += waypoint; this->unk_30C = pathHead; this->unk_310 = pathHead->count; osSyncPrintf("En_Zl3_Get_path_info レールデータをゲットだぜ = %d!!!!!!!!!!!!!!\n", waypoint); } else { osSyncPrintf("En_Zl3_Get_path_info レールデータが無い!!!!!!!!!!!!!!!!!!!!\n"); } } s32 func_80B56F8C(EnZl3* this, s32 arg1) { s32 unk_310 = this->unk_310; if (unk_310 > arg1) { return 1; } return 0; } Vec3s* func_80B56FAC(EnZl3* this, s32 arg1) { Vec3s* point; Path* pathList = this->unk_30C; if ((pathList != NULL) && func_80B56F8C(this, arg1)) { point = &((Vec3s*)SEGMENTED_TO_VIRTUAL(pathList->points))[arg1]; return point; } return NULL; } s32 func_80B57034(EnZl3* this, s32 arg1, s32 arg2) { Vec3s* vec1 = func_80B56FAC(this, arg1); Vec3s* vec2 = func_80B56FAC(this, arg2); if ((vec2 != NULL) && (vec1 != NULL)) { f32 xDiff = vec2->x - vec1->x; f32 zDiff = vec2->z - vec1->z; return ((xDiff == 0.0f) && (zDiff == 0.0f)) ? 0 : (s16)(Math_FAtan2F(xDiff, zDiff) * (0x8000 / M_PI)); } return 0; } s16 func_80B57104(EnZl3* this, s32 arg1) { Vec3s* point = func_80B56FAC(this, arg1); if (point != NULL) { f32 xDiff = point->x - this->actor.world.pos.x; f32 zDiff = point->z - this->actor.world.pos.z; if ((xDiff != 0.0f) || (zDiff != 0.0f)) { return Math_FAtan2F(xDiff, zDiff) * (0x8000 / M_PI); } } return 0; } s32 func_80B571A8(EnZl3* this) { s32 pad; s32 unk_314 = this->unk_314; s32 pad2; if (func_80B56F8C(this, unk_314 + 1) == 0) { return this->actor.shape.rot.y; } else { return func_80B57034(this, unk_314, unk_314 + 1); } } s32 func_80B571FC(EnZl3* this) { s32 pad; s32 unk_314 = this->unk_314; if (func_80B56F8C(this, unk_314) == 0) { return this->actor.shape.rot.y; } else { return func_80B57104(this, unk_314); } } void func_80B57240(EnZl3* this) { s32 temp_a1 = func_80B571FC(this); s16* rotY = &this->actor.world.rot.y; Math_SmoothStepToS(rotY, temp_a1, 2, 6400, 1000); this->actor.shape.rot.y = *rotY; } void func_80B57298(EnZl3* this) { s16* rotY = &this->actor.world.rot.y; s16 temp_a1 = func_80B571A8(this); Math_SmoothStepToS(rotY, temp_a1, 2, 6400, 1000); this->actor.shape.rot.y = *rotY; } u16 func_80B572F0(GlobalContext* globalCtx) { s16 sceneNum = globalCtx->sceneNum; u16 ret; if (sceneNum == SCENE_GANON_SONOGO) { ret = 0x71A8; } else if (sceneNum == SCENE_GANON_FINAL) { ret = 0x71A9; } else { ret = 0x71AB; } return ret; } s32 func_80B57324(EnZl3* this, GlobalContext* globalCtx) { if (Actor_ProcessTalkRequest(&this->actor, globalCtx)) { return 1; } return 0; } void func_80B57350(EnZl3* this, GlobalContext* globalCtx) { s16 temp_v0 = this->actor.yawTowardsPlayer - this->actor.shape.rot.y; if (ABS(temp_v0) <= 0x4300) { this->actor.flags |= ACTOR_FLAG_0 | ACTOR_FLAG_3; this->actor.textId = func_80B572F0(globalCtx); func_8002F2F4(&this->actor, globalCtx); } } s32 func_80B573C8(EnZl3* this, GlobalContext* globalCtx) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CLOSING) { return 1; } return 0; } s32 func_80B573FC(EnZl3* this, GlobalContext* globalCtx, f32 arg2) { Player* player = GET_PLAYER(globalCtx); f32 playerX = player->actor.world.pos.x; f32 playerZ = player->actor.world.pos.z; f32 thisX = this->actor.world.pos.x; f32 thisZ = this->actor.world.pos.z; if (SQ(playerX - thisX) + SQ(playerZ - thisZ) < SQ(arg2)) { return 1; } return 0; } s32 func_80B57458(EnZl3* this, GlobalContext* globalCtx) { Vec3f* thisPos = &this->actor.world.pos; f32 thisX = thisPos->x; f32 thisZ = thisPos->z; Player* player = GET_PLAYER(globalCtx); Vec3f* playerPos = &player->actor.world.pos; s32 pad; f32 playerX = playerPos->x; f32 playerZ = playerPos->z; f32 temp_f12 = playerX - thisX; f32 temp_f13 = playerZ - thisZ; s16 temp_v0; s16 temp_v1 = func_80B571A8(this); if (temp_f12 == 0.0f && temp_f13 == 0.0f) { return 1; } temp_v0 = (s16)(temp_v1 - (s16)(Math_FAtan2F(temp_f12, temp_f13) * (0x8000 / M_PI))); if (temp_v0 < 0x1555) { return 1; } else if ((temp_v0 < 0x4000) && func_80B573FC(this, globalCtx, 150.0f)) { return 1; } else { return 0; } } s32 func_80B57564(EnZl3* this, GlobalContext* globalCtx) { if (func_80B573FC(this, globalCtx, 50.0f) || func_80B57458(this, globalCtx)) { return 1; } return 0; } s32 func_80B575B0(EnZl3* this, GlobalContext* globalCtx) { return func_80B573FC(this, globalCtx, 150.0f); } s32 func_80B575D0(EnZl3* this, GlobalContext* globalCtx) { return func_80B573FC(this, globalCtx, 50.0f); } s32 func_80B575F0(EnZl3* this, GlobalContext* globalCtx) { s16 sceneNum = globalCtx->sceneNum; if ((sceneNum == SCENE_GANON_SONOGO) && (func_80B54DB4(this) == 0x26)) { s32 unk_314 = this->unk_314; if (unk_314 == 1) { return 1; } } return 0; } void func_80B5764C(EnZl3* this, GlobalContext* globalCtx) { s16 sceneNum = globalCtx->sceneNum; if ((sceneNum == SCENE_GANON_SONOGO) && (func_80B54DB4(this) == 0x26)) { s32 unk_314 = this->unk_314 + 1; if ((unk_314 == 1) && !Gameplay_InCsMode(globalCtx)) { OnePointCutscene_Init(globalCtx, 1000, 40, &this->actor, MAIN_CAM); } } } s32 func_80B576C8(EnZl3* this, GlobalContext* globalCtx) { if (func_80B575F0(this, globalCtx) && (this->unk_3D8 == 0)) { return 1; } return 0; } void func_80B57704(EnZl3* this, GlobalContext* globalCtx) { s32 unk_3C4 = this->unk_3C4; Flags_SetSwitch(globalCtx, unk_3C4); } void func_80B5772C(EnZl3* this, GlobalContext* globalCtx) { s32 unk_3C4 = this->unk_3C4; Flags_UnsetSwitch(globalCtx, unk_3C4); } void func_80B57754(EnZl3* this, GlobalContext* globalCtx) { if (gSaveContext.unk_13F0 == 0) { Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_OCEFF_WIPE4, this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 1); func_80B56DA4(this); } } void func_80B577BC(GlobalContext* globalCtx, Vec3f* vec) { s32 pad; Player* player = GET_PLAYER(globalCtx); Vec3f* playerPos = &player->actor.world.pos; f32 posX = vec->x; f32 posY = vec->y; f32 posZ = vec->z; Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_TEST, posX, posY, posZ, 0, (Math_FAtan2F(playerPos->x - posX, playerPos->z - posZ) * (0x8000 / M_PI)), 0, 5); } void func_80B57858(GlobalContext* globalCtx) { func_80B577BC(globalCtx, &D_80B5A498); func_80B577BC(globalCtx, &D_80B5A4A4); } s32 func_80B57890(EnZl3* this, GlobalContext* globalCtx) { s8 pad[2]; u8 curSpawn = globalCtx->curSpawn; s16 sceneNum = globalCtx->sceneNum; s32 result = func_80B54DB4(this); if (globalCtx) {} // Needed to match, this if can be almost anywhere and it still matches if (sceneNum == SCENE_GANON_SONOGO) { if ((result == 0x24) && (curSpawn == 0)) { return 1; } if ((result == 0x25) && (curSpawn == 2)) { return 1; } if ((result == 0x26) && (curSpawn == 4)) { return 1; } if ((result == 0x27) && (curSpawn == 6)) { return 1; } if ((result == 0x28) && (curSpawn == 6)) { return 1; } } else if (sceneNum == SCENE_GANON_FINAL) { if ((result == 0x20) && (curSpawn == 0) && Flags_GetSwitch(globalCtx, 0x37)) { if ((globalCtx->sceneNum == SCENE_GANON_DEMO) || (globalCtx->sceneNum == SCENE_GANON_FINAL) || (globalCtx->sceneNum == SCENE_GANON_SONOGO) || (globalCtx->sceneNum == SCENE_GANONTIKA_SONOGO)) { return 1; } } if ((result == 0x21) && (curSpawn == 2)) { return 1; } if ((result == 0x22) && (curSpawn == 4)) { return 1; } if ((result == 0x23) && (curSpawn == 6)) { return 1; } } else if (sceneNum == SCENE_GANONTIKA_SONOGO) { if ((result == 0x29) && (curSpawn == 0)) { return 1; } if ((result == 0x2A) && (curSpawn == 0)) { return 1; } } return 0; } void func_80B57A74(GlobalContext* globalCtx) { Actor* actorIt = globalCtx->actorCtx.actorLists[ACTORCAT_PROP].head; //! @bug checks for encount2 in ACTORCAT_PROP but encount2 is in ACTORCAT_ENEMY so this condition is never met while (actorIt != NULL) { if (actorIt->id == ACTOR_EN_ENCOUNT2) { ((EnEncount2*)actorIt)->collapseSpawnerInactive = true; } actorIt = actorIt->next; } } void func_80B57AAC(EnZl3* this, s32 arg1, AnimationHeader* arg2) { if (arg1 != 0) { func_80B54E14(this, arg2, 0, -8.0f, 0); } } void func_80B57AE0(EnZl3* this, GlobalContext* globalCtx) { s32 pad; s16 shapeRotY = this->actor.shape.rot.y; s32 pad2; Vec3f* unk_354 = &this->unk_354; Vec3f* unk_348 = &this->unk_348; Vec3s* temp_v0; f32 xDiff; f32 zDiff; this->unk_344 = 0; this->unk_314 += 1; this->unk_360 = 0.0f; this->unk_364 = 0.0f; this->unk_368 = 0.0f; *unk_348 = this->actor.world.pos; temp_v0 = func_80B56FAC(this, this->unk_314); if (temp_v0 != NULL) { unk_354->x = temp_v0->x; unk_354->y = temp_v0->y; unk_354->z = temp_v0->z; } else { unk_354->x = unk_348->x + (Math_SinS(shapeRotY) * 200.0f); unk_354->y = unk_348->y; unk_354->z = unk_348->z + (Math_CosS(shapeRotY) * 200.0f); } xDiff = unk_354->x - unk_348->x; zDiff = unk_354->z - unk_348->z; this->unk_346 = (s32)(sqrtf(SQ(xDiff) + SQ(zDiff)) / (kREG(6) + 8.0f)); } s32 func_80B57C54(EnZl3* this) { if (this->unk_344 >= this->unk_346) { return 1; } return 0; } s32 func_80B57C7C(EnZl3* this, GlobalContext* globalCtx) { return 1; } s32 func_80B57C8C(EnZl3* this) { return !func_80B56F8C(this, this->unk_314 + 2); } void func_80B57CB4(EnZl3* this, GlobalContext* globalCtx) { Vec3f* unk_348 = &this->unk_348; Vec3f* unk_354 = &this->unk_354; Vec3f* thisPos = &this->actor.world.pos; f32 temp_f0; this->unk_344 += 1; temp_f0 = Environment_LerpWeightAccelDecel(this->unk_346, 0, this->unk_344, 3, 3); thisPos->x = unk_348->x + (temp_f0 * (unk_354->x - unk_348->x)); thisPos->y = (unk_348->y + (temp_f0 * (unk_354->y - unk_348->y))) + this->unk_360; thisPos->z = unk_348->z + (temp_f0 * (unk_354->z - unk_348->z)); } void func_80B57D60(EnZl3* this, GlobalContext* globalCtx) { func_80B57240(this); } s32 func_80B57D80(EnZl3* this, GlobalContext* globalCtx) { s32 pad; s16* sp32 = &this->actor.shape.rot.y; struct_80034A14_arg1* unk_3F8 = &this->unk_3F8; Player* player = GET_PLAYER(globalCtx); s32 unk_314 = this->unk_314; s16 temp_v0 = func_80B57104(this, unk_314); s32 pad2; s16 phi_v1; unk_3F8->unk_18.y = player->actor.world.pos.y; unk_3F8->unk_18.x = (Math_SinS(temp_v0) * this->actor.xzDistToPlayer) + this->actor.world.pos.x; unk_3F8->unk_18.z = (Math_CosS(temp_v0) * this->actor.xzDistToPlayer) + this->actor.world.pos.z; unk_3F8->unk_14 = kREG(16) - 16.0f; func_80034A14(&this->actor, unk_3F8, kREG(17) + 0xC, 4); phi_v1 = ABS(temp_v0 - *sp32); if (phi_v1 <= 0x320) { *sp32 = temp_v0; this->actor.world.rot.y = *sp32; phi_v1 = 0; } this->actor.world.rot.y = *sp32; return phi_v1; } void func_80B57EAC(EnZl3* this, GlobalContext* globalCtx) { if (func_80B57324(this, globalCtx)) { this->action = 26; } else { func_80B57350(this, globalCtx); } } void func_80B57EEC(EnZl3* this, GlobalContext* globalCtx) { if (func_80B573C8(this, globalCtx)) { this->action = 27; } } void func_80B57F1C(EnZl3* this, GlobalContext* globalCtx) { if (func_80B57D80(this, globalCtx) == 0) { func_80B54E14(this, &gZelda2Anime2Anim_009BE4, 0, -8.0f, 0); this->action = 34; this->unk_314 -= 1; func_80B57AE0(this, globalCtx); } } s32 func_80B57F84(EnZl3* this, GlobalContext* globalCtx) { if (func_80B575D0(this, globalCtx) && func_80B57C7C(this, globalCtx) && !Gameplay_InCsMode(globalCtx)) { func_80B54E14(this, &gZelda2Anime2Anim_009FBC, 0, -8.0f, 0); this->action = 36; this->unk_2EC = 0.0f; func_80B57A74(globalCtx); return 1; } return 0; } void func_80B58014(EnZl3* this, GlobalContext* globalCtx) { s32 pad; Player* player = GET_PLAYER(globalCtx); s8 invincibilityTimer = player->invincibilityTimer; if (func_80B57324(this, globalCtx)) { func_80B54E14(this, &gZelda2Anime2Anim_003FF8, 0, -11.0f, 0); this->action = 29; func_80B538B0(this); } else if (func_80B57C8C(this) && func_80B57F84(this, globalCtx)) { OnePointCutscene_Init(globalCtx, 4000, -99, &this->actor, MAIN_CAM); this->unk_3D0 = 0; } else if (func_80B576C8(this, globalCtx) && func_80B575B0(this, globalCtx) && !Gameplay_InCsMode(globalCtx)) { this->action = 0x1F; this->unk_3CC = 0.0f; func_80B537E8(this); this->unk_3D8 = 1; OnePointCutscene_Init(globalCtx, 4010, -99, &this->actor, MAIN_CAM); } else if (!func_80B57C8C(this) && !func_80B576C8(this, globalCtx) && func_80B57564(this, globalCtx)) { func_80B54E14(this, &gZelda2Anime2Anim_009BE4, 0, -8.0f, 0); func_80B5764C(this, globalCtx); this->action = 34; this->unk_3D0 = 0; func_80B57AE0(this, globalCtx); } else if ((invincibilityTimer > 0) || (player->fallDistance >= 0x33)) { func_80B54E14(this, &gZelda2Anime2Anim_007664, 0, -11.0f, 0); this->action = 30; func_80B537E8(this); func_80B56DC8(this); } else { func_80B57350(this, globalCtx); func_80B538B0(this); } } void func_80B58214(EnZl3* this, GlobalContext* globalCtx) { if (func_80B573C8(this, globalCtx)) { func_80B54E14(this, &gZelda2Anime2Anim_009FBC, 0, -11.0f, 0); this->action = 28; this->unk_3D0 = 0; } } void func_80B58268(EnZl3* this, GlobalContext* globalCtx) { Player* player = GET_PLAYER(globalCtx); s8 invincibilityTimer = player->invincibilityTimer; if ((invincibilityTimer <= 0) && (player->fallDistance <= 50)) { func_80B54E14(this, &gZelda2Anime2Anim_009FBC, 0, -11.0f, 0); this->action = 28; this->unk_3D0 = 0; } } void func_80B582C8(EnZl3* this, GlobalContext* globalCtx) { f32* unk_3CC = &this->unk_3CC; s32 pad; if (*unk_3CC == kREG(14) + 10.0f) { *unk_3CC += 1.0f; func_80B54E14(this, &gZelda2Anime2Anim_008050, 0, -12.0f, 0); func_80B57704(this, globalCtx); } else if (*unk_3CC == kREG(15) + 20.0f) { *unk_3CC += 1.0f; func_80B56DC8(this); func_80B54E14(this, &gZelda2Anime2Anim_003FF8, 0, -12.0f, 0); } else if (*unk_3CC == kREG(16) + 30.0f) { *unk_3CC += 1.0f; func_80B57858(globalCtx); } else if (*unk_3CC == kREG(17) + 40.0f) { func_8005B1A4(GET_ACTIVE_CAM(globalCtx)); *unk_3CC += 1.0f; } else if (*unk_3CC >= ((kREG(17) + 40.0f) + 1.0f)) { this->action = 32; *unk_3CC = 0.0f; } else { *unk_3CC += 1.0f; } } void func_80B584B4(EnZl3* this, GlobalContext* globalCtx) { s32 pad; Player* player = GET_PLAYER(globalCtx); s8 invincibilityTimer = player->invincibilityTimer; Actor* nearbyEnTest = Actor_FindNearby(globalCtx, &this->actor, ACTOR_EN_TEST, ACTORCAT_ENEMY, 8000.0f); if (D_80B5A4BC == 0) { if ((nearbyEnTest == NULL) && (!Gameplay_InCsMode(globalCtx))) { this->action = 33; OnePointCutscene_Init(globalCtx, 4011, -99, &this->actor, MAIN_CAM); } else if (invincibilityTimer > 0) { func_80B54E14(this, &gZelda2Anime2Anim_003FF8, 0, -12.0f, 0); D_80B5A4BC = 1; func_80B56DC8(this); } } else { if ((nearbyEnTest == NULL) && (!Gameplay_InCsMode(globalCtx))) { func_80B54E14(this, &gZelda2Anime2Anim_007664, 0, -12.0f, 0); D_80B5A4BC = 0; this->action = 33; OnePointCutscene_Init(globalCtx, 4011, -99, &this->actor, MAIN_CAM); } else if (invincibilityTimer <= 0) { func_80B54E14(this, &gZelda2Anime2Anim_007664, 0, -12.0f, 0); D_80B5A4BC = 0; } } } void func_80B58624(EnZl3* this, GlobalContext* globalCtx) { s32 pad[4]; f32* unk_3CC = &this->unk_3CC; if (*unk_3CC == (kREG(18) + 10.0f)) { *unk_3CC += 1.0f; func_80B54E14(this, &gZelda2Anime2Anim_008050, 0, -12.0f, 0); func_80B5772C(this, globalCtx); } else if (*unk_3CC == kREG(19) + 20.0f) { *unk_3CC += 1.0f; this->actor.textId = 0x71AC; Message_StartTextbox(globalCtx, this->actor.textId, NULL); func_80B54E14(this, &gZelda2Anime2Anim_003FF8, 0, -12.0f, 0); } else if (*unk_3CC == ((kREG(19) + 20.0f) + 1.0f)) { if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CLOSING) { *unk_3CC += 1.0f; func_80B5357C(this, globalCtx); func_80B5357C(this, globalCtx); func_80B5357C(this, globalCtx); func_80B5357C(this, globalCtx); func_80B5357C(this, globalCtx); } } else { if (*unk_3CC >= kREG(20) + 30.0f) { this->action = 28; func_8005B1A4(GET_ACTIVE_CAM(globalCtx)); func_80B54E14(this, &gZelda2Anime2Anim_009FBC, 0, -12.0f, 0); *unk_3CC = 0.0f; } else { *unk_3CC += 1.0f; } } } void func_80B5884C(EnZl3* this, GlobalContext* globalCtx) { func_80B54E14(this, &gZelda2Anime2Anim_0038C0, 2, -8.0f, 0); this->action = 37; this->unk_36C = 1; } void func_80B58898(EnZl3* this, GlobalContext* globalCtx) { func_80B54E14(this, &gZelda2Anime2Anim_0038C0, 2, -8.0f, 1); this->action = 38; this->unk_374 = 1; } void func_80B588E8(EnZl3* this, GlobalContext* globalCtx) { func_80B54E14(this, &gZelda2Anime2Anim_009BE4, 0, -8.0f, 0); func_80B57AE0(this, globalCtx); this->action = 39; } s32 func_80B58938(EnZl3* this, GlobalContext* globalCtx) { if (func_80B57C54(this)) { func_80B54E14(this, &gZelda2Anime2Anim_009FBC, 0, -8.0f, 0); this->action = 28; this->unk_3D0 = 0; return 1; } return 0; } s32 func_80B5899C(EnZl3* this, GlobalContext* globalCtx) { if ((this->actor.bgCheckFlags & 1)) { Player* player = GET_PLAYER(globalCtx); s8 invincibilityTimer = player->invincibilityTimer; if ((invincibilityTimer > 0) || (player->fallDistance >= 0x33)) { func_80B54E14(this, &gZelda2Anime2Anim_007664, 2, -11.0f, 0); this->action = 35; func_80B56DC8(this); return 1; } } return 0; } void func_80B58A1C(EnZl3* this, GlobalContext* globalCtx) { if (!func_80B58938(this, globalCtx)) { func_80B5899C(this, globalCtx); } } void func_80B58A50(EnZl3* this, GlobalContext* globalCtx) { Player* player = GET_PLAYER(globalCtx); s8 invincibilityTimer = player->invincibilityTimer; if ((invincibilityTimer <= 0) && (player->fallDistance <= 50)) { func_80B54E14(this, &gZelda2Anime2Anim_009BE4, 0, -11.0f, 0); this->action = 34; } } void func_80B58AAC(EnZl3* this, GlobalContext* globalCtx) { f32* unk_2EC = &this->unk_2EC; *unk_2EC += 1.0f; if ((*unk_2EC >= kREG(7) + 24.0f) && (this->unk_36C == 0)) { func_80B57754(this, globalCtx); func_80B5884C(this, globalCtx); } else if ((*unk_2EC >= kREG(8) + 50.0f) && (this->unk_370 == 0)) { func_80B56EB8(this, globalCtx); this->unk_370 = 1; } else if ((*unk_2EC >= kREG(9) + 56.0f) && (this->unk_374 == 0)) { func_80B58898(this, globalCtx); } else if (*unk_2EC >= kREG(10) + 82.0f) { func_80B588E8(this, globalCtx); } } void func_80B58C08(EnZl3* this, GlobalContext* globalCtx) { s32 pad[2]; Vec3f* unk_348 = &this->unk_348; Vec3f* unk_354 = &this->unk_354; Vec3f* thisPos = &this->actor.world.pos; s32 unk_344; s32 unk_346; s32 sp28; f32 temp_f0; this->unk_344 += 1; unk_344 = this->unk_344; unk_346 = this->unk_346; sp28 = unk_346 - kREG(11) - 2; temp_f0 = Environment_LerpWeightAccelDecel(unk_346, 0, unk_344, 3, 0); thisPos->x = unk_348->x + (temp_f0 * (unk_354->x - unk_348->x)); thisPos->y = (unk_348->y + (temp_f0 * (unk_354->y - unk_348->y))) + this->unk_360; thisPos->z = unk_348->z + (temp_f0 * (unk_354->z - unk_348->z)); if ((unk_344 - sp28) >= 0) { this->alpha = ((f32)(unk_346 - unk_344) / (kREG(11) + 2)) * 255.0f; this->drawConfig = 2; } if ((unk_346 - unk_344) <= 0) { Actor_Kill(&this->actor); } } void func_80B58D50(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B57EAC(this, globalCtx); } void func_80B58DB0(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B57EEC(this, globalCtx); } void func_80B58E10(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); Actor_SetFocus(&this->actor, 60.0f); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B57F1C(this, globalCtx); } void func_80B58E7C(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B53764(this, globalCtx); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B58014(this, globalCtx); func_80B536B4(this); } void func_80B58EF4(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B538B0(this); func_80B53764(this, globalCtx); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B58214(this, globalCtx); } void func_80B58F6C(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B537E8(this); func_80B536C4(this); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B58268(this, globalCtx); } void func_80B58FDC(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B537E8(this); func_80B536C4(this); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B582C8(this, globalCtx); } void func_80B5904C(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B537E8(this); func_80B536C4(this); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B584B4(this, globalCtx); } void func_80B590BC(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B537E8(this); func_80B536C4(this); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B58624(this, globalCtx); } void func_80B5912C(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B536C4(this); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); func_80B56E38(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B57CB4(this, globalCtx); func_80B57D60(this, globalCtx); func_80B58A1C(this, globalCtx); } void func_80B591BC(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B536C4(this); func_80B538B0(this); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B58A50(this, globalCtx); } void func_80B5922C(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B536C4(this); func_80B57298(this); Actor_SetFocus(&this->actor, 60.0f); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B58AAC(this, globalCtx); } void func_80B592A8(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B536C4(this); func_80B57298(this); Actor_SetFocus(&this->actor, 60.0f); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); func_80B57AAC(this, EnZl3_UpdateSkelAnime(this), &gZelda2Anime2Anim_003D20); func_80B56DEC(this); func_80B58AAC(this, globalCtx); } void func_80B59340(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B536C4(this); func_80B57298(this); Actor_SetFocus(&this->actor, 60.0f); func_80B533FC(this, globalCtx); func_80B5366C(this, globalCtx); EnZl3_UpdateEyes(this); func_80B57AAC(this, EnZl3_UpdateSkelAnime(this), &gZelda2Anime2Anim_009FBC); func_80B58AAC(this, globalCtx); } void func_80B593D0(EnZl3* this, GlobalContext* globalCtx) { func_80B54DE0(this, globalCtx); func_80B536C4(this); func_80B57298(this); func_80B5366C(this, globalCtx); func_80B56E38(this, globalCtx); Actor_SetFocus(&this->actor, 60.0f); EnZl3_UpdateEyes(this); EnZl3_UpdateSkelAnime(this); func_80B58C08(this, globalCtx); } s32 func_80B5944C(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx, Gfx** gfx) { if (limbIndex == 14) { Mtx* mtx = Graph_Alloc(globalCtx->state.gfxCtx, sizeof(Mtx) * 7); EnZl3* this = (EnZl3*)thisx; Vec3s* vec = &this->unk_3F8.unk_08; gSPSegment(gfx[0]++, 0x0C, mtx); rot->x += vec->y; rot->z += vec->x; Matrix_Push(); Matrix_Translate(pos->x, pos->y, pos->z, MTXMODE_APPLY); Matrix_RotateZYX(rot->x, rot->y, rot->z, MTXMODE_APPLY); Matrix_Push(); Matrix_Translate(174.0f, -317.0f, 0.0f, MTXMODE_APPLY); MATRIX_TOMTX(&mtx[0]); Matrix_Translate(-410.0f, -184.0f, 0.0f, MTXMODE_APPLY); MATRIX_TOMTX(&mtx[1]); Matrix_Translate(-1019.0f, -26.0f, 0.0f, MTXMODE_APPLY); MATRIX_TOMTX(&mtx[2]); Matrix_Pop(); Matrix_Push(); Matrix_Translate(40.0f, 264.0f, 386.0f, MTXMODE_APPLY); MATRIX_TOMTX(&mtx[3]); Matrix_Translate(-446.0f, -52.0f, 84.0f, MTXMODE_APPLY); MATRIX_TOMTX(&mtx[4]); Matrix_Pop(); Matrix_Push(); Matrix_Translate(40.0f, 264.0f, -386.0f, MTXMODE_APPLY); MATRIX_TOMTX(&mtx[5]); Matrix_Translate(-446.0f, -52.0f, -84.0f, MTXMODE_APPLY); MATRIX_TOMTX(&mtx[6]); Matrix_Pop(); Matrix_Pop(); } return false; } s32 func_80B59698(EnZl3* this, GlobalContext* globalCtx) { s32 cond = Flags_GetSwitch(globalCtx, 0x37) && ((globalCtx->sceneNum == SCENE_GANON_DEMO) || (globalCtx->sceneNum == SCENE_GANON_FINAL) || (globalCtx->sceneNum == SCENE_GANON_SONOGO) || (globalCtx->sceneNum == SCENE_GANONTIKA_SONOGO)); if (cond) { u8 curSpawn = globalCtx->curSpawn; if ((func_80B54DB4(this) == 0x20) && (curSpawn == 0) && ((gSaveContext.timer2Value <= 0) || (gSaveContext.timer2State == 0))) { return 1; } } return 0; } s32 func_80B59768(EnZl3* this, GlobalContext* globalCtx) { s32 cond = Flags_GetSwitch(globalCtx, 0x37) && ((globalCtx->sceneNum == SCENE_GANON_DEMO) || (globalCtx->sceneNum == SCENE_GANON_FINAL) || (globalCtx->sceneNum == SCENE_GANON_SONOGO) || (globalCtx->sceneNum == SCENE_GANONTIKA_SONOGO)); if (cond) { u8 curSpawn = globalCtx->curSpawn; if ((func_80B54DB4(this) == 0x20) && (curSpawn == 0) && (gSaveContext.timer2Value <= 0)) { return 1; } } return 0; } void func_80B59828(EnZl3* this, GlobalContext* globalCtx) { if (func_80B59698(this, globalCtx) || (!func_80B56EE4(this, globalCtx) && func_80B57890(this, globalCtx))) { s16 newRotY; func_80B54E14(this, &gZelda2Anime2Anim_009FBC, 0, 0.0f, 0); this->actor.flags |= ACTOR_FLAG_0 | ACTOR_FLAG_3; func_80B56F10(this, globalCtx); newRotY = func_80B571A8(this); this->actor.shape.rot.y = newRotY; this->actor.world.rot.y = newRotY; this->unk_3C4 = this->actor.world.rot.z; this->actor.shape.rot.z = 0; this->actor.world.rot.z = this->actor.shape.rot.z; this->action = 28; this->drawConfig = 1; } else { Actor_Kill(&this->actor); } if (func_80B59698(this, globalCtx) != 0) { func_80088AA0(180); func_80B53468(); gSaveContext.healthAccumulator = 320; Magic_Fill(globalCtx); if (Flags_GetSwitch(globalCtx, 0x20)) { Flags_UnsetSwitch(globalCtx, 0x20); Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_BG_ZG, -144.0f, 3544.0f, -43.0f, 0, 0x2000, 0, 0x2000); } Flags_UnsetSwitch(globalCtx, 0x21); Flags_UnsetSwitch(globalCtx, 0x22); Flags_UnsetSwitch(globalCtx, 0x23); Flags_UnsetSwitch(globalCtx, 0x24); Flags_UnsetSwitch(globalCtx, 0x25); Flags_UnsetSwitch(globalCtx, 0x26); Flags_UnsetSwitch(globalCtx, 0x27); Flags_UnsetSwitch(globalCtx, 0x28); Flags_UnsetSwitch(globalCtx, 0x29); Flags_UnsetSwitch(globalCtx, 0x2A); } if (func_80B54DB4(this) == 0x20) { s32 cond; func_80B54EA4(this, globalCtx); cond = Flags_GetSwitch(globalCtx, 0x37) && ((globalCtx->sceneNum == SCENE_GANON_DEMO) || (globalCtx->sceneNum == SCENE_GANON_FINAL) || (globalCtx->sceneNum == SCENE_GANON_SONOGO) || (globalCtx->sceneNum == SCENE_GANONTIKA_SONOGO)); if (cond) { func_80B53614(this, globalCtx); } } } void func_80B59A80(EnZl3* this, GlobalContext* globalCtx) { if (func_80B59768(this, globalCtx)) { Audio_PlaySoundGeneral(NA_SE_OC_REVENGE, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); } } void func_80B59AD0(EnZl3* this, GlobalContext* globalCtx) { // todo look into Actor* thisx = &this->actor; // unused, necessary to use 'this' first to fix regalloc Flags_SetSwitch(globalCtx, 0x36); func_80088AA0(180); func_80B54EA4(this, globalCtx); func_80B53614(this, globalCtx); gSaveContext.eventChkInf[12] &= ~0x80; func_80B56F10(this, globalCtx); gSaveContext.healthAccumulator = 320; Magic_Fill(globalCtx); this->action = 27; this->drawConfig = 1; } void func_80B59B6C(EnZl3* this, GlobalContext* globalCtx) { s32 sp2C = func_80B54DD4(this); this->unk_3DC = Animation_GetLastFrame(SEGMENTED_TO_VIRTUAL(&gZelda2Anime2Anim_0091D8)); this->unk_3E0 = Animation_GetLastFrame(SEGMENTED_TO_VIRTUAL(&gZelda2Anime2Anim_00A598)); this->unk_3E4 = Animation_GetLastFrame(SEGMENTED_TO_VIRTUAL(&gZelda2Anime2Anim_00A334)); this->unk_3F4 = Animation_GetLastFrame(SEGMENTED_TO_VIRTUAL(&gZelda2Anime2Anim_001110)); this->unk_3EC = Animation_GetLastFrame(SEGMENTED_TO_VIRTUAL(&gZelda2Anime2Anim_002348)); this->unk_3F0 = Animation_GetLastFrame(SEGMENTED_TO_VIRTUAL(&gZelda2Anime2Anim_002E54)); this->unk_3E8 = Animation_GetLastFrame(SEGMENTED_TO_VIRTUAL(&gZelda2Anime2Anim_001D8C)); switch (sp2C) { case 0: func_80B54FB4(this, globalCtx); break; case 1: func_80B55780(this, globalCtx); break; case 3: func_80B59828(this, globalCtx); break; default: osSyncPrintf(VT_FGCOL(RED) " En_Oa3 の arg_data がおかしい!!!!!!!!!!!!!!!!!!!!!!!!!\n" VT_RST); Actor_Kill(&this->actor); } } void func_80B59DB8(EnZl3* this, GlobalContext* globalCtx) { s32 pad; ObjectContext* objCtx = &globalCtx->objectCtx; s32 objIndex = Object_GetIndex(objCtx, OBJECT_ZL2_ANIME2); s32 pad2; if (objIndex < 0) { osSyncPrintf(VT_FGCOL(RED) "En_Zl3_main_bankアニメーションのバンクを読めない!!!!!!!!!!!!\n" VT_RST); return; } if (Object_IsLoaded(objCtx, objIndex)) { this->unk_318 = objIndex; func_80B54DE0(this, globalCtx); func_80B59B6C(this, globalCtx); } } static EnZl3ActionFunc sActionFuncs[] = { func_80B59DB8, func_80B55550, func_80B555A4, func_80B55604, func_80B5566C, func_80B556CC, func_80B5572C, func_80B56658, func_80B566AC, func_80B5670C, func_80B5676C, func_80B567CC, func_80B5682C, func_80B568B4, func_80B5691C, func_80B5697C, func_80B569E4, func_80B56A68, func_80B56AE0, func_80B56B54, func_80B56BA8, func_80B56C24, func_80B56C84, func_80B56CE4, func_80B56D44, func_80B58D50, func_80B58DB0, func_80B58E10, func_80B58E7C, func_80B58EF4, func_80B58F6C, func_80B58FDC, func_80B5904C, func_80B590BC, func_80B5912C, func_80B591BC, func_80B5922C, func_80B592A8, func_80B59340, func_80B593D0, }; void EnZl3_Update(Actor* thisx, GlobalContext* globalCtx) { EnZl3* this = (EnZl3*)thisx; if (this->action < 0 || this->action >= ARRAY_COUNT(sActionFuncs) || sActionFuncs[this->action] == NULL) { osSyncPrintf(VT_FGCOL(RED) "メインモードがおかしい!!!!!!!!!!!!!!!!!!!!!!!!!\n" VT_RST); return; } sActionFuncs[this->action](this, globalCtx); } void EnZl3_Init(Actor* thisx, GlobalContext* globalCtx) { EnZl3* this = (EnZl3*)thisx; ActorShape* shape = &this->actor.shape; s32 pad; osSyncPrintf("ゼルダ姫のEn_Zl3_Actor_ct通すよ!!!!!!!!!!!!!!!!!!!!!!!!!\n"); ActorShape_Init(shape, 0.0f, ActorShadow_DrawCircle, 30.0f); shape->shadowAlpha = 0; func_80B533B0(thisx, globalCtx); SkelAnime_InitFlex(globalCtx, &this->skelAnime, &gZelda2Skel, NULL, this->jointTable, this->morphTable, 15); switch (func_80B54DD4(this)) { case 1: gSaveContext.timer2State = 0; break; case 3: func_80B59A80(this, globalCtx); break; } osSyncPrintf("ゼルダ姫のEn_Zl3_Actor_ctは通った!!!!!!!!!!!!!!!!!!!!!!!!!\n"); } static OverrideLimbDraw sOverrideLimbDrawFuncs[] = { func_80B5458C, func_80B5944C, }; s32 EnZl3_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx, Gfx** gfx) { EnZl3* this = (EnZl3*)thisx; if (this->unk_308 < 0 || this->unk_308 >= ARRAY_COUNT(sOverrideLimbDrawFuncs) || sOverrideLimbDrawFuncs[this->unk_308] == NULL) { osSyncPrintf(VT_FGCOL(RED) "描画前処理モードがおかしい!!!!!!!!!!!!!!!!!!!!!!!!!\n" VT_RST); return 0; } return sOverrideLimbDrawFuncs[this->unk_308](globalCtx, limbIndex, dList, pos, rot, thisx, gfx); } void func_80B59FE8(EnZl3* this, GlobalContext* globalCtx) { } void func_80B59FF4(EnZl3* this, GlobalContext* globalCtx) { s32 pad[2]; s16 eyeTexIndex = this->eyeTexIndex; void* eyeTex = sEyeTextures[eyeTexIndex]; s16 mouthTexIndex = this->mouthTexIndex; SkelAnime* skelAnime = &this->skelAnime; void* mouthTex = sMouthTextures[mouthTexIndex]; s32 pad2; OPEN_DISPS(globalCtx->state.gfxCtx); func_80093D18(globalCtx->state.gfxCtx); gSPSegment(POLY_OPA_DISP++, 0x8, SEGMENTED_TO_VIRTUAL(eyeTex)); gSPSegment(POLY_OPA_DISP++, 0x9, SEGMENTED_TO_VIRTUAL(eyeTex)); gSPSegment(POLY_OPA_DISP++, 0xA, SEGMENTED_TO_VIRTUAL(mouthTex)); gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); gSPSegment(POLY_OPA_DISP++, 0xB, &D_80116280[2]); POLY_OPA_DISP = SkelAnime_DrawFlex(globalCtx, skelAnime->skeleton, skelAnime->jointTable, skelAnime->dListCount, EnZl3_OverrideLimbDraw, EnZl3_PostLimbDraw, this, POLY_OPA_DISP); CLOSE_DISPS(globalCtx->state.gfxCtx); } void func_80B5A1D0(EnZl3* this, GlobalContext* globalCtx) { s32 pad[2]; s16 eyeTexIndex = this->eyeTexIndex; void* eyeTex = sEyeTextures[eyeTexIndex]; s16 mouthTexIndex = this->mouthTexIndex; SkelAnime* skelAnime = &this->skelAnime; void* mouthTex = sMouthTextures[mouthTexIndex]; s32 pad2; OPEN_DISPS(globalCtx->state.gfxCtx); func_80093D84(globalCtx->state.gfxCtx); gSPSegment(POLY_XLU_DISP++, 8, SEGMENTED_TO_VIRTUAL(eyeTex)); gSPSegment(POLY_XLU_DISP++, 9, SEGMENTED_TO_VIRTUAL(eyeTex)); gSPSegment(POLY_XLU_DISP++, 10, SEGMENTED_TO_VIRTUAL(mouthTex)); gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->alpha); gSPSegment(POLY_XLU_DISP++, 11, &D_80116280[0]); POLY_XLU_DISP = SkelAnime_DrawFlex(globalCtx, skelAnime->skeleton, skelAnime->jointTable, skelAnime->dListCount, EnZl3_OverrideLimbDraw, NULL, this, POLY_XLU_DISP); CLOSE_DISPS(globalCtx->state.gfxCtx); } static EnZl3DrawFunc sDrawFuncs[] = { func_80B59FE8, func_80B59FF4, func_80B5A1D0, }; void EnZl3_Draw(Actor* thisx, GlobalContext* globalCtx) { EnZl3* this = (EnZl3*)thisx; if (this->drawConfig < 0 || this->drawConfig >= 3 || sDrawFuncs[this->drawConfig] == NULL) { osSyncPrintf(VT_FGCOL(RED) "描画モードがおかしい!!!!!!!!!!!!!!!!!!!!!!!!!\n" VT_RST); return; } sDrawFuncs[this->drawConfig](this, globalCtx); } const ActorInit En_Zl3_InitVars = { ACTOR_EN_ZL3, ACTORCAT_NPC, FLAGS, OBJECT_ZL2, sizeof(EnZl3), (ActorFunc)EnZl3_Init, (ActorFunc)EnZl3_Destroy, (ActorFunc)EnZl3_Update, (ActorFunc)EnZl3_Draw, (ActorResetFunc)EnZl3_Reset, }; void EnZl3_Reset(void) { D_80B5A468 = 0; D_80B5A494 = -1; D_80B5A4BC = 0; }