mirror of https://github.com/zeldaret/mm.git
BossHakugin (Goht) OK and documented, EnHakurock documented, other assorted documentation (#1599)
* Fix struct * 20/79 OK * BossHakugin_Draw OK * func_80B0D69C OK * func_80B0D2B8 OK * func_80B0D750 OK * Shadow function docs * Fix some non-matchings * Apparently this matches now? It didn't before * OverrideLimbDraw OK * BossHakugin_PostLimbDraw * Animation Cleanup: En_G* (#1395) * wip * more cleanup * more cleanup * one more thing * one more default case * missed brackets * PR Review * add more matches and fill stuct * 3 more Draw functions * func_80B0E5A4 * Finshed the Draw functions * Small cleanup * Most of the death-handling code done * more matching * functions * Goht collab (#9) * Animation Cleanup: En_G* (#1395) * wip * more cleanup * more cleanup * one more thing * one more default case * missed brackets * PR Review * z_message_nes (1 NON_MATCHING) (#1394) * Bring over progress * Some docs * scratch urls + format * Fixes * Match Message_DrawTextNES * String macros * color structs * Document object_mk (#1389) * Updated object_mk animation, limb, and skeleton names * Updated object_mk texture and DList names * Added comment to object_mk.xml * Remove "ing" from Anim names Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * Update z_en_mk.c to not use "ing" in names * Running formatter --------- Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * Player Docs: Initial framework for "Action Change Lists" (#1397) * copy fig docs * adjust wording * another fix * fix bool * PR Suggestion * Animation Cleanup: En_H* (#1399) * begin H * more cleanup * Animation Cleanup: En_I* (#1400) * cleanup I * oops * Start Player Item Docs (#1396) * Copy Fig Docs * small cleanup * ItemChangeType comment * bool * item change comments * PR Review * rm comments * Animation Cleanup: En_K* (#1402) * cleanup k * one more name * Animation Cleanup: En_J* (#1401) * cleanup J * small fix * functions --------- Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> Co-authored-by: Derek Hensley <hensley.derek58@gmail.com> Co-authored-by: Zach North <zrnorth@gmail.com> Co-authored-by: petrie911 <pmontag@Monday.localdomain> * hotfix * all functions decomped * all functions decomped * Now with more data * small fix * another small fix * ok last small fix I swear * cleanup * func_80B0A8C4 OK * func_80B0D9CC OK * Use generated reloc for Goht + remove Goht's undefined_syms * Bodyparts + other clean up * cleanup * oops * fix merge * begin docs * fix merge * cutscene docs * effects docs * small docs * Document colliders * Odds and ends in the struct * Name some functions * Name two functions * Some action functions and other odds and ends * Name the lightning segments and electric ball functions correctly * Names and other cleanup * Start on hakurock + more cleanup * Name all hakurock functions * Name hakurock effects + create a GET_TYPE macro for it * Finish documenting Hakurock * Name one more function in BossHakugin * Name a few more things * Name a lot of struct vars * Wall-related stuff * Fix some fake matches * Name a couple more struct vars * Document some more of the struct * Name the limb flag stuff * Name the last unnamed struct vars * Name the horn colliders correctly * Some initial work on documenting data * Some function documentation * A couple of cleanups * Finish documenting BossHakugin_UpdateBaseRot * Name BossHakugin_SetLightningSegmentColliderVertices * Document BossHakugin_AddLightningSegments * Document BossHakugin_RunUpdateCommon and related functions * Document BossHakugin_AddMalfunctionEffects * Document BossHakugin_StepVectorToTarget * Rename to BossHakugin_StepVector * Finish documenting BossHakugin_AddMalfunctionEffects for now, might come back later though * Document BossHakugin_UpdateSubCam * Document BossHakugin_Thaw * Document BossHakugin_ChargeUpAttack * Some scattered docs * Finish documenting the top "library" functions * Document intro cutscene functions * Document running and charging * Document downed * Document throwing * Document remaining non-death action functions * Document most of the death cutscene * Get started on documenting crushing rocks * Separate out the crushing rocks into their own struct * Document the ExplosionLimbHideInfo * Finish documenting BossHakugin_DeathCutsceneCrushedByRocks * Almost done with rocks I think * Port over Odolwa shadow documentation * Finish documenting draw functions * Finish documenting BossHakugin_Update * Name variables in BossHakugin_UpdateElectricBalls * Document BossHakugin_CheckForBodyColliderHit * Finish documenting BossHakugin_UpdateDamage * I've convinced myself these names are fine * Almost finish documenting every update function * Remove TODOs from the header * Finish documenting the C file * Delete duplicate define * Finish variables.txt for Goht * Undo change that desync'd z_eff_ss_fhg_flash.h from other effect headers * Missed a THIS * Some low-hanging review responses * Add comment explaining something in BossHakugin_ShouldWait * Match BossHakugin_SpawnLargeStalactiteWalls using a for-loop * Create GOHT_ELECTRIC_BALL_COUNT_MAX constant * vector -> norm and targetVector -> targetNorm * Add TODO comments for dynamic shadow functions --------- Co-authored-by: Derek Hensley <hensley.derek58@gmail.com> Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> Co-authored-by: Parker B <20159000+jpburnett@users.noreply.github.com> Co-authored-by: petrie911 <pmontag@Monday.localdomain> Co-authored-by: petrie911 <69443847+petrie911@users.noreply.github.com> Co-authored-by: Zach North <zrnorth@gmail.com> Co-authored-by: engineer124 <engineer124engineer124@gmail.com>
This commit is contained in:
parent
5db52cfd39
commit
5684c79312
|
@ -1587,18 +1587,18 @@ typedef enum {
|
||||||
#define EVENTINF_50 0x50
|
#define EVENTINF_50 0x50
|
||||||
#define EVENTINF_51 0x51
|
#define EVENTINF_51 0x51
|
||||||
#define EVENTINF_HAS_DAYTIME_TRANSITION_CS 0x52
|
#define EVENTINF_HAS_DAYTIME_TRANSITION_CS 0x52
|
||||||
#define EVENTINF_53 0x53
|
|
||||||
#define EVENTINF_54 0x54
|
|
||||||
#define EVENTINF_55 0x55
|
|
||||||
|
|
||||||
// Enabled when Gyorg's intro cutscene has been watched
|
// Enabled when various boss intro cutscene has been watched
|
||||||
#define EVENTINF_56 0x56
|
#define EVENTINF_INTRO_CS_WATCHED_GOHT 0x53
|
||||||
|
#define EVENTINF_INTRO_CS_WATCHED_ODOLWA 0x54
|
||||||
|
#define EVENTINF_INTRO_CS_WATCHED_TWINMOLD 0x55
|
||||||
|
#define EVENTINF_INTRO_CS_WATCHED_GYORG 0x56
|
||||||
|
#define EVENTINF_INTRO_CS_WATCHED_IGOS_DU_IKANA 0x57
|
||||||
|
#define EVENTINF_INTRO_CS_WATCHED_WART 0x60
|
||||||
|
#define EVENTINF_INTRO_CS_WATCHED_MAJORA 0x61
|
||||||
|
#define EVENTINF_ENTR_CS_WATCHED_GOHT 0x62
|
||||||
|
#define EVENTINF_INTRO_CS_WATCHED_GOMESS 0x63
|
||||||
|
|
||||||
#define EVENTINF_57 0x57
|
|
||||||
#define EVENTINF_60 0x60
|
|
||||||
#define EVENTINF_61 0x61
|
|
||||||
#define EVENTINF_62 0x62
|
|
||||||
#define EVENTINF_63 0x63
|
|
||||||
#define EVENTINF_64 0x64
|
#define EVENTINF_64 0x64
|
||||||
#define EVENTINF_65 0x65
|
#define EVENTINF_65 0x65
|
||||||
#define EVENTINF_66 0x66
|
#define EVENTINF_66 0x66
|
||||||
|
|
|
@ -133,7 +133,7 @@ s32 SubS_CopyPointFromPathCheckBounds(Path* path, s32 pointIndex, Vec3f* dst);
|
||||||
s32 SubS_Offer(Actor* actor, struct PlayState* play, f32 xzRange, f32 yRange, s32 itemId, SubSOfferMode mode);
|
s32 SubS_Offer(Actor* actor, struct PlayState* play, f32 xzRange, f32 yRange, s32 itemId, SubSOfferMode mode);
|
||||||
|
|
||||||
void SubS_FillShadowTex(s32 startCol, s32 startRow, u8* tex, s32 size);
|
void SubS_FillShadowTex(s32 startCol, s32 startRow, u8* tex, s32 size);
|
||||||
void SubS_GenShadowTex(Vec3f bodyPartsPos[], Vec3f* worldPos, u8* tex, f32 tween, u8 bodyPartsNum, u8 sizes[], s8 parentBodyParts[]);
|
void SubS_GenShadowTex(Vec3f bodyPartsPos[], Vec3f* worldPos, u8* tex, f32 weight, u8 bodyPartsNum, u8 sizes[], s8 parentBodyParts[]);
|
||||||
void SubS_DrawShadowTex(Actor* actor, struct GameState* gameState, u8* tex);
|
void SubS_DrawShadowTex(Actor* actor, struct GameState* gameState, u8* tex);
|
||||||
|
|
||||||
s16 SubS_ComputeTrackPointRot(s16* rot, s16 rotMax, s16 target, f32 slowness, f32 stepMin, f32 stepMax);
|
s16 SubS_ComputeTrackPointRot(s16* rot, s16 rotMax, s16 target, f32 slowness, f32 stepMin, f32 stepMax);
|
||||||
|
|
3
spec
3
spec
|
@ -3519,8 +3519,7 @@ beginseg
|
||||||
name "ovl_Boss_Hakugin"
|
name "ovl_Boss_Hakugin"
|
||||||
compress
|
compress
|
||||||
include "build/src/overlays/actors/ovl_Boss_Hakugin/z_boss_hakugin.o"
|
include "build/src/overlays/actors/ovl_Boss_Hakugin/z_boss_hakugin.o"
|
||||||
include "build/data/ovl_Boss_Hakugin/ovl_Boss_Hakugin.data.o"
|
include "build/src/overlays/actors/ovl_Boss_Hakugin/ovl_Boss_Hakugin_reloc.o"
|
||||||
include "build/data/ovl_Boss_Hakugin/ovl_Boss_Hakugin.reloc.o"
|
|
||||||
endseg
|
endseg
|
||||||
|
|
||||||
beginseg
|
beginseg
|
||||||
|
|
|
@ -7218,15 +7218,15 @@ void Interface_Init(PlayState* play) {
|
||||||
(play->sceneId != SCENE_LAST_GORON) && (play->sceneId != SCENE_LAST_ZORA) &&
|
(play->sceneId != SCENE_LAST_GORON) && (play->sceneId != SCENE_LAST_ZORA) &&
|
||||||
(play->sceneId != SCENE_LAST_LINK)) {
|
(play->sceneId != SCENE_LAST_LINK)) {
|
||||||
|
|
||||||
CLEAR_EVENTINF(EVENTINF_53); // Goht intro cutscene watched
|
CLEAR_EVENTINF(EVENTINF_INTRO_CS_WATCHED_GOHT);
|
||||||
CLEAR_EVENTINF(EVENTINF_54); // Odolwa intro cutscene watched
|
CLEAR_EVENTINF(EVENTINF_INTRO_CS_WATCHED_ODOLWA);
|
||||||
CLEAR_EVENTINF(EVENTINF_55); // Twinmold intro cutscene watched
|
CLEAR_EVENTINF(EVENTINF_INTRO_CS_WATCHED_TWINMOLD);
|
||||||
CLEAR_EVENTINF(EVENTINF_56); // Gyorg intro cutscene watched
|
CLEAR_EVENTINF(EVENTINF_INTRO_CS_WATCHED_GYORG);
|
||||||
CLEAR_EVENTINF(EVENTINF_57); // Igos du Ikana intro cutscene watched
|
CLEAR_EVENTINF(EVENTINF_INTRO_CS_WATCHED_IGOS_DU_IKANA);
|
||||||
CLEAR_EVENTINF(EVENTINF_60); // Wart intro cutscene watched
|
CLEAR_EVENTINF(EVENTINF_INTRO_CS_WATCHED_WART);
|
||||||
CLEAR_EVENTINF(EVENTINF_61); // Majoras intro cutscene watched
|
CLEAR_EVENTINF(EVENTINF_INTRO_CS_WATCHED_MAJORA);
|
||||||
CLEAR_EVENTINF(EVENTINF_62); //
|
CLEAR_EVENTINF(EVENTINF_ENTR_CS_WATCHED_GOHT);
|
||||||
CLEAR_EVENTINF(EVENTINF_63); // Gomess intro cutscene watched
|
CLEAR_EVENTINF(EVENTINF_INTRO_CS_WATCHED_GOMESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
sFinalHoursClockDigitsRed = sFinalHoursClockFrameEnvRed = sFinalHoursClockFrameEnvGreen =
|
sFinalHoursClockDigitsRed = sFinalHoursClockFrameEnvRed = sFinalHoursClockFrameEnvGreen =
|
||||||
|
|
|
@ -967,7 +967,7 @@ void SubS_FillShadowTex(s32 startCol, s32 startRow, u8* tex, s32 size) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SubS_GenShadowTex(Vec3f bodyPartsPos[], Vec3f* worldPos, u8* tex, f32 tween, u8 bodyPartsNum, u8 sizes[],
|
void SubS_GenShadowTex(Vec3f bodyPartsPos[], Vec3f* worldPos, u8* tex, f32 weight, u8 bodyPartsNum, u8 sizes[],
|
||||||
s8 parentBodyParts[]) {
|
s8 parentBodyParts[]) {
|
||||||
Vec3f pos;
|
Vec3f pos;
|
||||||
Vec3f startVec;
|
Vec3f startVec;
|
||||||
|
@ -982,9 +982,9 @@ void SubS_GenShadowTex(Vec3f bodyPartsPos[], Vec3f* worldPos, u8* tex, f32 tween
|
||||||
parentBodyPart = parentBodyParts[i];
|
parentBodyPart = parentBodyParts[i];
|
||||||
bodyPartPos = &bodyPartsPos[i];
|
bodyPartPos = &bodyPartsPos[i];
|
||||||
|
|
||||||
pos.x = (bodyPartsPos[parentBodyPart].x - bodyPartPos->x) * tween + (bodyPartPos->x - worldPos->x);
|
pos.x = (bodyPartsPos[parentBodyPart].x - bodyPartPos->x) * weight + (bodyPartPos->x - worldPos->x);
|
||||||
pos.y = (bodyPartsPos[parentBodyPart].y - bodyPartPos->y) * tween + (bodyPartPos->y - worldPos->y);
|
pos.y = (bodyPartsPos[parentBodyPart].y - bodyPartPos->y) * weight + (bodyPartPos->y - worldPos->y);
|
||||||
pos.z = (bodyPartsPos[parentBodyPart].z - bodyPartPos->z) * tween + (bodyPartPos->z - worldPos->z);
|
pos.z = (bodyPartsPos[parentBodyPart].z - bodyPartPos->z) * weight + (bodyPartPos->z - worldPos->z);
|
||||||
} else {
|
} else {
|
||||||
bodyPartPos = &bodyPartsPos[i];
|
bodyPartPos = &bodyPartsPos[i];
|
||||||
|
|
||||||
|
|
|
@ -934,7 +934,7 @@ void Boss01_Init(Actor* thisx, PlayState* play) {
|
||||||
SkelAnime_InitFlex(play, &this->skelAnime, &gOdolwaSkel, &gOdolwaReadyAnim, this->jointTable, this->morphTable,
|
SkelAnime_InitFlex(play, &this->skelAnime, &gOdolwaSkel, &gOdolwaReadyAnim, this->jointTable, this->morphTable,
|
||||||
ODOLWA_LIMB_MAX);
|
ODOLWA_LIMB_MAX);
|
||||||
|
|
||||||
if ((KREG(64) != 0) || CHECK_EVENTINF(EVENTINF_54)) {
|
if ((KREG(64) != 0) || CHECK_EVENTINF(EVENTINF_INTRO_CS_WATCHED_ODOLWA)) {
|
||||||
Boss01_SetupWait(this, play, ODOLWA_WAIT_READY);
|
Boss01_SetupWait(this, play, ODOLWA_WAIT_READY);
|
||||||
this->actor.gravity = -2.5f;
|
this->actor.gravity = -2.5f;
|
||||||
sOdolwaMusicStartTimer = KREG(15) + 20;
|
sOdolwaMusicStartTimer = KREG(15) + 20;
|
||||||
|
@ -1138,7 +1138,7 @@ void Boss01_IntroCutscene(Boss01* this, PlayState* play) {
|
||||||
Cutscene_StopManual(play, &play->csCtx);
|
Cutscene_StopManual(play, &play->csCtx);
|
||||||
Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END);
|
Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END);
|
||||||
this->actor.flags |= ACTOR_FLAG_TARGETABLE;
|
this->actor.flags |= ACTOR_FLAG_TARGETABLE;
|
||||||
SET_EVENTINF(EVENTINF_54);
|
SET_EVENTINF(EVENTINF_INTRO_CS_WATCHED_ODOLWA);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -3017,6 +3017,7 @@ void Boss01_FillShadowTex(Boss01* this, u8* tex, f32 weight) {
|
||||||
Vec3f startVec;
|
Vec3f startVec;
|
||||||
|
|
||||||
for (i = 0; i < ODOLWA_BODYPART_MAX; i++) {
|
for (i = 0; i < ODOLWA_BODYPART_MAX; i++) {
|
||||||
|
// TODO: match with a continue
|
||||||
if ((weight == 0.0f) || (y = sParentShadowBodyParts[i]) > BODYPART_NONE) {
|
if ((weight == 0.0f) || (y = sParentShadowBodyParts[i]) > BODYPART_NONE) {
|
||||||
if (weight > 0.0f) {
|
if (weight > 0.0f) {
|
||||||
VEC3F_LERPIMPDST(&lerp, &this->bodyPartsPos[i], &this->bodyPartsPos[y], weight);
|
VEC3F_LERPIMPDST(&lerp, &this->bodyPartsPos[i], &this->bodyPartsPos[y], weight);
|
||||||
|
|
|
@ -602,7 +602,7 @@ void Boss02_Init(Actor* thisx, PlayState* play) {
|
||||||
this->actor.draw = Boss02_Static_Draw;
|
this->actor.draw = Boss02_Static_Draw;
|
||||||
this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
|
this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
|
||||||
this->playerScale = 0.01f;
|
this->playerScale = 0.01f;
|
||||||
if ((KREG(64) != 0) || CHECK_EVENTINF(EVENTINF_55) || (sBlueWarp != NULL)) {
|
if ((KREG(64) != 0) || CHECK_EVENTINF(EVENTINF_INTRO_CS_WATCHED_TWINMOLD) || (sBlueWarp != NULL)) {
|
||||||
this->unk_1D20 = 0;
|
this->unk_1D20 = 0;
|
||||||
sTwinmoldMusicStartTimer = KREG(15) + 20;
|
sTwinmoldMusicStartTimer = KREG(15) + 20;
|
||||||
} else {
|
} else {
|
||||||
|
@ -2230,7 +2230,7 @@ void func_809DEAC4(Boss02* this, PlayState* play) {
|
||||||
this->unk_1D20 = 0;
|
this->unk_1D20 = 0;
|
||||||
sRedTwinmold->unk_0144 = sBlueTwinmold->unk_0144 = 3;
|
sRedTwinmold->unk_0144 = sBlueTwinmold->unk_0144 = 3;
|
||||||
sRedTwinmold->unk_0146[0] = sBlueTwinmold->unk_0146[0] = 60;
|
sRedTwinmold->unk_0146[0] = sBlueTwinmold->unk_0146[0] = 60;
|
||||||
SET_EVENTINF(EVENTINF_55);
|
SET_EVENTINF(EVENTINF_INTRO_CS_WATCHED_TWINMOLD);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -517,8 +517,7 @@ void Boss03_Init(Actor* thisx, PlayState* play2) {
|
||||||
GYORG_LIMB_MAX);
|
GYORG_LIMB_MAX);
|
||||||
Actor_SetScale(&this->actor, 0.2f);
|
Actor_SetScale(&this->actor, 0.2f);
|
||||||
|
|
||||||
// CHECK_EVENTINF(EVENTINF_56): intro cutscene already watched
|
if ((KREG(64) != 0) || CHECK_EVENTINF(EVENTINF_INTRO_CS_WATCHED_GYORG)) {
|
||||||
if ((KREG(64) != 0) || CHECK_EVENTINF(EVENTINF_56)) {
|
|
||||||
this->actionFunc = func_809E344C;
|
this->actionFunc = func_809E344C;
|
||||||
D_809E9842 = false;
|
D_809E9842 = false;
|
||||||
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 1);
|
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 1);
|
||||||
|
@ -1377,7 +1376,7 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
|
||||||
func_809E344C(this, play);
|
func_809E344C(this, play);
|
||||||
this->workTimer[WORK_TIMER_UNK1_A] = 50;
|
this->workTimer[WORK_TIMER_UNK1_A] = 50;
|
||||||
|
|
||||||
SET_EVENTINF(EVENTINF_56);
|
SET_EVENTINF(EVENTINF_INTRO_CS_WATCHED_GYORG);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,7 +200,7 @@ void Boss04_Init(Actor* thisx, PlayState* play2) {
|
||||||
this->actor.world.pos.z = this->unk_6F0;
|
this->actor.world.pos.z = this->unk_6F0;
|
||||||
Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 60.0f, 60.0f, UPDBGCHECKINFO_FLAG_4);
|
Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 60.0f, 60.0f, UPDBGCHECKINFO_FLAG_4);
|
||||||
|
|
||||||
if ((KREG(64) != 0) || CHECK_EVENTINF(EVENTINF_60)) {
|
if ((KREG(64) != 0) || CHECK_EVENTINF(EVENTINF_INTRO_CS_WATCHED_WART)) {
|
||||||
func_809ECD00(this, play);
|
func_809ECD00(this, play);
|
||||||
this->actor.world.pos.y = this->actor.floorHeight + 160.0f;
|
this->actor.world.pos.y = this->actor.floorHeight + 160.0f;
|
||||||
phi_f24 = this->actor.floorHeight;
|
phi_f24 = this->actor.floorHeight;
|
||||||
|
@ -393,7 +393,7 @@ void func_809EC568(Boss04* this, PlayState* play) {
|
||||||
Cutscene_StopManual(play, &play->csCtx);
|
Cutscene_StopManual(play, &play->csCtx);
|
||||||
Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END);
|
Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END);
|
||||||
Play_DisableMotionBlur();
|
Play_DisableMotionBlur();
|
||||||
SET_EVENTINF(EVENTINF_60);
|
SET_EVENTINF(EVENTINF_INTRO_CS_WATCHED_WART);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,7 +136,7 @@ void Boss06_Init(Actor* thisx, PlayState* play) {
|
||||||
D_809F4970 = (EnKnight*)this->actor.parent;
|
D_809F4970 = (EnKnight*)this->actor.parent;
|
||||||
this->actor.colChkInfo.damageTable = &sDamageTable;
|
this->actor.colChkInfo.damageTable = &sDamageTable;
|
||||||
|
|
||||||
if ((KREG(64) != 0) || CHECK_EVENTINF(EVENTINF_57)) {
|
if ((KREG(64) != 0) || CHECK_EVENTINF(EVENTINF_INTRO_CS_WATCHED_IGOS_DU_IKANA)) {
|
||||||
this->actionFunc = func_809F2E14;
|
this->actionFunc = func_809F2E14;
|
||||||
} else {
|
} else {
|
||||||
this->actionFunc = func_809F2B64;
|
this->actionFunc = func_809F2B64;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -2,38 +2,177 @@
|
||||||
#define Z_BOSS_HAKUGIN_H
|
#define Z_BOSS_HAKUGIN_H
|
||||||
|
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
#include "objects/object_boss_hakugin/object_boss_hakugin.h"
|
||||||
|
#include "overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.h"
|
||||||
|
|
||||||
struct BossHakugin;
|
struct BossHakugin;
|
||||||
|
|
||||||
|
#define GOHT_SHADOW_TEX_WIDTH 64
|
||||||
|
#define GOHT_SHADOW_TEX_HEIGHT 64
|
||||||
|
#define GOHT_SHADOW_TEX_SIZE ((s32)sizeof(u8[GOHT_SHADOW_TEX_HEIGHT][GOHT_SHADOW_TEX_WIDTH]))
|
||||||
|
|
||||||
typedef void (*BossHakuginActionFunc)(struct BossHakugin*, PlayState*);
|
typedef void (*BossHakuginActionFunc)(struct BossHakugin*, PlayState*);
|
||||||
|
|
||||||
typedef struct BossHakuginEffect {
|
|
||||||
/* 0x00 */ Vec3f unk_0;
|
|
||||||
/* 0x0C */ Vec3f unk_C;
|
|
||||||
/* 0x18 */ s16 unk_18;
|
|
||||||
/* 0x1A */ s16 unk_1A;
|
|
||||||
/* 0x1C */ Vec3s unk_1C;
|
|
||||||
/* 0x24 */ f32 unk_24;
|
|
||||||
} BossHakuginEffect; // size = 0x28
|
|
||||||
|
|
||||||
#define BOSS_HAKUGIN_EFFECT_COUNT 180
|
typedef enum GohtRockEffectType {
|
||||||
|
/* 0 */ GOHT_ROCK_EFFECT_TYPE_BOULDER,
|
||||||
|
/* 1 */ GOHT_ROCK_EFFECT_TYPE_STALACTITE
|
||||||
|
} GohtRockEffectType;
|
||||||
|
|
||||||
typedef struct BossHakuginFhgFlashUnkStruct {
|
typedef struct GohtRockEffect {
|
||||||
/* 0x00 */ Vec3f unk_00;
|
/* 0x00 */ Vec3f pos;
|
||||||
/* 0x0C */ char unk_0C[0x8];
|
/* 0x0C */ Vec3f velocity;
|
||||||
} BossHakuginFhgFlashUnkStruct; // size = 0x14
|
/* 0x18 */ s16 timer;
|
||||||
|
/* 0x1A */ s16 type; // See GohtRockEffectType
|
||||||
|
/* 0x1C */ Vec3s rot;
|
||||||
|
/* 0x24 */ f32 scale;
|
||||||
|
} GohtRockEffect; // size = 0x28
|
||||||
|
|
||||||
|
typedef struct GohtCrushingRock {
|
||||||
|
/* 0x00 */ Vec3f pos;
|
||||||
|
/* 0x0C */ f32 targetPosY;
|
||||||
|
/* 0x10 */ f32 fallingSpeed;
|
||||||
|
/* 0x14 */ UNK_TYPE1 pad_14[0x8];
|
||||||
|
/* 0x1C */ Vec3s rot;
|
||||||
|
/* 0x24 */ f32 scale;
|
||||||
|
} GohtCrushingRock; // size = 0x28
|
||||||
|
|
||||||
|
#define GOHT_ROCK_EFFECT_COUNT 180
|
||||||
|
#define GOHT_CRUSHING_ROCK_COUNT 36
|
||||||
|
#define GOHT_ELECTRIC_BALL_COUNT_MAX 10
|
||||||
|
|
||||||
|
typedef struct GohtLightningSegment {
|
||||||
|
/* 0x00 */ Vec3f pos;
|
||||||
|
/* 0x0C */ s16 alpha;
|
||||||
|
/* 0x0E */ Vec3s rot;
|
||||||
|
/* 0x14 */ ColliderTris collider;
|
||||||
|
/* 0x34 */ ColliderTrisElement colliderElements[1];
|
||||||
|
} GohtLightningSegment; // size = 0x90
|
||||||
|
|
||||||
|
#define GOHT_LIGHTNING_SEGMENT_COUNT 20
|
||||||
|
|
||||||
|
typedef struct GohtMalfunctionEffect {
|
||||||
|
/* 0x00 */ Vec3f pos;
|
||||||
|
/* 0x0C */ f32 scaleXY;
|
||||||
|
/* 0x10 */ s16 alpha;
|
||||||
|
/* 0x12 */ s16 timer;
|
||||||
|
} GohtMalfunctionEffect; // size = 0x14
|
||||||
|
|
||||||
|
#define GOHT_MALFUNCTION_NUM_TYPES (FHGFLASH_SHOCK_GOHT_MAX - FHGFLASH_SHOCK_GOHT_BACK_LEFT_THIGH)
|
||||||
|
#define GOHT_MALFUNCTION_EFFECTS_PER_TYPE 15
|
||||||
|
|
||||||
|
typedef enum GohtBodyPart {
|
||||||
|
/* 0 */ GOHT_BODYPART_PELVIS,
|
||||||
|
/* 1 */ GOHT_BODYPART_THORAX,
|
||||||
|
/* 2 */ GOHT_BODYPART_HEAD,
|
||||||
|
/* 3 */ GOHT_BODYPART_FRONT_RIGHT_UPPER_LEG,
|
||||||
|
/* 4 */ GOHT_BODYPART_FRONT_RIGHT_LOWER_LEG,
|
||||||
|
/* 5 */ GOHT_BODYPART_FRONT_RIGHT_HOOF,
|
||||||
|
/* 6 */ GOHT_BODYPART_FRONT_LEFT_UPPER_LEG,
|
||||||
|
/* 7 */ GOHT_BODYPART_FRONT_LEFT_LOWER_LEG,
|
||||||
|
/* 8 */ GOHT_BODYPART_FRONT_LEFT_HOOF,
|
||||||
|
/* 9 */ GOHT_BODYPART_BACK_RIGHT_THIGH,
|
||||||
|
/* 10 */ GOHT_BODYPART_BACK_RIGHT_SHIN,
|
||||||
|
/* 11 */ GOHT_BODYPART_BACK_RIGHT_HOOF,
|
||||||
|
/* 12 */ GOHT_BODYPART_BACK_LEFT_THIGH,
|
||||||
|
/* 13 */ GOHT_BODYPART_BACK_LEFT_SHIN,
|
||||||
|
/* 14 */ GOHT_BODYPART_BACK_LEFT_HOOF,
|
||||||
|
/* 15 */ GOHT_BODYPART_MAX
|
||||||
|
} GohtBodyPart;
|
||||||
|
|
||||||
|
typedef enum GohtColliderBodyPart {
|
||||||
|
/* 0 */ GOHT_COLLIDER_BODYPART_HEAD,
|
||||||
|
/* 1 */ GOHT_COLLIDER_BODYPART_THORAX,
|
||||||
|
/* 2 */ GOHT_COLLIDER_BODYPART_PELVIS,
|
||||||
|
/* 3 */ GOHT_COLLIDER_BODYPART_FRONT_RIGHT_UPPER_LEG,
|
||||||
|
/* 4 */ GOHT_COLLIDER_BODYPART_FRONT_RIGHT_LOWER_LEG,
|
||||||
|
/* 5 */ GOHT_COLLIDER_BODYPART_FRONT_RIGHT_HOOF,
|
||||||
|
/* 6 */ GOHT_COLLIDER_BODYPART_FRONT_LEFT_UPPER_LEG,
|
||||||
|
/* 7 */ GOHT_COLLIDER_BODYPART_FRONT_LEFT_LOWER_LEG,
|
||||||
|
/* 8 */ GOHT_COLLIDER_BODYPART_FRONT_LEFT_HOOF,
|
||||||
|
/* 9 */ GOHT_COLLIDER_BODYPART_BACK_RIGHT_THIGH,
|
||||||
|
/* 10 */ GOHT_COLLIDER_BODYPART_BACK_RIGHT_SHIN,
|
||||||
|
/* 11 */ GOHT_COLLIDER_BODYPART_BACK_RIGHT_PASTERN,
|
||||||
|
/* 12 */ GOHT_COLLIDER_BODYPART_BACK_RIGHT_HOOF,
|
||||||
|
/* 13 */ GOHT_COLLIDER_BODYPART_BACK_LEFT_THIGH,
|
||||||
|
/* 14 */ GOHT_COLLIDER_BODYPART_BACK_LEFT_SHIN,
|
||||||
|
/* 15 */ GOHT_COLLIDER_BODYPART_BACK_LEFT_PASTERN,
|
||||||
|
/* 16 */ GOHT_COLLIDER_BODYPART_BACK_LEFT_HOOF,
|
||||||
|
/* 17 */ GOHT_COLLIDER_BODYPART_RIGHT_HORN,
|
||||||
|
/* 18 */ GOHT_COLLIDER_BODYPART_LEFT_HORN,
|
||||||
|
/* 19 */ GOHT_COLLIDER_BODYPART_MAX
|
||||||
|
} GohtColliderBodyPart;
|
||||||
|
|
||||||
typedef struct BossHakugin {
|
typedef struct BossHakugin {
|
||||||
/* 0x0000 */ Actor actor;
|
/* 0x0000 */ Actor actor;
|
||||||
/* 0x0144 */ char unk_0144[0x44];
|
/* 0x0144 */ SkelAnime skelAnime;
|
||||||
/* 0x0188 */ BossHakuginActionFunc actionFunc;
|
/* 0x0188 */ BossHakuginActionFunc actionFunc;
|
||||||
/* 0x018C */ char unk_018C[0x5];
|
/* 0x018C */ u8 lightningHitSomething;
|
||||||
/* 0x0191 */ u8 unk_191;
|
/* 0x018D */ u8 preventBoulderSpawnCount;
|
||||||
/* 0x018C */ char unk_0192[0x866];
|
/* 0x018E */ u8 preventStalactiteSpawnCount;
|
||||||
/* 0x09F8 */ BossHakuginEffect unk_9F8[BOSS_HAKUGIN_EFFECT_COUNT];
|
/* 0x018F */ u8 preventBombSpawnCount;
|
||||||
/* 0x2618 */ char unk_2618[0x8E8];
|
/* 0x0190 */ u8 blockMalfunctionEffects;
|
||||||
/* 0x2F00 */ BossHakuginFhgFlashUnkStruct unk_2F00[7][15];
|
/* 0x0191 */ u8 malfunctionEffectIndex;
|
||||||
/* 0x3734 */ char unk_3734[0xDC];
|
/* 0x0192 */ u8 electricBallState; // See `GohtElectricBallState`
|
||||||
|
/* 0x0193 */ u8 iceAlpha;
|
||||||
|
/* 0x0194 */ u8 hasAppliedGoronSpikeBoost;
|
||||||
|
/* 0x0195 */ u8 finishedFallingDown;
|
||||||
|
/* 0x0196 */ u8 drawDmgEffType;
|
||||||
|
/* 0x0198 */ s16 lightOrbRotZ;
|
||||||
|
/* 0x019A */ s16 damagedSpeedUpCounter;
|
||||||
|
/* 0x019C */ union {
|
||||||
|
s16 nextCutsceneType;
|
||||||
|
s16 timer;
|
||||||
|
};
|
||||||
|
/* 0x019E */ s16 targetRotY;
|
||||||
|
/* 0x01A0 */ s16 baseRotY;
|
||||||
|
/* 0x01A2 */ s16 runOffsetRot;
|
||||||
|
/* 0x01A4 */ s16 disableBodyCollidersTimer;
|
||||||
|
/* 0x01A6 */ s16 frontHalfRotZ;
|
||||||
|
/* 0x01A8 */ s16 chargeUpTimer;
|
||||||
|
/* 0x01AA */ s16 electricBallCount;
|
||||||
|
/* 0x01AC */ s16 subCamId;
|
||||||
|
/* 0x01AE */ s16 deathCutsceneRandomHeadRot;
|
||||||
|
/* 0x01B0 */ u32 limbDrawFlags;
|
||||||
|
/* 0x01B4 */ s32 direction; // See `GohtDirection`
|
||||||
|
/* 0x01B8 */ f32 electricBallSpeed;
|
||||||
|
/* 0x01BC */ f32 distToRightWall;
|
||||||
|
/* 0x01C0 */ f32 distToLeftWall;
|
||||||
|
/* 0x01C4 */ f32 targetSpeed;
|
||||||
|
/* 0x01C8 */ f32 chargingLightOrbScale;
|
||||||
|
/* 0x01CC */ f32 chargingLightningTranslateZ;
|
||||||
|
/* 0x01D0 */ f32 chargingLightningScale;
|
||||||
|
/* 0x01D4 */ f32 iceScaleY;
|
||||||
|
/* 0x01D8 */ UNK_TYPE1 unk_01D8[0x4]; // probably unused float
|
||||||
|
/* 0x01DC */ f32 drawDmgEffScale;
|
||||||
|
/* 0x01E0 */ f32 drawDmgEffFrozenSteamScale;
|
||||||
|
/* 0x01E4 */ f32 drawDmgEffAlpha;
|
||||||
|
/* 0x01E8 */ Vec3s jointTable[GOHT_LIMB_MAX];
|
||||||
|
/* 0x02AE */ Vec3s morphTable[GOHT_LIMB_MAX];
|
||||||
|
/* 0x0374 */ Vec3s headRot;
|
||||||
|
/* 0x037A */ Vec3s subCamRot;
|
||||||
|
/* 0x0380 */ Vec3f chargingLightningPos;
|
||||||
|
/* 0x038C */ Vec3f subCamEye;
|
||||||
|
/* 0x0398 */ Vec3f bodyPartsPos[GOHT_BODYPART_MAX];
|
||||||
|
/* 0x044C */ Vec3f transformedPlayerPos;
|
||||||
|
/* 0x0458 */ Vec3f sfxPos;
|
||||||
|
/* 0x0464 */ Vec3f electricBallSfxPos;
|
||||||
|
/* 0x0470 */ LightNode* lightNode;
|
||||||
|
/* 0x0474 */ LightInfo lightInfo;
|
||||||
|
/* 0x0484 */ ColliderJntSph bodyCollider;
|
||||||
|
/* 0x04A4 */ ColliderJntSphElement bodyColliderElements[GOHT_COLLIDER_BODYPART_MAX];
|
||||||
|
/* 0x0964 */ ColliderCylinder iceCollider;
|
||||||
|
/* 0x09B0 */ Actor* boulders[8];
|
||||||
|
/* 0x09D0 */ Actor* stalactites[10];
|
||||||
|
/* 0x09F8 */ union {
|
||||||
|
GohtRockEffect rockEffects[GOHT_ROCK_EFFECT_COUNT];
|
||||||
|
GohtCrushingRock crushingRocks[GOHT_CRUSHING_ROCK_COUNT];
|
||||||
|
};
|
||||||
|
/* 0x2618 */ GohtLightningSegment lightningSegments[GOHT_LIGHTNING_SEGMENT_COUNT]; // A chain of lightning used as an attack
|
||||||
|
/* 0x3158 */ GohtMalfunctionEffect malfunctionEffects[GOHT_MALFUNCTION_NUM_TYPES][GOHT_MALFUNCTION_EFFECTS_PER_TYPE]; // Black smoke and electric zaps on body parts as damage accumulates
|
||||||
|
/* 0x3734 */ Vec3f electricBallPos[GOHT_ELECTRIC_BALL_COUNT_MAX];
|
||||||
|
/* 0x37AC */ Vec3f electricBallRot;
|
||||||
|
/* 0x37B8 */ ColliderSphere electricBallCollider;
|
||||||
} BossHakugin; // size = 0x3810
|
} BossHakugin; // size = 0x3810
|
||||||
|
|
||||||
#endif // Z_BOSS_HAKUGIN_H
|
#endif // Z_BOSS_HAKUGIN_H
|
||||||
|
|
|
@ -1,7 +1,26 @@
|
||||||
/*
|
/*
|
||||||
* File: z_en_hakurock.c
|
* File: z_en_hakurock.c
|
||||||
* Overlay: En_Hakurock
|
* Overlay: En_Hakurock
|
||||||
* Description: Goht Debris
|
* Description: Interactive rocks in Goht's fight
|
||||||
|
*
|
||||||
|
* This actor is responsible for most of the various rocks that the player and/or Goht can interact with. It can be
|
||||||
|
* divided into three main subtypes:
|
||||||
|
* - Boulder: These are the large rocks that Goht can kick up while it's running. These boulders fly through the air and
|
||||||
|
* damage the player when they collide with them.
|
||||||
|
* - Stalactite: These are the stalactites that fall from the ceiling during the Goht fight. As it falls through the
|
||||||
|
* air, it can be destroyed if it touches Goht. Once it lands and gets stuck in the ground, it can stop the player's
|
||||||
|
* Goron Roll if they run into it, and it can be destroyed by Goht or other falling stalactites.
|
||||||
|
* - LargeStalactite: These are the stalactites that keep the player confined to a small part of the boss room when they
|
||||||
|
* first enter it. Goht destroys these stalactites as part of its intro cutscene after it's been thawed, allowing the
|
||||||
|
* player to access the rest of the room.
|
||||||
|
*
|
||||||
|
* This actor heavily assumes that it will only be spawned by Goht's (BossHakugin) actor, so it won't act correctly if
|
||||||
|
* spawned directly within the scene or by any other actor. When this actor is visibly destroyed, it's not actually
|
||||||
|
* killed; its params are set to a specific value, and it's placed into a waiting state until BossHakugin updates its
|
||||||
|
* params again to reuse the instance. Additionally, the rock effects that appear when this actor is destroyed are
|
||||||
|
* spawned by directly writing values to the parent actor's instance without ever checking its ID or if this actor even
|
||||||
|
* has a parent; it just assumes its parent is a BossHakugin instance and tries to update its rock effects array
|
||||||
|
* accordingly.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "z_en_hakurock.h"
|
#include "z_en_hakurock.h"
|
||||||
|
@ -17,20 +36,27 @@ void EnHakurock_Init(Actor* thisx, PlayState* play);
|
||||||
void EnHakurock_Destroy(Actor* thisx, PlayState* play);
|
void EnHakurock_Destroy(Actor* thisx, PlayState* play);
|
||||||
void EnHakurock_Update(Actor* thisx, PlayState* play);
|
void EnHakurock_Update(Actor* thisx, PlayState* play);
|
||||||
|
|
||||||
void func_80B21BE0(BossHakugin* parent, Vec3f* arg1, s32 arg2);
|
void EnHakurock_AddRockEffect(BossHakugin* parent, Vec3f* pos, s32 type);
|
||||||
void func_80B21EA4(EnHakurock* this, s32 arg1);
|
void EnHakurock_SpawnEffect(EnHakurock* this, s32 type);
|
||||||
void func_80B21FFC(EnHakurock* this);
|
void EnHakurock_SetupWaitForSignal(EnHakurock* this);
|
||||||
void func_80B22040(EnHakurock* this, PlayState* play);
|
void EnHakurock_WaitForSignal(EnHakurock* this, PlayState* play);
|
||||||
void func_80B220A8(EnHakurock* this);
|
void EnHakurock_Boulder_SetupMove(EnHakurock* this);
|
||||||
void func_80B221E8(EnHakurock* this, PlayState* play);
|
void EnHakurock_Boulder_Move(EnHakurock* this, PlayState* play);
|
||||||
void func_80B222AC(EnHakurock* this, PlayState* play);
|
void EnHakurock_Stalactite_SetupFall(EnHakurock* this, PlayState* play);
|
||||||
void func_80B2242C(EnHakurock* this, PlayState* play);
|
void EnHakurock_Stalactite_Fall(EnHakurock* this, PlayState* play);
|
||||||
void func_80B224C0(EnHakurock* this);
|
void EnHakurock_Stalactite_SetupStuckInGround(EnHakurock* this);
|
||||||
void func_80B22500(EnHakurock* this, PlayState* play);
|
void EnHakurock_Stalactite_StuckInGround(EnHakurock* this, PlayState* play);
|
||||||
void func_80B226AC(EnHakurock* this);
|
void EnHakurock_LargeStalactite_SetupWait(EnHakurock* this);
|
||||||
void func_80B22750(EnHakurock* this, PlayState* play);
|
void EnHakurock_LargeStalactite_Wait(EnHakurock* this, PlayState* play);
|
||||||
void func_80B228F4(Actor* thisx, PlayState* play);
|
void EnHakurock_DrawBoulder(Actor* thisx, PlayState* play);
|
||||||
void EnHakurock_Draw(Actor* thisx, PlayState* play);
|
void EnHakurock_DrawStalactite(Actor* thisx, PlayState* play);
|
||||||
|
|
||||||
|
typedef enum EnHakurockEffectType {
|
||||||
|
/* 0 */ EN_HAKUROCK_EFFECT_TYPE_BOULDER_DESTROYED,
|
||||||
|
/* 1 */ EN_HAKUROCK_EFFECT_TYPE_FALLING_STALACTITE_DESTROYED,
|
||||||
|
/* 2 */ EN_HAKUROCK_EFFECT_TYPE_STALACTITE_STUCK,
|
||||||
|
/* 3 */ EN_HAKUROCK_EFFECT_TYPE_STALACTITE_DESTROYED
|
||||||
|
} EnHakurockEffectType;
|
||||||
|
|
||||||
ActorInit En_Hakurock_InitVars = {
|
ActorInit En_Hakurock_InitVars = {
|
||||||
/**/ ACTOR_EN_HAKUROCK,
|
/**/ ACTOR_EN_HAKUROCK,
|
||||||
|
@ -66,22 +92,22 @@ static ColliderCylinderInit sCylinderInit = {
|
||||||
|
|
||||||
static CollisionCheckInfoInit sColChkInfoInit = { 0, 60, 60, MASS_IMMOVABLE };
|
static CollisionCheckInfoInit sColChkInfoInit = { 0, 60, 60, MASS_IMMOVABLE };
|
||||||
|
|
||||||
// Stalactite
|
|
||||||
|
|
||||||
void EnHakurock_Init(Actor* thisx, PlayState* play) {
|
void EnHakurock_Init(Actor* thisx, PlayState* play) {
|
||||||
EnHakurock* this = THIS;
|
EnHakurock* this = THIS;
|
||||||
|
|
||||||
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 52.0f);
|
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 52.0f);
|
||||||
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
|
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
|
||||||
CollisionCheck_SetInfo(&this->actor.colChkInfo, NULL, &sColChkInfoInit);
|
CollisionCheck_SetInfo(&this->actor.colChkInfo, NULL, &sColChkInfoInit);
|
||||||
if (this->actor.params == EN_HAKUROCK_TYPE_BOULDER) {
|
|
||||||
|
if (EN_HAKUROCK_GET_TYPE(&this->actor) == EN_HAKUROCK_TYPE_BOULDER) {
|
||||||
this->actor.gravity = -1.5f;
|
this->actor.gravity = -1.5f;
|
||||||
} else {
|
} else {
|
||||||
this->collider.base.ocFlags1 &= ~OC1_NO_PUSH;
|
this->collider.base.ocFlags1 &= ~OC1_NO_PUSH;
|
||||||
this->actor.terminalVelocity = -100.0f;
|
this->actor.terminalVelocity = -100.0f;
|
||||||
this->actor.gravity = -7.0f;
|
this->actor.gravity = -7.0f;
|
||||||
}
|
}
|
||||||
func_80B21FFC(this);
|
|
||||||
|
EnHakurock_SetupWaitForSignal(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnHakurock_Destroy(Actor* thisx, PlayState* play) {
|
void EnHakurock_Destroy(Actor* thisx, PlayState* play) {
|
||||||
|
@ -90,102 +116,121 @@ void EnHakurock_Destroy(Actor* thisx, PlayState* play) {
|
||||||
Collider_DestroyCylinder(play, &this->collider);
|
Collider_DestroyCylinder(play, &this->collider);
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_80B21BE0(BossHakugin* parent, Vec3f* arg1, s32 arg2) {
|
/**
|
||||||
|
* Adds a single effect of the given type to the BossHakugin's rock effect array. This is more of an "internal" function
|
||||||
|
* only intended to be called by EnHakurock_SpawnEffect, which calls this function numerous times (and, sometimes, with
|
||||||
|
* a variety of different positions) to create a more complex-looking effect.
|
||||||
|
*/
|
||||||
|
void EnHakurock_AddRockEffect(BossHakugin* parent, Vec3f* pos, s32 type) {
|
||||||
s32 i;
|
s32 i;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_COUNT(parent->unk_9F8); i++) {
|
for (i = 0; i < GOHT_ROCK_EFFECT_COUNT; i++) {
|
||||||
BossHakuginEffect* gohtEffect = &parent->unk_9F8[i];
|
GohtRockEffect* rockEffect = &parent->rockEffects[i];
|
||||||
if (gohtEffect->unk_18 < 0) {
|
|
||||||
s16 sp2E;
|
|
||||||
s16 sp2C;
|
|
||||||
f32 sp28;
|
|
||||||
|
|
||||||
Math_Vec3f_Copy(&gohtEffect->unk_0, arg1);
|
if (rockEffect->timer < 0) {
|
||||||
sp2C = Rand_S16Offset(0x1000, 0x3000);
|
VecGeo velocityGeo;
|
||||||
sp2E = Rand_Next() >> 0x10;
|
|
||||||
sp28 = Rand_ZeroFloat(5.0f) + 10.0f;
|
Math_Vec3f_Copy(&rockEffect->pos, pos);
|
||||||
gohtEffect->unk_C.x = (sp28 * Math_CosS(sp2C)) * Math_SinS(sp2E);
|
|
||||||
gohtEffect->unk_C.y = (Math_SinS(sp2C) * sp28);
|
velocityGeo.pitch = Rand_S16Offset(0x1000, 0x3000);
|
||||||
gohtEffect->unk_C.z = (sp28 * Math_CosS(sp2C)) * Math_CosS(sp2E);
|
velocityGeo.yaw = Rand_Next() >> 0x10;
|
||||||
if ((arg2 == 1) || (arg2 == 3)) {
|
velocityGeo.r = Rand_ZeroFloat(5.0f) + 10.0f;
|
||||||
gohtEffect->unk_24 = ((Rand_ZeroFloat(5.0f) + 25.0f) * 0.0012f);
|
rockEffect->velocity.x = velocityGeo.r * Math_CosS(velocityGeo.pitch) * Math_SinS(velocityGeo.yaw);
|
||||||
gohtEffect->unk_0.x = ((Rand_ZeroFloat(2.0f) + 9.0f) * gohtEffect->unk_C.x) + arg1->x;
|
rockEffect->velocity.y = velocityGeo.r * Math_SinS(velocityGeo.pitch);
|
||||||
gohtEffect->unk_0.y = ((Rand_ZeroFloat(2.0f) + 3.0f) * gohtEffect->unk_C.y) + arg1->y;
|
rockEffect->velocity.z = velocityGeo.r * Math_CosS(velocityGeo.pitch) * Math_CosS(velocityGeo.yaw);
|
||||||
gohtEffect->unk_0.z = ((Rand_ZeroFloat(2.0f) + 9.0f) * gohtEffect->unk_C.z) + arg1->z;
|
|
||||||
gohtEffect->unk_1A = 1;
|
if ((type == EN_HAKUROCK_EFFECT_TYPE_FALLING_STALACTITE_DESTROYED) ||
|
||||||
|
(type == EN_HAKUROCK_EFFECT_TYPE_STALACTITE_DESTROYED)) {
|
||||||
|
rockEffect->scale = ((Rand_ZeroFloat(5.0f) + 25.0f) * 0.0012f);
|
||||||
|
rockEffect->pos.x = pos->x + ((Rand_ZeroFloat(2.0f) + 9.0f) * rockEffect->velocity.x);
|
||||||
|
rockEffect->pos.y = pos->y + ((Rand_ZeroFloat(2.0f) + 3.0f) * rockEffect->velocity.y);
|
||||||
|
rockEffect->pos.z = pos->z + ((Rand_ZeroFloat(2.0f) + 9.0f) * rockEffect->velocity.z);
|
||||||
|
rockEffect->type = GOHT_ROCK_EFFECT_TYPE_STALACTITE;
|
||||||
} else {
|
} else {
|
||||||
gohtEffect->unk_24 = ((Rand_ZeroFloat(5.0f) + 18.0f) * 0.0001f);
|
rockEffect->scale = ((Rand_ZeroFloat(5.0f) + 18.0f) * 0.0001f);
|
||||||
gohtEffect->unk_0.x = ((Rand_ZeroFloat(2.0f) + 3.0f) * gohtEffect->unk_C.x) + arg1->x;
|
rockEffect->pos.x = pos->x + ((Rand_ZeroFloat(2.0f) + 3.0f) * rockEffect->velocity.x);
|
||||||
gohtEffect->unk_0.y = ((Rand_ZeroFloat(3.0f) + 1.0f) * gohtEffect->unk_C.y) + arg1->y;
|
rockEffect->pos.y = pos->y + ((Rand_ZeroFloat(3.0f) + 1.0f) * rockEffect->velocity.y);
|
||||||
gohtEffect->unk_0.z = ((Rand_ZeroFloat(2.0f) + 3.0f) * gohtEffect->unk_C.z) + arg1->z;
|
rockEffect->pos.z = pos->z + ((Rand_ZeroFloat(2.0f) + 3.0f) * rockEffect->velocity.z);
|
||||||
gohtEffect->unk_1A = 0;
|
rockEffect->type = GOHT_ROCK_EFFECT_TYPE_BOULDER;
|
||||||
}
|
}
|
||||||
gohtEffect->unk_1C.x = (s32)Rand_Next() >> 0x10;
|
|
||||||
gohtEffect->unk_1C.y = (s32)Rand_Next() >> 0x10;
|
rockEffect->rot.x = (s32)Rand_Next() >> 0x10;
|
||||||
gohtEffect->unk_1C.z = (s32)Rand_Next() >> 0x10;
|
rockEffect->rot.y = (s32)Rand_Next() >> 0x10;
|
||||||
gohtEffect->unk_18 = 0x28;
|
rockEffect->rot.z = (s32)Rand_Next() >> 0x10;
|
||||||
|
rockEffect->timer = 40;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_80B21EA4(EnHakurock* this, s32 arg1) {
|
/**
|
||||||
Vec3f sp4C;
|
* This function spawns various effects depending on what type is supplied. It assumes that the parent is a BossHakugin
|
||||||
|
* instance and calls EnHakurock_AddRockEffect multiple times to create effects with numerous rocks.
|
||||||
|
*/
|
||||||
|
void EnHakurock_SpawnEffect(EnHakurock* this, s32 type) {
|
||||||
|
Vec3f pos;
|
||||||
s32 i;
|
s32 i;
|
||||||
f32 scaleFactor;
|
s32 j;
|
||||||
s32 tmp;
|
f32 offset;
|
||||||
s32 phi_s5;
|
s32 count;
|
||||||
|
|
||||||
if (arg1 == 0) {
|
if (type == EN_HAKUROCK_EFFECT_TYPE_BOULDER_DESTROYED) {
|
||||||
for (i = 0; i < 20; i++) {
|
for (i = 0; i < 20; i++) {
|
||||||
func_80B21BE0((BossHakugin*)this->actor.parent, &this->actor.world.pos, arg1);
|
EnHakurock_AddRockEffect((BossHakugin*)this->actor.parent, &this->actor.world.pos, type);
|
||||||
}
|
}
|
||||||
} else if (arg1 == 2) {
|
} else if (type == EN_HAKUROCK_EFFECT_TYPE_STALACTITE_STUCK) {
|
||||||
for (i = 0; i < 10; i++) {
|
for (i = 0; i < 10; i++) {
|
||||||
func_80B21BE0((BossHakugin*)this->actor.parent, &this->actor.world.pos, arg1);
|
EnHakurock_AddRockEffect((BossHakugin*)this->actor.parent, &this->actor.world.pos, type);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Math_Vec3f_Copy(&sp4C, &this->actor.world.pos);
|
Math_Vec3f_Copy(&pos, &this->actor.world.pos);
|
||||||
scaleFactor = this->actor.scale.x * 600.0f;
|
offset = this->actor.scale.x * 600.0f;
|
||||||
if (arg1 == 1) {
|
if (type == EN_HAKUROCK_EFFECT_TYPE_FALLING_STALACTITE_DESTROYED) {
|
||||||
sp4C.y -= scaleFactor;
|
pos.y -= offset;
|
||||||
i = 0;
|
i = 0;
|
||||||
} else {
|
} else {
|
||||||
i = 1;
|
i = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; i < 3; i++) {
|
for (; i < 3; i++) {
|
||||||
tmp = (i * 5) + 5;
|
count = (i * 5) + 5;
|
||||||
for (phi_s5 = 0; phi_s5 < tmp; phi_s5++) {
|
for (j = 0; j < count; j++) {
|
||||||
func_80B21BE0((BossHakugin*)this->actor.parent, &sp4C, arg1);
|
EnHakurock_AddRockEffect((BossHakugin*)this->actor.parent, &pos, type);
|
||||||
}
|
}
|
||||||
sp4C.y += scaleFactor;
|
|
||||||
|
pos.y += offset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_80B21FFC(EnHakurock* this) {
|
void EnHakurock_SetupWaitForSignal(EnHakurock* this) {
|
||||||
this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
|
this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
|
||||||
this->collider.base.atFlags &= ~AT_HIT;
|
this->collider.base.atFlags &= ~AT_HIT;
|
||||||
this->collider.base.ocFlags1 &= ~OC1_HIT;
|
this->collider.base.ocFlags1 &= ~OC1_HIT;
|
||||||
this->actor.draw = NULL;
|
this->actor.draw = NULL;
|
||||||
this->actor.params = EN_HAKUROCK_TYPE_UNK_0;
|
this->actor.params = EN_HAKUROCK_TYPE_NONE;
|
||||||
this->actionFunc = func_80B22040;
|
this->actionFunc = EnHakurock_WaitForSignal;
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_80B22040(EnHakurock* this, PlayState* play) {
|
/**
|
||||||
if (this->actor.params == EN_HAKUROCK_TYPE_BOULDER) {
|
* Waits and does nothing until its params are changed, after which it will setup the appropriate action function for
|
||||||
func_80B220A8(this);
|
* its new type. When an instance of this actor is visibly destroyed, it is put into this state to wait for BossHakugin
|
||||||
} else if (this->actor.params == EN_HAKUROCK_TYPE_UNK_2) {
|
* to signal that its instance should be reused. If an instance of this actor is spawned by anything other than Goht, it
|
||||||
func_80B222AC(this, play);
|
* will end up stuck in this state forever once it's destroyed.
|
||||||
} else if (this->actor.params == EN_HAKUROCK_TYPE_FENCE_PILLAR) {
|
*/
|
||||||
func_80B226AC(this);
|
void EnHakurock_WaitForSignal(EnHakurock* this, PlayState* play) {
|
||||||
|
if (EN_HAKUROCK_GET_TYPE(&this->actor) == EN_HAKUROCK_TYPE_BOULDER) {
|
||||||
|
EnHakurock_Boulder_SetupMove(this);
|
||||||
|
} else if (EN_HAKUROCK_GET_TYPE(&this->actor) == EN_HAKUROCK_TYPE_FALLING_STALACTITE) {
|
||||||
|
EnHakurock_Stalactite_SetupFall(this, play);
|
||||||
|
} else if (EN_HAKUROCK_GET_TYPE(&this->actor) == EN_HAKUROCK_TYPE_LARGE_STALACTITE) {
|
||||||
|
EnHakurock_LargeStalactite_SetupWait(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_80B220A8(EnHakurock* this) {
|
void EnHakurock_Boulder_SetupMove(EnHakurock* this) {
|
||||||
this->actor.params = EN_HAKUROCK_TYPE_BOULDER;
|
this->actor.params = EN_HAKUROCK_TYPE_BOULDER;
|
||||||
this->actor.draw = func_80B228F4;
|
this->actor.draw = EnHakurock_DrawBoulder;
|
||||||
this->actor.speed = Rand_ZeroFloat(3.5f) + 2.5f;
|
this->actor.speed = Rand_ZeroFloat(3.5f) + 2.5f;
|
||||||
this->actor.velocity.y = Rand_ZeroFloat(4.5f) + 18.0f;
|
this->actor.velocity.y = Rand_ZeroFloat(4.5f) + 18.0f;
|
||||||
Actor_SetScale(&this->actor, (Rand_ZeroFloat(5.0f) + 15.0f) * 0.001f);
|
Actor_SetScale(&this->actor, (Rand_ZeroFloat(5.0f) + 15.0f) * 0.001f);
|
||||||
|
@ -196,32 +241,36 @@ void func_80B220A8(EnHakurock* this) {
|
||||||
this->collider.dim.radius = (this->actor.scale.x * 2500.0f);
|
this->collider.dim.radius = (this->actor.scale.x * 2500.0f);
|
||||||
this->collider.dim.yShift = -this->collider.dim.radius;
|
this->collider.dim.yShift = -this->collider.dim.radius;
|
||||||
this->collider.dim.height = this->collider.dim.radius * 2;
|
this->collider.dim.height = this->collider.dim.radius * 2;
|
||||||
this->counter = 10;
|
this->timer = 10;
|
||||||
Math_Vec3f_Copy(&this->actor.prevPos, &this->actor.world.pos);
|
Math_Vec3f_Copy(&this->actor.prevPos, &this->actor.world.pos);
|
||||||
this->actionFunc = func_80B221E8;
|
this->actionFunc = EnHakurock_Boulder_Move;
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_80B221E8(EnHakurock* this, PlayState* play) {
|
/**
|
||||||
if (this->counter > 0) {
|
* Flies through the air while spinning until it hits something, then it breaks apart into a bunch of small rocks.
|
||||||
this->counter--;
|
*/
|
||||||
|
void EnHakurock_Boulder_Move(EnHakurock* this, PlayState* play) {
|
||||||
|
if (this->timer > 0) {
|
||||||
|
this->timer--;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->actor.shape.rot.x += 0x700;
|
this->actor.shape.rot.x += 0x700;
|
||||||
this->actor.shape.rot.y += 0x900;
|
this->actor.shape.rot.y += 0x900;
|
||||||
this->actor.shape.rot.z += 0xB00;
|
this->actor.shape.rot.z += 0xB00;
|
||||||
|
|
||||||
if ((this->collider.base.atFlags & AT_HIT) || ((this->counter == 0) && (this->collider.base.ocFlags1 & OC1_HIT)) ||
|
if ((this->collider.base.atFlags & AT_HIT) || ((this->timer == 0) && (this->collider.base.ocFlags1 & OC1_HIT)) ||
|
||||||
((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.velocity.y < 0.0f))) {
|
((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.velocity.y < 0.0f))) {
|
||||||
Actor_PlaySfx(&this->actor, NA_SE_EV_ROCK_BROKEN);
|
Actor_PlaySfx(&this->actor, NA_SE_EV_ROCK_BROKEN);
|
||||||
func_80B21EA4(this, 0);
|
EnHakurock_SpawnEffect(this, EN_HAKUROCK_EFFECT_TYPE_BOULDER_DESTROYED);
|
||||||
func_80B21FFC(this);
|
EnHakurock_SetupWaitForSignal(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_80B222AC(EnHakurock* this, PlayState* play) {
|
void EnHakurock_Stalactite_SetupFall(EnHakurock* this, PlayState* play) {
|
||||||
Player* player = GET_PLAYER(play);
|
Player* player = GET_PLAYER(play);
|
||||||
s16 angle;
|
s16 angle;
|
||||||
|
|
||||||
this->actor.draw = EnHakurock_Draw;
|
this->actor.draw = EnHakurock_DrawStalactite;
|
||||||
angle = ((s32)Rand_Next() >> 0x13) + player->actor.shape.rot.y;
|
angle = ((s32)Rand_Next() >> 0x13) + player->actor.shape.rot.y;
|
||||||
this->actor.shape.rot.y = (s32)Rand_Next() >> 0x10;
|
this->actor.shape.rot.y = (s32)Rand_Next() >> 0x10;
|
||||||
this->actor.world.pos.x = (Math_SinS(angle) * 600.0f) + player->actor.world.pos.x;
|
this->actor.world.pos.x = (Math_SinS(angle) * 600.0f) + player->actor.world.pos.x;
|
||||||
|
@ -236,46 +285,58 @@ void func_80B222AC(EnHakurock* this, PlayState* play) {
|
||||||
this->collider.dim.yShift = (this->actor.scale.y * -750.0f);
|
this->collider.dim.yShift = (this->actor.scale.y * -750.0f);
|
||||||
this->collider.dim.height = this->collider.dim.yShift * -2;
|
this->collider.dim.height = this->collider.dim.yShift * -2;
|
||||||
Math_Vec3f_Copy(&this->actor.prevPos, &this->actor.world.pos);
|
Math_Vec3f_Copy(&this->actor.prevPos, &this->actor.world.pos);
|
||||||
this->actor.params = EN_HAKUROCK_TYPE_UNK_2;
|
this->actor.params = EN_HAKUROCK_TYPE_FALLING_STALACTITE;
|
||||||
this->actionFunc = func_80B2242C;
|
this->actionFunc = EnHakurock_Stalactite_Fall;
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_80B2242C(EnHakurock* this, PlayState* play) {
|
/**
|
||||||
|
* Falls straight down until it hits either Goht or the ground. If it hits Goht, it will break apart into a bunch of
|
||||||
|
* stalactite-shaped fragments. If it hits the ground, it will kick up some rocks and start transitioning to being stuck
|
||||||
|
* in the ground.
|
||||||
|
*/
|
||||||
|
void EnHakurock_Stalactite_Fall(EnHakurock* this, PlayState* play) {
|
||||||
if ((this->collider.base.ocFlags1 & OC1_HIT) && (this->collider.base.oc == this->actor.parent)) {
|
if ((this->collider.base.ocFlags1 & OC1_HIT) && (this->collider.base.oc == this->actor.parent)) {
|
||||||
func_80B21EA4(this, 1);
|
EnHakurock_SpawnEffect(this, EN_HAKUROCK_EFFECT_TYPE_FALLING_STALACTITE_DESTROYED);
|
||||||
func_80B21FFC(this);
|
EnHakurock_SetupWaitForSignal(this);
|
||||||
} else if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
|
} else if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
|
||||||
func_80B21EA4(this, 2);
|
EnHakurock_SpawnEffect(this, EN_HAKUROCK_EFFECT_TYPE_STALACTITE_STUCK);
|
||||||
Actor_PlaySfx(&this->actor, NA_SE_EV_OBJECT_STICK);
|
Actor_PlaySfx(&this->actor, NA_SE_EV_OBJECT_STICK);
|
||||||
func_80B224C0(this);
|
EnHakurock_Stalactite_SetupStuckInGround(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_80B224C0(EnHakurock* this) {
|
void EnHakurock_Stalactite_SetupStuckInGround(EnHakurock* this) {
|
||||||
this->actor.params = EN_HAKUROCK_TYPE_STALACTITE;
|
this->actor.params = EN_HAKUROCK_TYPE_STUCK_STALACTITE;
|
||||||
this->counter = 10;
|
this->timer = 10;
|
||||||
this->actor.shape.shadowScale = 0.0f;
|
this->actor.shape.shadowScale = 0.0f;
|
||||||
this->actor.world.pos.y += 4.0f;
|
this->actor.world.pos.y += 4.0f;
|
||||||
this->actionFunc = func_80B22500;
|
this->actionFunc = EnHakurock_Stalactite_StuckInGround;
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_80B22500(EnHakurock* this, PlayState* play) {
|
/**
|
||||||
|
* Shakes vertically for 10 frames to make it look like it's settling into the ground. If it's struck by Goht or a
|
||||||
|
* falling stalactite, it will break apart into a bunch of stalactite-shaped fragments. If the player runs into it while
|
||||||
|
* Goron Rolling, it will stop their roll and bounce them back. If the stalactite gets too far from the player and is
|
||||||
|
* "behind" the camera, it will disappear and allow Goht to reuse this instance for another stalactite.
|
||||||
|
*/
|
||||||
|
void EnHakurock_Stalactite_StuckInGround(EnHakurock* this, PlayState* play) {
|
||||||
Player* player = GET_PLAYER(play);
|
Player* player = GET_PLAYER(play);
|
||||||
|
|
||||||
if (this->counter > 0) {
|
if (this->timer > 0) {
|
||||||
this->counter--;
|
this->timer--;
|
||||||
if ((this->counter & 1) == 0) {
|
if ((this->timer % 2) == 0) {
|
||||||
this->actor.world.pos.y = (Math_SinF(this->counter * (M_PI / 20)) * 4.0f) + this->actor.floorHeight;
|
this->actor.world.pos.y = (Math_SinF(this->timer * (M_PI / 20)) * 4.0f) + this->actor.floorHeight;
|
||||||
} else {
|
} else {
|
||||||
this->actor.world.pos.y = this->actor.floorHeight;
|
this->actor.world.pos.y = this->actor.floorHeight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->collider.base.ocFlags1 & OC1_HIT) {
|
if (this->collider.base.ocFlags1 & OC1_HIT) {
|
||||||
if ((this->collider.base.oc == this->actor.parent) ||
|
if ((this->collider.base.oc == this->actor.parent) ||
|
||||||
((this->collider.base.oc->id == ACTOR_EN_HAKUROCK) &&
|
((this->collider.base.oc->id == ACTOR_EN_HAKUROCK) &&
|
||||||
(this->collider.base.oc->params == EN_HAKUROCK_TYPE_UNK_2))) {
|
(EN_HAKUROCK_GET_TYPE(this->collider.base.oc) == EN_HAKUROCK_TYPE_FALLING_STALACTITE))) {
|
||||||
func_80B21EA4(this, 3);
|
EnHakurock_SpawnEffect(this, EN_HAKUROCK_EFFECT_TYPE_STALACTITE_DESTROYED);
|
||||||
func_80B21FFC(this);
|
EnHakurock_SetupWaitForSignal(this);
|
||||||
} else if ((&player->actor == this->collider.base.oc) &&
|
} else if ((&player->actor == this->collider.base.oc) &&
|
||||||
(player->stateFlags3 & (PLAYER_STATE3_1000 | PLAYER_STATE3_80000)) &&
|
(player->stateFlags3 & (PLAYER_STATE3_1000 | PLAYER_STATE3_80000)) &&
|
||||||
(player->linearVelocity > 8.0f)) {
|
(player->linearVelocity > 8.0f)) {
|
||||||
|
@ -287,60 +348,66 @@ void func_80B22500(EnHakurock* this, PlayState* play) {
|
||||||
player->actor.shape.rot.y = player->actor.world.rot.y;
|
player->actor.shape.rot.y = player->actor.world.rot.y;
|
||||||
player->unk_B8C = 4;
|
player->unk_B8C = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if ((this->actor.xzDistToPlayer > 1000.0f) && (this->actor.projectedPos.z < 0.0f)) {
|
} else if ((this->actor.xzDistToPlayer > 1000.0f) && (this->actor.projectedPos.z < 0.0f)) {
|
||||||
func_80B21FFC(this);
|
EnHakurock_SetupWaitForSignal(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_80B226AC(EnHakurock* this) {
|
void EnHakurock_LargeStalactite_SetupWait(EnHakurock* this) {
|
||||||
f32 shiftFactor;
|
f32 shiftFactor;
|
||||||
|
|
||||||
this->actor.draw = EnHakurock_Draw;
|
this->actor.draw = EnHakurock_DrawStalactite;
|
||||||
Actor_SetScale(&this->actor, 0.35f);
|
Actor_SetScale(&this->actor, 0.35f);
|
||||||
this->actor.scale.y = 0.5f;
|
this->actor.scale.y = 0.5f;
|
||||||
this->collider.dim.radius = this->actor.scale.x * 270.0f;
|
this->collider.dim.radius = this->actor.scale.x * 270.0f;
|
||||||
shiftFactor = -750.0f;
|
shiftFactor = -750.0f;
|
||||||
this->collider.dim.yShift = 0.5f * shiftFactor;
|
this->collider.dim.yShift = 0.5f * shiftFactor;
|
||||||
this->counter = 0;
|
this->timer = 0;
|
||||||
this->actor.shape.shadowScale = 0.0f;
|
this->actor.shape.shadowScale = 0.0f;
|
||||||
this->collider.dim.height = this->collider.dim.yShift * -2;
|
this->collider.dim.height = this->collider.dim.yShift * -2;
|
||||||
this->actionFunc = func_80B22750;
|
this->actionFunc = EnHakurock_LargeStalactite_Wait;
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_80B22750(EnHakurock* this, PlayState* play) {
|
/**
|
||||||
if (this->actor.params == EN_HAKUROCK_TYPE_UNK_0) {
|
* Waits until Goht changes its type as part of its intro cutscene. Once its type changes, the stalactite will break
|
||||||
func_80B21EA4(this, 3);
|
* apart into a bunch of stalactite-shaped fragments.
|
||||||
func_80B21FFC(this);
|
*/
|
||||||
|
void EnHakurock_LargeStalactite_Wait(EnHakurock* this, PlayState* play) {
|
||||||
|
if (EN_HAKUROCK_GET_TYPE(&this->actor) == EN_HAKUROCK_TYPE_NONE) {
|
||||||
|
EnHakurock_SpawnEffect(this, EN_HAKUROCK_EFFECT_TYPE_STALACTITE_DESTROYED);
|
||||||
|
EnHakurock_SetupWaitForSignal(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnHakurock_Update(Actor* thisx, PlayState* play) {
|
void EnHakurock_Update(Actor* thisx, PlayState* play) {
|
||||||
EnHakurock* this = THIS;
|
EnHakurock* this = THIS;
|
||||||
s16 rockParams;
|
s32 pad;
|
||||||
|
|
||||||
this->actionFunc(this, play);
|
this->actionFunc(this, play);
|
||||||
rockParams = this->actor.params;
|
|
||||||
if ((rockParams == EN_HAKUROCK_TYPE_BOULDER) || (rockParams == EN_HAKUROCK_TYPE_UNK_2)) {
|
if ((EN_HAKUROCK_GET_TYPE(thisx) == EN_HAKUROCK_TYPE_BOULDER) ||
|
||||||
Actor_MoveWithGravity(&this->actor);
|
(EN_HAKUROCK_GET_TYPE(thisx) == EN_HAKUROCK_TYPE_FALLING_STALACTITE)) {
|
||||||
Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, this->collider.dim.radius, 0.0f,
|
Actor_MoveWithGravity(thisx);
|
||||||
|
Actor_UpdateBgCheckInfo(play, thisx, 30.0f, this->collider.dim.radius, 0.0f,
|
||||||
UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_80);
|
UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_80);
|
||||||
if (this->actor.floorHeight == BGCHECK_Y_MIN) {
|
|
||||||
func_80B21FFC(this);
|
if (thisx->floorHeight == BGCHECK_Y_MIN) {
|
||||||
|
EnHakurock_SetupWaitForSignal(this);
|
||||||
} else {
|
} else {
|
||||||
Collider_UpdateCylinder(&this->actor, &this->collider);
|
Collider_UpdateCylinder(thisx, &this->collider);
|
||||||
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
|
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
|
||||||
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
|
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
|
||||||
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
|
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
|
||||||
}
|
}
|
||||||
} else if ((rockParams == EN_HAKUROCK_TYPE_STALACTITE) || (rockParams == EN_HAKUROCK_TYPE_FENCE_PILLAR)) {
|
} else if ((EN_HAKUROCK_GET_TYPE(thisx) == EN_HAKUROCK_TYPE_STUCK_STALACTITE) ||
|
||||||
Collider_UpdateCylinder(&this->actor, &this->collider);
|
(EN_HAKUROCK_GET_TYPE(thisx) == EN_HAKUROCK_TYPE_LARGE_STALACTITE)) {
|
||||||
|
Collider_UpdateCylinder(thisx, &this->collider);
|
||||||
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
|
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
|
||||||
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
|
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void func_80B228F4(Actor* thisx, PlayState* play) {
|
void EnHakurock_DrawBoulder(Actor* thisx, PlayState* play) {
|
||||||
OPEN_DISPS(play->state.gfxCtx);
|
OPEN_DISPS(play->state.gfxCtx);
|
||||||
|
|
||||||
Gfx_SetupDL25_Opa(play->state.gfxCtx);
|
Gfx_SetupDL25_Opa(play->state.gfxCtx);
|
||||||
|
@ -351,7 +418,7 @@ void func_80B228F4(Actor* thisx, PlayState* play) {
|
||||||
CLOSE_DISPS(play->state.gfxCtx);
|
CLOSE_DISPS(play->state.gfxCtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnHakurock_Draw(Actor* thisx, PlayState* play) {
|
void EnHakurock_DrawStalactite(Actor* thisx, PlayState* play) {
|
||||||
OPEN_DISPS(play->state.gfxCtx);
|
OPEN_DISPS(play->state.gfxCtx);
|
||||||
|
|
||||||
Gfx_SetupDL25_Opa(play->state.gfxCtx);
|
Gfx_SetupDL25_Opa(play->state.gfxCtx);
|
||||||
|
|
|
@ -5,20 +5,22 @@
|
||||||
|
|
||||||
struct EnHakurock;
|
struct EnHakurock;
|
||||||
|
|
||||||
|
#define EN_HAKUROCK_GET_TYPE(thisx) ((thisx)->params)
|
||||||
|
|
||||||
typedef void (*EnHakurockActionFunc)(struct EnHakurock*, PlayState*);
|
typedef void (*EnHakurockActionFunc)(struct EnHakurock*, PlayState*);
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
/* 0x0 */ EN_HAKUROCK_TYPE_UNK_0,
|
/* 0x0 */ EN_HAKUROCK_TYPE_NONE,
|
||||||
/* 0x1 */ EN_HAKUROCK_TYPE_BOULDER,
|
/* 0x1 */ EN_HAKUROCK_TYPE_BOULDER,
|
||||||
/* 0x2 */ EN_HAKUROCK_TYPE_UNK_2,
|
/* 0x2 */ EN_HAKUROCK_TYPE_FALLING_STALACTITE,
|
||||||
/* 0x3 */ EN_HAKUROCK_TYPE_STALACTITE,
|
/* 0x3 */ EN_HAKUROCK_TYPE_STUCK_STALACTITE,
|
||||||
/* 0x4 */ EN_HAKUROCK_TYPE_FENCE_PILLAR
|
/* 0x4 */ EN_HAKUROCK_TYPE_LARGE_STALACTITE
|
||||||
} EnHakurockType;
|
} EnHakurockType;
|
||||||
|
|
||||||
typedef struct EnHakurock {
|
typedef struct EnHakurock {
|
||||||
/* 0x000 */ Actor actor;
|
/* 0x000 */ Actor actor;
|
||||||
/* 0x144 */ EnHakurockActionFunc actionFunc;
|
/* 0x144 */ EnHakurockActionFunc actionFunc;
|
||||||
/* 0x148 */ s32 counter;
|
/* 0x148 */ s32 timer;
|
||||||
/* 0x14C */ ColliderCylinder collider;
|
/* 0x14C */ ColliderCylinder collider;
|
||||||
} EnHakurock; // size = 0x198
|
} EnHakurock; // size = 0x198
|
||||||
|
|
||||||
|
|
|
@ -123,6 +123,7 @@ void func_809469C0(Player* player, u8* shadowTexture, f32 arg2) {
|
||||||
Vec3f sp7C;
|
Vec3f sp7C;
|
||||||
|
|
||||||
for (i = 0; i < 16; i++) {
|
for (i = 0; i < 16; i++) {
|
||||||
|
// TODO: match with a continue
|
||||||
if ((arg2 == 0.0f) || ((j = D_80947ACC[i]) >= 0)) {
|
if ((arg2 == 0.0f) || ((j = D_80947ACC[i]) >= 0)) {
|
||||||
if (arg2 > 0.0f) {
|
if (arg2 > 0.0f) {
|
||||||
lerp.x = D_80947EA0[i].x + (D_80947EA0[j].x - D_80947EA0[i].x) * arg2;
|
lerp.x = D_80947EA0[i].x + (D_80947EA0[j].x - D_80947EA0[i].x) * arg2;
|
||||||
|
|
|
@ -144,7 +144,7 @@ void EnTanron2_Init(Actor* thisx, PlayState* play) {
|
||||||
Collider_InitAndSetCylinder(play, &this->collider1, &this->actor, &sCylinderInit1);
|
Collider_InitAndSetCylinder(play, &this->collider1, &this->actor, &sCylinderInit1);
|
||||||
Collider_InitAndSetCylinder(play, &this->collider2, &this->actor, &sCylinderInit2);
|
Collider_InitAndSetCylinder(play, &this->collider2, &this->actor, &sCylinderInit2);
|
||||||
|
|
||||||
if ((KREG(64) != 0) || CHECK_EVENTINF(EVENTINF_60)) {
|
if ((KREG(64) != 0) || CHECK_EVENTINF(EVENTINF_INTRO_CS_WATCHED_WART)) {
|
||||||
func_80BB69C0(this);
|
func_80BB69C0(this);
|
||||||
} else {
|
} else {
|
||||||
func_80BB6F64(this);
|
func_80BB6F64(this);
|
||||||
|
|
|
@ -93,21 +93,24 @@ void EffectSsFhgFlash_Update(PlayState* play, u32 index, EffectSs* this) {
|
||||||
this->pos.x = player->bodyPartsPos[randBodyPart].x + Rand_CenteredFloat(10.0f);
|
this->pos.x = player->bodyPartsPos[randBodyPart].x + Rand_CenteredFloat(10.0f);
|
||||||
this->pos.y = player->bodyPartsPos[randBodyPart].y + Rand_CenteredFloat(15.0f);
|
this->pos.y = player->bodyPartsPos[randBodyPart].y + Rand_CenteredFloat(15.0f);
|
||||||
this->pos.z = player->bodyPartsPos[randBodyPart].z + Rand_CenteredFloat(10.0f);
|
this->pos.z = player->bodyPartsPos[randBodyPart].z + Rand_CenteredFloat(10.0f);
|
||||||
} else if ((this->rParams >= FHGFLASH_SHOCK_GOHT_2) && (this->rParams <= FHGFLASH_SHOCK_GOHT_6)) {
|
} else if ((this->rParams >= FHGFLASH_SHOCK_GOHT_BACK_LEFT_THIGH) &&
|
||||||
|
(this->rParams <= FHGFLASH_SHOCK_GOHT_FRONT_RIGHT_UPPER_LEG)) {
|
||||||
s32 pad;
|
s32 pad;
|
||||||
Vec3f* bodyPartPos;
|
Vec3f* effectPos;
|
||||||
BossHakugin* goht = (BossHakugin*)this->actor;
|
BossHakugin* goht = (BossHakugin*)this->actor;
|
||||||
s32 gohtIndex = goht->unk_191 - 3;
|
s32 effectIndex = goht->malfunctionEffectIndex - 3;
|
||||||
|
|
||||||
if (gohtIndex < 0) {
|
if (effectIndex < 0) {
|
||||||
bodyPartPos = &goht->unk_2F00[this->rParams][12].unk_00;
|
effectPos = &goht->malfunctionEffects[this->rParams - FHGFLASH_SHOCK_GOHT_BACK_LEFT_THIGH]
|
||||||
|
[GOHT_MALFUNCTION_EFFECTS_PER_TYPE - 3]
|
||||||
|
.pos;
|
||||||
} else {
|
} else {
|
||||||
bodyPartPos = &goht->unk_2F00[this->rParams][gohtIndex].unk_00;
|
effectPos = &goht->malfunctionEffects[this->rParams - FHGFLASH_SHOCK_GOHT_BACK_LEFT_THIGH][effectIndex].pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->pos.x = Rand_CenteredFloat(70.0f) + bodyPartPos->x;
|
this->pos.x = Rand_CenteredFloat(70.0f) + effectPos->x;
|
||||||
this->pos.y = Rand_CenteredFloat(70.0f) + bodyPartPos->y;
|
this->pos.y = Rand_CenteredFloat(70.0f) + effectPos->y;
|
||||||
this->pos.z = Rand_CenteredFloat(70.0f) + bodyPartPos->z;
|
this->pos.z = Rand_CenteredFloat(70.0f) + effectPos->z;
|
||||||
}
|
}
|
||||||
if (this->life < 100) {
|
if (this->life < 100) {
|
||||||
this->rAlpha -= 50;
|
this->rAlpha -= 50;
|
||||||
|
|
|
@ -23,11 +23,12 @@ typedef enum {
|
||||||
typedef enum {
|
typedef enum {
|
||||||
/* 0 */ FHGFLASH_SHOCK_NO_ACTOR,
|
/* 0 */ FHGFLASH_SHOCK_NO_ACTOR,
|
||||||
/* 1 */ FHGFLASH_SHOCK_PLAYER,
|
/* 1 */ FHGFLASH_SHOCK_PLAYER,
|
||||||
/* 2 */ FHGFLASH_SHOCK_GOHT_2,
|
/* 2 */ FHGFLASH_SHOCK_GOHT_BACK_LEFT_THIGH,
|
||||||
/* 3 */ FHGFLASH_SHOCK_GOHT_3,
|
/* 3 */ FHGFLASH_SHOCK_GOHT_BACK_RIGHT_PASTERN,
|
||||||
/* 4 */ FHGFLASH_SHOCK_GOHT_4,
|
/* 4 */ FHGFLASH_SHOCK_GOHT_JAW_ROOT,
|
||||||
/* 5 */ FHGFLASH_SHOCK_GOHT_5,
|
/* 5 */ FHGFLASH_SHOCK_GOHT_FRONT_LEFT_LOWER_LEG,
|
||||||
/* 6 */ FHGFLASH_SHOCK_GOHT_6
|
/* 6 */ FHGFLASH_SHOCK_GOHT_FRONT_RIGHT_UPPER_LEG,
|
||||||
|
/* 7 */ FHGFLASH_SHOCK_GOHT_MAX
|
||||||
} FhgFlashLightningParam;
|
} FhgFlashLightningParam;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -12909,83 +12909,83 @@
|
||||||
0x80B04D34:("func_80B04D34",),
|
0x80B04D34:("func_80B04D34",),
|
||||||
0x80B05290:("BossHakugin_Init",),
|
0x80B05290:("BossHakugin_Init",),
|
||||||
0x80B05690:("BossHakugin_Destroy",),
|
0x80B05690:("BossHakugin_Destroy",),
|
||||||
0x80B0573C:("func_80B0573C",),
|
0x80B0573C:("BossHakugin_Vec3fNormalize",),
|
||||||
0x80B057A4:("func_80B057A4",),
|
0x80B057A4:("BossHakugin_StepVector",),
|
||||||
0x80B058C0:("func_80B058C0",),
|
0x80B058C0:("BossHakugin_SpawnLargeStalactiteWalls",),
|
||||||
0x80B05A64:("func_80B05A64",),
|
0x80B05A64:("BossHakugin_RequestQuakeAndRumble",),
|
||||||
0x80B05B04:("func_80B05B04",),
|
0x80B05B04:("BossHakugin_SpawnIceSparkle",),
|
||||||
0x80B05CBC:("func_80B05CBC",),
|
0x80B05CBC:("BossHakugin_ApplyGoronSpikeBoost",),
|
||||||
0x80B05D4C:("func_80B05D4C",),
|
0x80B05D4C:("BossHakugin_UpdateLight",),
|
||||||
0x80B05EE0:("func_80B05EE0",),
|
0x80B05EE0:("BossHakugin_SpawnBlueWarpAndHeartContainer",),
|
||||||
0x80B0607C:("func_80B0607C",),
|
0x80B0607C:("BossHakugin_UpdateBaseRot",),
|
||||||
0x80B06558:("func_80B06558",),
|
0x80B06558:("BossHakugin_SetLightningSegmentColliderVertices",),
|
||||||
0x80B06600:("func_80B06600",),
|
0x80B06600:("BossHakugin_AddLightningSegments",),
|
||||||
0x80B0696C:("func_80B0696C",),
|
0x80B0696C:("BossHakugin_SpawnGravel",),
|
||||||
0x80B06B20:("func_80B06B20",),
|
0x80B06B20:("BossHakugin_SpawnBoulder",),
|
||||||
0x80B06C08:("func_80B06C08",),
|
0x80B06C08:("BossHakugin_SpawnStalactite",),
|
||||||
0x80B06D38:("func_80B06D38",),
|
0x80B06D38:("BossHakugin_SpawnBomb",),
|
||||||
0x80B06F48:("func_80B06F48",),
|
0x80B06F48:("BossHakugin_AddMalfunctionEffects",),
|
||||||
0x80B0728C:("func_80B0728C",),
|
0x80B0728C:("BossHakugin_ChargeUpAttack",),
|
||||||
0x80B07450:("func_80B07450",),
|
0x80B07450:("BossHakugin_RunUpdateCommon",),
|
||||||
0x80B07700:("func_80B07700",),
|
0x80B07700:("BossHakugin_SpawnSteam",),
|
||||||
0x80B0791C:("func_80B0791C",),
|
0x80B0791C:("BossHakugin_ShouldWait",),
|
||||||
0x80B07B88:("func_80B07B88",),
|
0x80B07B88:("BossHakugin_Thaw",),
|
||||||
0x80B07BFC:("func_80B07BFC",),
|
0x80B07BFC:("BossHakugin_UpdateDrawDmgEffect",),
|
||||||
0x80B07DA4:("func_80B07DA4",),
|
0x80B07DA4:("BossHakugin_UpdateSubCam",),
|
||||||
0x80B07EEC:("func_80B07EEC",),
|
0x80B07EEC:("BossHakugin_SetupEntranceCutscene",),
|
||||||
0x80B08018:("func_80B08018",),
|
0x80B08018:("BossHakugin_EntranceCutscene",),
|
||||||
0x80B08124:("func_80B08124",),
|
0x80B08124:("BossHakugin_SetupFrozenBeforeFight",),
|
||||||
0x80B0813C:("func_80B0813C",),
|
0x80B0813C:("BossHakugin_FrozenBeforeFight",),
|
||||||
0x80B0825C:("func_80B0825C",),
|
0x80B0825C:("BossHakugin_SetupIntroCutsceneThaw",),
|
||||||
0x80B082AC:("func_80B082AC",),
|
0x80B082AC:("BossHakugin_IntroCutsceneThaw",),
|
||||||
0x80B08550:("func_80B08550",),
|
0x80B08550:("BossHakugin_SetupIntroCutsceneWakeUp",),
|
||||||
0x80B0863C:("func_80B0863C",),
|
0x80B0863C:("BossHakugin_IntroCutsceneWakeUp",),
|
||||||
0x80B08848:("func_80B08848",),
|
0x80B08848:("BossHakugin_SetupIntroCutsceneRun",),
|
||||||
0x80B08960:("func_80B08960",),
|
0x80B08960:("BossHakugin_IntroCutsceneRun",),
|
||||||
0x80B08C1C:("func_80B08C1C",),
|
0x80B08C1C:("BossHakugin_SetupRun",),
|
||||||
0x80B08CB8:("func_80B08CB8",),
|
0x80B08CB8:("BossHakugin_Run",),
|
||||||
0x80B09178:("func_80B09178",),
|
0x80B09178:("BossHakugin_SetupCharge",),
|
||||||
0x80B091D8:("func_80B091D8",),
|
0x80B091D8:("BossHakugin_Charge",),
|
||||||
0x80B093C0:("func_80B093C0",),
|
0x80B093C0:("BossHakugin_SetupDowned",),
|
||||||
0x80B094E0:("func_80B094E0",),
|
0x80B094E0:("BossHakugin_Downed",),
|
||||||
0x80B09840:("func_80B09840",),
|
0x80B09840:("BossHakugin_SetupThrow",),
|
||||||
0x80B098BC:("func_80B098BC",),
|
0x80B098BC:("BossHakugin_Throw",),
|
||||||
0x80B09A94:("func_80B09A94",),
|
0x80B09A94:("BossHakugin_SetupWait",),
|
||||||
0x80B09C78:("func_80B09C78",),
|
0x80B09C78:("BossHakugin_Wait",),
|
||||||
0x80B09DFC:("func_80B09DFC",),
|
0x80B09DFC:("BossHakugin_SetupShootLightning",),
|
||||||
0x80B09E20:("func_80B09E20",),
|
0x80B09E20:("BossHakugin_ShootLightning",),
|
||||||
0x80B09E84:("func_80B09E84",),
|
0x80B09E84:("BossHakugin_SetupCutsceneStart",),
|
||||||
0x80B09EDC:("func_80B09EDC",),
|
0x80B09EDC:("BossHakugin_CutsceneStart",),
|
||||||
0x80B09F7C:("func_80B09F7C",),
|
0x80B09F7C:("BossHakugin_SetupDeathCutsceneRun",),
|
||||||
0x80B0A2A4:("func_80B0A2A4",),
|
0x80B0A2A4:("BossHakugin_DeathCutsceneRun",),
|
||||||
0x80B0A5EC:("func_80B0A5EC",),
|
0x80B0A5EC:("BossHakugin_SetupDeathCutsceneSwerveIntoWall",),
|
||||||
0x80B0A638:("func_80B0A638",),
|
0x80B0A638:("BossHakugin_DeathCutsceneSwerveIntoWall",),
|
||||||
0x80B0A87C:("func_80B0A87C",),
|
0x80B0A87C:("BossHakugin_SetupDeathCutsceneCrushedByRocks",),
|
||||||
0x80B0A8C4:("func_80B0A8C4",),
|
0x80B0A8C4:("BossHakugin_DeathCutsceneCrushedByRocks",),
|
||||||
0x80B0AC30:("func_80B0AC30",),
|
0x80B0AC30:("BossHakugin_CheckForBodyColliderHit",),
|
||||||
0x80B0ADFC:("func_80B0ADFC",),
|
0x80B0ADFC:("BossHakugin_UpdateDamage",),
|
||||||
0x80B0B238:("func_80B0B238",),
|
0x80B0B238:("BossHakugin_UpdateRockEffects",),
|
||||||
0x80B0B34C:("func_80B0B34C",),
|
0x80B0B34C:("BossHakugin_UpdateFallingCrushingRocks",),
|
||||||
0x80B0B3F4:("func_80B0B3F4",),
|
0x80B0B3F4:("BossHakugin_UpdateMalfunctionEffects",),
|
||||||
0x80B0B548:("func_80B0B548",),
|
0x80B0B548:("BossHakugin_UpdateLightningSegments",),
|
||||||
0x80B0B660:("func_80B0B660",),
|
0x80B0B660:("BossHakugin_UpdateElectricBalls",),
|
||||||
0x80B0BAE0:("BossHakugin_Update",),
|
0x80B0BAE0:("BossHakugin_Update",),
|
||||||
0x80B0C000:("func_80B0C000",),
|
0x80B0C000:("BossHakugin_OverrideLimbDraw",),
|
||||||
0x80B0C1BC:("func_80B0C1BC",),
|
0x80B0C1BC:("BossHakugin_PostLimbDraw",),
|
||||||
0x80B0C398:("func_80B0C398",),
|
0x80B0C398:("BossHakugin_DrawRockEffects",),
|
||||||
0x80B0C570:("func_80B0C570",),
|
0x80B0C570:("BossHakugin_DrawMalfunctionEffects",),
|
||||||
0x80B0C7B0:("func_80B0C7B0",),
|
0x80B0C7B0:("BossHakugin_DrawChargingLightning",),
|
||||||
0x80B0CAF0:("func_80B0CAF0",),
|
0x80B0CAF0:("BossHakugin_DrawLightningSegments",),
|
||||||
0x80B0CCD8:("func_80B0CCD8",),
|
0x80B0CCD8:("BossHakugin_DrawElectricBalls",),
|
||||||
0x80B0CF24:("func_80B0CF24",),
|
0x80B0CF24:("BossHakugin_DrawIce",),
|
||||||
0x80B0D0D4:("BossHakugin_Draw",),
|
0x80B0D0D4:("BossHakugin_Draw",),
|
||||||
0x80B0D2B8:("func_80B0D2B8",),
|
0x80B0D2B8:("BossHakugin_FillShadowTex",),
|
||||||
0x80B0D69C:("func_80B0D69C",),
|
0x80B0D69C:("BossHakugin_GenShadowTex",),
|
||||||
0x80B0D750:("func_80B0D750",),
|
0x80B0D750:("BossHakugin_DrawShadowTex",),
|
||||||
0x80B0D9CC:("func_80B0D9CC",),
|
0x80B0D9CC:("BossHakugin_SpawnCrushingRocks",),
|
||||||
0x80B0DFA8:("func_80B0DFA8",),
|
0x80B0DFA8:("BossHakugin_UpdateCrushingRocksCollision",),
|
||||||
0x80B0E548:("func_80B0E548",),
|
0x80B0E548:("BossHakugin_UpdateStationaryCrushingRocks",),
|
||||||
0x80B0E5A4:("func_80B0E5A4",),
|
0x80B0E5A4:("BossHakugin_DrawCrushingRocks",),
|
||||||
0x80B0F5E0:("func_80B0F5E0",),
|
0x80B0F5E0:("func_80B0F5E0",),
|
||||||
0x80B0F660:("func_80B0F660",),
|
0x80B0F660:("func_80B0F660",),
|
||||||
0x80B0F6DC:("func_80B0F6DC",),
|
0x80B0F6DC:("func_80B0F6DC",),
|
||||||
|
@ -13236,21 +13236,21 @@
|
||||||
0x80B21344:("EnPp_Draw",),
|
0x80B21344:("EnPp_Draw",),
|
||||||
0x80B21B00:("EnHakurock_Init",),
|
0x80B21B00:("EnHakurock_Init",),
|
||||||
0x80B21BB4:("EnHakurock_Destroy",),
|
0x80B21BB4:("EnHakurock_Destroy",),
|
||||||
0x80B21BE0:("func_80B21BE0",),
|
0x80B21BE0:("EnHakurock_AddRockEffect",),
|
||||||
0x80B21EA4:("func_80B21EA4",),
|
0x80B21EA4:("EnHakurock_SpawnEffect",),
|
||||||
0x80B21FFC:("func_80B21FFC",),
|
0x80B21FFC:("EnHakurock_SetupWaitForSignal",),
|
||||||
0x80B22040:("func_80B22040",),
|
0x80B22040:("EnHakurock_WaitForSignal",),
|
||||||
0x80B220A8:("func_80B220A8",),
|
0x80B220A8:("EnHakurock_Boulder_SetupMove",),
|
||||||
0x80B221E8:("func_80B221E8",),
|
0x80B221E8:("EnHakurock_Boulder_Move",),
|
||||||
0x80B222AC:("func_80B222AC",),
|
0x80B222AC:("EnHakurock_Stalactite_SetupFall",),
|
||||||
0x80B2242C:("func_80B2242C",),
|
0x80B2242C:("EnHakurock_Stalactite_Fall",),
|
||||||
0x80B224C0:("func_80B224C0",),
|
0x80B224C0:("EnHakurock_Stalactite_SetupStuckInGround",),
|
||||||
0x80B22500:("func_80B22500",),
|
0x80B22500:("EnHakurock_Stalactite_StuckInGround",),
|
||||||
0x80B226AC:("func_80B226AC",),
|
0x80B226AC:("EnHakurock_LargeStalactite_SetupWait",),
|
||||||
0x80B22750:("func_80B22750",),
|
0x80B22750:("EnHakurock_LargeStalactite_Wait",),
|
||||||
0x80B2278C:("EnHakurock_Update",),
|
0x80B2278C:("EnHakurock_Update",),
|
||||||
0x80B228F4:("func_80B228F4",),
|
0x80B228F4:("EnHakurock_DrawBoulder",),
|
||||||
0x80B229A4:("EnHakurock_Draw",),
|
0x80B229A4:("EnHakurock_DrawStalactite",),
|
||||||
0x80B22C00:("func_80B22C00",),
|
0x80B22C00:("func_80B22C00",),
|
||||||
0x80B22C2C:("func_80B22C2C",),
|
0x80B22C2C:("func_80B22C2C",),
|
||||||
0x80B22C80:("func_80B22C80",),
|
0x80B22C80:("func_80B22C80",),
|
||||||
|
|
|
@ -13399,48 +13399,39 @@
|
||||||
0x80B0504C:("D_80B0504C","f32","",0x4),
|
0x80B0504C:("D_80B0504C","f32","",0x4),
|
||||||
0x80B05050:("D_80B05050","f32","",0x4),
|
0x80B05050:("D_80B05050","f32","",0x4),
|
||||||
0x80B05054:("D_80B05054","f32","",0x4),
|
0x80B05054:("D_80B05054","f32","",0x4),
|
||||||
0x80B0E6E0:("Boss_Hakugin_InitVars","UNK_TYPE1","",0x1),
|
0x80B0E6E0:("Boss_Hakugin_InitVars","ActorInit","",0x20),
|
||||||
0x80B0E700:("D_80B0E700","UNK_TYPE1","",0x1),
|
0x80B0E700:("sJntSphElementsInit","ColliderJntSphElementInit","[19]",0x2AC),
|
||||||
0x80B0E9AC:("D_80B0E9AC","UNK_TYPE1","",0x1),
|
0x80B0E9AC:("sJntSphInit","ColliderJntSphInit","",0x10),
|
||||||
0x80B0E9BC:("D_80B0E9BC","UNK_TYPE1","",0x1),
|
0x80B0E9BC:("sTrisElementsInit","ColliderTrisElementInit","[1]",0x3C),
|
||||||
0x80B0E9D4:("D_80B0E9D4","UNK_TYPE1","",0x1),
|
0x80B0E9F8:("sTrisInit","ColliderTrisInit","",0x10),
|
||||||
0x80B0E9F8:("D_80B0E9F8","UNK_TYPE1","",0x1),
|
0x80B0EA08:("sSphereInit","ColliderSphereInit","",0x2C),
|
||||||
0x80B0EA08:("D_80B0EA08","UNK_TYPE1","",0x1),
|
0x80B0EA34:("sCylinderInit","ColliderCylinderInit","",0x2C),
|
||||||
0x80B0EA34:("D_80B0EA34","UNK_TYPE1","",0x1),
|
0x80B0EA60:("sDamageTable","DamageTable","",0x20),
|
||||||
0x80B0EA60:("D_80B0EA60","UNK_TYPE1","",0x1),
|
0x80B0EA80:("sColChkInfoInit","CollisionCheckInfoInit","",0x8),
|
||||||
0x80B0EA80:("D_80B0EA80","UNK_TYPE1","",0x1),
|
0x80B0EA88:("sChinTexture","TexturePtr","",0x4),
|
||||||
0x80B0EA88:("D_80B0EA88","UNK_TYPE4","",0x4),
|
0x80B0EA8C:("sLimbToBodyParts","s8","[33]",0x21),
|
||||||
0x80B0EA8C:("D_80B0EA8C","UNK_TYPE1","",0x1),
|
0x80B0EAB0:("sMalfunctionTypeToLimbIndex","s32","[5]",0x14),
|
||||||
0x80B0EA94:("D_80B0EA94","UNK_TYPE1","",0x1),
|
0x80B0EAC4:("sSparklePrimColor","Color_RGBA8","",0x4),
|
||||||
0x80B0EA95:("D_80B0EA95","UNK_TYPE1","",0x1),
|
0x80B0EAC8:("sSparkleEnvColor","Color_RGBA8","",0x4),
|
||||||
0x80B0EA9A:("D_80B0EA9A","UNK_TYPE1","",0x1),
|
0x80B0EACC:("sLightColor","Color_RGBA8","",0x4),
|
||||||
0x80B0EA9C:("D_80B0EA9C","UNK_TYPE1","",0x1),
|
0x80B0EAD0:("sLightningColor","Color_RGBA8","",0x4),
|
||||||
0x80B0EAA4:("D_80B0EAA4","UNK_TYPE1","",0x1),
|
0x80B0EAD4:("sTexturesDesegmented","s32","",0x4),
|
||||||
0x80B0EAA5:("D_80B0EAA5","UNK_TYPE1","",0x1),
|
0x80B0EAD8:("sInitChain","InitChainEntry","[4]",0x10),
|
||||||
0x80B0EAAC:("D_80B0EAAC","UNK_TYPE1","",0x1),
|
0x80B0EAE8:("sSubCamAt","Vec3f","",0xC),
|
||||||
0x80B0EAB0:("D_80B0EAB0","UNK_TYPE1","",0x1),
|
0x80B0EAF4:("sSubCamAt","Vec3f","",0xC),
|
||||||
0x80B0EAC4:("D_80B0EAC4","UNK_TYPE1","",0x1),
|
0x80B0EB00:("sSubCamEye","Vec3f","",0xC),
|
||||||
0x80B0EAC8:("D_80B0EAC8","UNK_TYPE1","",0x1),
|
0x80B0EB0C:("sSubCamAt","Vec3f","",0xC),
|
||||||
0x80B0EACC:("D_80B0EACC","UNK_TYPE1","",0x1),
|
0x80B0EB18:("sSubCamEye","Vec3f","",0xC),
|
||||||
0x80B0EAD0:("D_80B0EAD0","UNK_TYPE1","",0x1),
|
0x80B0EB24:("sRockNums","s32","[5]",0x14),
|
||||||
0x80B0EAD4:("D_80B0EAD4","UNK_TYPE4","",0x4),
|
0x80B0EB38:("sExplosionLimbHideInfo","ExplosionLimbHideInfo","[6]",0x30),
|
||||||
0x80B0EAD8:("D_80B0EAD8","UNK_TYPE1","",0x1),
|
0x80B0EB68:("sCurrentMalfunctionType","s32","",0x4),
|
||||||
0x80B0EAE8:("D_80B0EAE8","UNK_TYPE1","",0x1),
|
0x80B0EB6C:("sCurrentLimbIndex","s32","",0x4),
|
||||||
0x80B0EAF4:("D_80B0EAF4","UNK_TYPE1","",0x1),
|
0x80B0EB70:("sShadowSmallMap","s32","[6]",0x18),
|
||||||
0x80B0EB00:("D_80B0EB00","UNK_TYPE1","",0x1),
|
0x80B0EB88:("sShadowMediumMap","s32","[7]",0x1C),
|
||||||
0x80B0EB0C:("D_80B0EB0C","UNK_TYPE1","",0x1),
|
0x80B0EBA4:("sShadowLargeMap","s32","[8]",0x20),
|
||||||
0x80B0EB18:("D_80B0EB18","UNK_TYPE1","",0x1),
|
0x80B0EBC4:("sShadowExtraLargeMap","s32","[14]",0x38),
|
||||||
0x80B0EB24:("D_80B0EB24","UNK_TYPE1","",0x1),
|
0x80B0EBFC:("sParentShadowBodyParts","s32","[15]",0x3C),
|
||||||
0x80B0EB38:("D_80B0EB38","UNK_TYPE1","",0x1),
|
0x80B0EC38:("sShadowSizes","u8","[15]",0xF),
|
||||||
0x80B0EB60:("D_80B0EB60","UNK_TYPE1","",0x1),
|
|
||||||
0x80B0EB68:("D_80B0EB68","UNK_TYPE4","",0x4),
|
|
||||||
0x80B0EB6C:("D_80B0EB6C","UNK_TYPE4","",0x4),
|
|
||||||
0x80B0EB70:("D_80B0EB70","UNK_TYPE4","",0x4),
|
|
||||||
0x80B0EB88:("D_80B0EB88","UNK_TYPE4","",0x4),
|
|
||||||
0x80B0EBA4:("D_80B0EBA4","UNK_TYPE4","",0x4),
|
|
||||||
0x80B0EBC4:("D_80B0EBC4","UNK_TYPE4","",0x4),
|
|
||||||
0x80B0EBFC:("D_80B0EBFC","UNK_TYPE4","",0x4),
|
|
||||||
0x80B0EC38:("D_80B0EC38","UNK_TYPE1","",0x1),
|
|
||||||
0x80B0EC50:("D_80B0EC50","f32","",0x4),
|
0x80B0EC50:("D_80B0EC50","f32","",0x4),
|
||||||
0x80B0EC54:("D_80B0EC54","f32","",0x4),
|
0x80B0EC54:("D_80B0EC54","f32","",0x4),
|
||||||
0x80B0EC58:("D_80B0EC58","f32","",0x4),
|
0x80B0EC58:("D_80B0EC58","f32","",0x4),
|
||||||
|
|
|
@ -263,23 +263,6 @@ D_06041B30 = 0x06041B30;
|
||||||
D_06042330 = 0x06042330;
|
D_06042330 = 0x06042330;
|
||||||
D_06043330 = 0x06043330;
|
D_06043330 = 0x06043330;
|
||||||
|
|
||||||
// ovl_Boss_Hakugin
|
|
||||||
|
|
||||||
D_06002054 = 0x06002054;
|
|
||||||
D_0600319C = 0x0600319C;
|
|
||||||
D_06010488 = 0x06010488;
|
|
||||||
D_06010500 = 0x06010500;
|
|
||||||
D_06011100 = 0x06011100;
|
|
||||||
D_06011178 = 0x06011178;
|
|
||||||
D_06011208 = 0x06011208;
|
|
||||||
D_06011278 = 0x06011278;
|
|
||||||
D_06012ED0 = 0x06012ED0;
|
|
||||||
D_06012F40 = 0x06012F40;
|
|
||||||
D_06013158 = 0x06013158;
|
|
||||||
D_060134D0 = 0x060134D0;
|
|
||||||
D_06013828 = 0x06013828;
|
|
||||||
D_06014040 = 0x06014040;
|
|
||||||
|
|
||||||
// ovl_Dm_Tsg
|
// ovl_Dm_Tsg
|
||||||
|
|
||||||
D_06002D30 = 0x06002D30;
|
D_06002D30 = 0x06002D30;
|
||||||
|
|
Loading…
Reference in New Issue