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:
Tom Overton 2024-02-01 20:10:48 -08:00 committed by GitHub
parent 5db52cfd39
commit 5684c79312
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
21 changed files with 4289 additions and 649 deletions

View File

@ -1587,18 +1587,18 @@ typedef enum {
#define EVENTINF_50 0x50
#define EVENTINF_51 0x51
#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
#define EVENTINF_56 0x56
// Enabled when various boss intro cutscene has been watched
#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_65 0x65
#define EVENTINF_66 0x66

View File

@ -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);
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);
s16 SubS_ComputeTrackPointRot(s16* rot, s16 rotMax, s16 target, f32 slowness, f32 stepMin, f32 stepMax);

3
spec
View File

@ -3519,8 +3519,7 @@ beginseg
name "ovl_Boss_Hakugin"
compress
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/data/ovl_Boss_Hakugin/ovl_Boss_Hakugin.reloc.o"
include "build/src/overlays/actors/ovl_Boss_Hakugin/ovl_Boss_Hakugin_reloc.o"
endseg
beginseg

View File

@ -7218,15 +7218,15 @@ void Interface_Init(PlayState* play) {
(play->sceneId != SCENE_LAST_GORON) && (play->sceneId != SCENE_LAST_ZORA) &&
(play->sceneId != SCENE_LAST_LINK)) {
CLEAR_EVENTINF(EVENTINF_53); // Goht intro cutscene watched
CLEAR_EVENTINF(EVENTINF_54); // Odolwa intro cutscene watched
CLEAR_EVENTINF(EVENTINF_55); // Twinmold intro cutscene watched
CLEAR_EVENTINF(EVENTINF_56); // Gyorg intro cutscene watched
CLEAR_EVENTINF(EVENTINF_57); // Igos du Ikana intro cutscene watched
CLEAR_EVENTINF(EVENTINF_60); // Wart intro cutscene watched
CLEAR_EVENTINF(EVENTINF_61); // Majoras intro cutscene watched
CLEAR_EVENTINF(EVENTINF_62); //
CLEAR_EVENTINF(EVENTINF_63); // Gomess intro cutscene watched
CLEAR_EVENTINF(EVENTINF_INTRO_CS_WATCHED_GOHT);
CLEAR_EVENTINF(EVENTINF_INTRO_CS_WATCHED_ODOLWA);
CLEAR_EVENTINF(EVENTINF_INTRO_CS_WATCHED_TWINMOLD);
CLEAR_EVENTINF(EVENTINF_INTRO_CS_WATCHED_GYORG);
CLEAR_EVENTINF(EVENTINF_INTRO_CS_WATCHED_IGOS_DU_IKANA);
CLEAR_EVENTINF(EVENTINF_INTRO_CS_WATCHED_WART);
CLEAR_EVENTINF(EVENTINF_INTRO_CS_WATCHED_MAJORA);
CLEAR_EVENTINF(EVENTINF_ENTR_CS_WATCHED_GOHT);
CLEAR_EVENTINF(EVENTINF_INTRO_CS_WATCHED_GOMESS);
}
sFinalHoursClockDigitsRed = sFinalHoursClockFrameEnvRed = sFinalHoursClockFrameEnvGreen =

View File

@ -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[]) {
Vec3f pos;
Vec3f startVec;
@ -982,9 +982,9 @@ void SubS_GenShadowTex(Vec3f bodyPartsPos[], Vec3f* worldPos, u8* tex, f32 tween
parentBodyPart = parentBodyParts[i];
bodyPartPos = &bodyPartsPos[i];
pos.x = (bodyPartsPos[parentBodyPart].x - bodyPartPos->x) * tween + (bodyPartPos->x - worldPos->x);
pos.y = (bodyPartsPos[parentBodyPart].y - bodyPartPos->y) * tween + (bodyPartPos->y - worldPos->y);
pos.z = (bodyPartsPos[parentBodyPart].z - bodyPartPos->z) * tween + (bodyPartPos->z - worldPos->z);
pos.x = (bodyPartsPos[parentBodyPart].x - bodyPartPos->x) * weight + (bodyPartPos->x - worldPos->x);
pos.y = (bodyPartsPos[parentBodyPart].y - bodyPartPos->y) * weight + (bodyPartPos->y - worldPos->y);
pos.z = (bodyPartsPos[parentBodyPart].z - bodyPartPos->z) * weight + (bodyPartPos->z - worldPos->z);
} else {
bodyPartPos = &bodyPartsPos[i];

View File

@ -934,7 +934,7 @@ void Boss01_Init(Actor* thisx, PlayState* play) {
SkelAnime_InitFlex(play, &this->skelAnime, &gOdolwaSkel, &gOdolwaReadyAnim, this->jointTable, this->morphTable,
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);
this->actor.gravity = -2.5f;
sOdolwaMusicStartTimer = KREG(15) + 20;
@ -1138,7 +1138,7 @@ void Boss01_IntroCutscene(Boss01* this, PlayState* play) {
Cutscene_StopManual(play, &play->csCtx);
Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END);
this->actor.flags |= ACTOR_FLAG_TARGETABLE;
SET_EVENTINF(EVENTINF_54);
SET_EVENTINF(EVENTINF_INTRO_CS_WATCHED_ODOLWA);
}
break;
@ -3017,6 +3017,7 @@ void Boss01_FillShadowTex(Boss01* this, u8* tex, f32 weight) {
Vec3f startVec;
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) {
VEC3F_LERPIMPDST(&lerp, &this->bodyPartsPos[i], &this->bodyPartsPos[y], weight);

View File

@ -602,7 +602,7 @@ void Boss02_Init(Actor* thisx, PlayState* play) {
this->actor.draw = Boss02_Static_Draw;
this->actor.flags &= ~ACTOR_FLAG_TARGETABLE;
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;
sTwinmoldMusicStartTimer = KREG(15) + 20;
} else {
@ -2230,7 +2230,7 @@ void func_809DEAC4(Boss02* this, PlayState* play) {
this->unk_1D20 = 0;
sRedTwinmold->unk_0144 = sBlueTwinmold->unk_0144 = 3;
sRedTwinmold->unk_0146[0] = sBlueTwinmold->unk_0146[0] = 60;
SET_EVENTINF(EVENTINF_55);
SET_EVENTINF(EVENTINF_INTRO_CS_WATCHED_TWINMOLD);
}
break;

View File

@ -517,8 +517,7 @@ void Boss03_Init(Actor* thisx, PlayState* play2) {
GYORG_LIMB_MAX);
Actor_SetScale(&this->actor, 0.2f);
// CHECK_EVENTINF(EVENTINF_56): intro cutscene already watched
if ((KREG(64) != 0) || CHECK_EVENTINF(EVENTINF_56)) {
if ((KREG(64) != 0) || CHECK_EVENTINF(EVENTINF_INTRO_CS_WATCHED_GYORG)) {
this->actionFunc = func_809E344C;
D_809E9842 = false;
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 1);
@ -1377,7 +1376,7 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
func_809E344C(this, play);
this->workTimer[WORK_TIMER_UNK1_A] = 50;
SET_EVENTINF(EVENTINF_56);
SET_EVENTINF(EVENTINF_INTRO_CS_WATCHED_GYORG);
}
break;
}

View File

@ -200,7 +200,7 @@ void Boss04_Init(Actor* thisx, PlayState* play2) {
this->actor.world.pos.z = this->unk_6F0;
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);
this->actor.world.pos.y = this->actor.floorHeight + 160.0f;
phi_f24 = this->actor.floorHeight;
@ -393,7 +393,7 @@ void func_809EC568(Boss04* this, PlayState* play) {
Cutscene_StopManual(play, &play->csCtx);
Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END);
Play_DisableMotionBlur();
SET_EVENTINF(EVENTINF_60);
SET_EVENTINF(EVENTINF_INTRO_CS_WATCHED_WART);
}
break;
}

View File

@ -136,7 +136,7 @@ void Boss06_Init(Actor* thisx, PlayState* play) {
D_809F4970 = (EnKnight*)this->actor.parent;
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;
} else {
this->actionFunc = func_809F2B64;

File diff suppressed because it is too large Load Diff

View File

@ -2,38 +2,177 @@
#define Z_BOSS_HAKUGIN_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;
#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 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 {
/* 0x00 */ Vec3f unk_00;
/* 0x0C */ char unk_0C[0x8];
} BossHakuginFhgFlashUnkStruct; // size = 0x14
typedef struct GohtRockEffect {
/* 0x00 */ Vec3f pos;
/* 0x0C */ Vec3f velocity;
/* 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 {
/* 0x0000 */ Actor actor;
/* 0x0144 */ char unk_0144[0x44];
/* 0x0144 */ SkelAnime skelAnime;
/* 0x0188 */ BossHakuginActionFunc actionFunc;
/* 0x018C */ char unk_018C[0x5];
/* 0x0191 */ u8 unk_191;
/* 0x018C */ char unk_0192[0x866];
/* 0x09F8 */ BossHakuginEffect unk_9F8[BOSS_HAKUGIN_EFFECT_COUNT];
/* 0x2618 */ char unk_2618[0x8E8];
/* 0x2F00 */ BossHakuginFhgFlashUnkStruct unk_2F00[7][15];
/* 0x3734 */ char unk_3734[0xDC];
/* 0x018C */ u8 lightningHitSomething;
/* 0x018D */ u8 preventBoulderSpawnCount;
/* 0x018E */ u8 preventStalactiteSpawnCount;
/* 0x018F */ u8 preventBombSpawnCount;
/* 0x0190 */ u8 blockMalfunctionEffects;
/* 0x0191 */ u8 malfunctionEffectIndex;
/* 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
#endif // Z_BOSS_HAKUGIN_H

View File

@ -1,7 +1,26 @@
/*
* File: z_en_hakurock.c
* 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"
@ -17,20 +36,27 @@ void EnHakurock_Init(Actor* thisx, PlayState* play);
void EnHakurock_Destroy(Actor* thisx, PlayState* play);
void EnHakurock_Update(Actor* thisx, PlayState* play);
void func_80B21BE0(BossHakugin* parent, Vec3f* arg1, s32 arg2);
void func_80B21EA4(EnHakurock* this, s32 arg1);
void func_80B21FFC(EnHakurock* this);
void func_80B22040(EnHakurock* this, PlayState* play);
void func_80B220A8(EnHakurock* this);
void func_80B221E8(EnHakurock* this, PlayState* play);
void func_80B222AC(EnHakurock* this, PlayState* play);
void func_80B2242C(EnHakurock* this, PlayState* play);
void func_80B224C0(EnHakurock* this);
void func_80B22500(EnHakurock* this, PlayState* play);
void func_80B226AC(EnHakurock* this);
void func_80B22750(EnHakurock* this, PlayState* play);
void func_80B228F4(Actor* thisx, PlayState* play);
void EnHakurock_Draw(Actor* thisx, PlayState* play);
void EnHakurock_AddRockEffect(BossHakugin* parent, Vec3f* pos, s32 type);
void EnHakurock_SpawnEffect(EnHakurock* this, s32 type);
void EnHakurock_SetupWaitForSignal(EnHakurock* this);
void EnHakurock_WaitForSignal(EnHakurock* this, PlayState* play);
void EnHakurock_Boulder_SetupMove(EnHakurock* this);
void EnHakurock_Boulder_Move(EnHakurock* this, PlayState* play);
void EnHakurock_Stalactite_SetupFall(EnHakurock* this, PlayState* play);
void EnHakurock_Stalactite_Fall(EnHakurock* this, PlayState* play);
void EnHakurock_Stalactite_SetupStuckInGround(EnHakurock* this);
void EnHakurock_Stalactite_StuckInGround(EnHakurock* this, PlayState* play);
void EnHakurock_LargeStalactite_SetupWait(EnHakurock* this);
void EnHakurock_LargeStalactite_Wait(EnHakurock* this, PlayState* play);
void EnHakurock_DrawBoulder(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 = {
/**/ ACTOR_EN_HAKUROCK,
@ -66,22 +92,22 @@ static ColliderCylinderInit sCylinderInit = {
static CollisionCheckInfoInit sColChkInfoInit = { 0, 60, 60, MASS_IMMOVABLE };
// Stalactite
void EnHakurock_Init(Actor* thisx, PlayState* play) {
EnHakurock* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 52.0f);
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
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;
} else {
this->collider.base.ocFlags1 &= ~OC1_NO_PUSH;
this->actor.terminalVelocity = -100.0f;
this->actor.gravity = -7.0f;
}
func_80B21FFC(this);
EnHakurock_SetupWaitForSignal(this);
}
void EnHakurock_Destroy(Actor* thisx, PlayState* play) {
@ -90,102 +116,121 @@ void EnHakurock_Destroy(Actor* thisx, PlayState* play) {
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;
for (i = 0; i < ARRAY_COUNT(parent->unk_9F8); i++) {
BossHakuginEffect* gohtEffect = &parent->unk_9F8[i];
if (gohtEffect->unk_18 < 0) {
s16 sp2E;
s16 sp2C;
f32 sp28;
for (i = 0; i < GOHT_ROCK_EFFECT_COUNT; i++) {
GohtRockEffect* rockEffect = &parent->rockEffects[i];
Math_Vec3f_Copy(&gohtEffect->unk_0, arg1);
sp2C = Rand_S16Offset(0x1000, 0x3000);
sp2E = Rand_Next() >> 0x10;
sp28 = Rand_ZeroFloat(5.0f) + 10.0f;
gohtEffect->unk_C.x = (sp28 * Math_CosS(sp2C)) * Math_SinS(sp2E);
gohtEffect->unk_C.y = (Math_SinS(sp2C) * sp28);
gohtEffect->unk_C.z = (sp28 * Math_CosS(sp2C)) * Math_CosS(sp2E);
if ((arg2 == 1) || (arg2 == 3)) {
gohtEffect->unk_24 = ((Rand_ZeroFloat(5.0f) + 25.0f) * 0.0012f);
gohtEffect->unk_0.x = ((Rand_ZeroFloat(2.0f) + 9.0f) * gohtEffect->unk_C.x) + arg1->x;
gohtEffect->unk_0.y = ((Rand_ZeroFloat(2.0f) + 3.0f) * gohtEffect->unk_C.y) + arg1->y;
gohtEffect->unk_0.z = ((Rand_ZeroFloat(2.0f) + 9.0f) * gohtEffect->unk_C.z) + arg1->z;
gohtEffect->unk_1A = 1;
if (rockEffect->timer < 0) {
VecGeo velocityGeo;
Math_Vec3f_Copy(&rockEffect->pos, pos);
velocityGeo.pitch = Rand_S16Offset(0x1000, 0x3000);
velocityGeo.yaw = Rand_Next() >> 0x10;
velocityGeo.r = Rand_ZeroFloat(5.0f) + 10.0f;
rockEffect->velocity.x = velocityGeo.r * Math_CosS(velocityGeo.pitch) * Math_SinS(velocityGeo.yaw);
rockEffect->velocity.y = velocityGeo.r * Math_SinS(velocityGeo.pitch);
rockEffect->velocity.z = velocityGeo.r * Math_CosS(velocityGeo.pitch) * Math_CosS(velocityGeo.yaw);
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 {
gohtEffect->unk_24 = ((Rand_ZeroFloat(5.0f) + 18.0f) * 0.0001f);
gohtEffect->unk_0.x = ((Rand_ZeroFloat(2.0f) + 3.0f) * gohtEffect->unk_C.x) + arg1->x;
gohtEffect->unk_0.y = ((Rand_ZeroFloat(3.0f) + 1.0f) * gohtEffect->unk_C.y) + arg1->y;
gohtEffect->unk_0.z = ((Rand_ZeroFloat(2.0f) + 3.0f) * gohtEffect->unk_C.z) + arg1->z;
gohtEffect->unk_1A = 0;
rockEffect->scale = ((Rand_ZeroFloat(5.0f) + 18.0f) * 0.0001f);
rockEffect->pos.x = pos->x + ((Rand_ZeroFloat(2.0f) + 3.0f) * rockEffect->velocity.x);
rockEffect->pos.y = pos->y + ((Rand_ZeroFloat(3.0f) + 1.0f) * rockEffect->velocity.y);
rockEffect->pos.z = pos->z + ((Rand_ZeroFloat(2.0f) + 3.0f) * rockEffect->velocity.z);
rockEffect->type = GOHT_ROCK_EFFECT_TYPE_BOULDER;
}
gohtEffect->unk_1C.x = (s32)Rand_Next() >> 0x10;
gohtEffect->unk_1C.y = (s32)Rand_Next() >> 0x10;
gohtEffect->unk_1C.z = (s32)Rand_Next() >> 0x10;
gohtEffect->unk_18 = 0x28;
rockEffect->rot.x = (s32)Rand_Next() >> 0x10;
rockEffect->rot.y = (s32)Rand_Next() >> 0x10;
rockEffect->rot.z = (s32)Rand_Next() >> 0x10;
rockEffect->timer = 40;
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;
f32 scaleFactor;
s32 tmp;
s32 phi_s5;
s32 j;
f32 offset;
s32 count;
if (arg1 == 0) {
if (type == EN_HAKUROCK_EFFECT_TYPE_BOULDER_DESTROYED) {
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++) {
func_80B21BE0((BossHakugin*)this->actor.parent, &this->actor.world.pos, arg1);
EnHakurock_AddRockEffect((BossHakugin*)this->actor.parent, &this->actor.world.pos, type);
}
} else {
Math_Vec3f_Copy(&sp4C, &this->actor.world.pos);
scaleFactor = this->actor.scale.x * 600.0f;
if (arg1 == 1) {
sp4C.y -= scaleFactor;
Math_Vec3f_Copy(&pos, &this->actor.world.pos);
offset = this->actor.scale.x * 600.0f;
if (type == EN_HAKUROCK_EFFECT_TYPE_FALLING_STALACTITE_DESTROYED) {
pos.y -= offset;
i = 0;
} else {
i = 1;
}
for (; i < 3; i++) {
tmp = (i * 5) + 5;
for (phi_s5 = 0; phi_s5 < tmp; phi_s5++) {
func_80B21BE0((BossHakugin*)this->actor.parent, &sp4C, arg1);
count = (i * 5) + 5;
for (j = 0; j < count; j++) {
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->collider.base.atFlags &= ~AT_HIT;
this->collider.base.ocFlags1 &= ~OC1_HIT;
this->actor.draw = NULL;
this->actor.params = EN_HAKUROCK_TYPE_UNK_0;
this->actionFunc = func_80B22040;
this->actor.params = EN_HAKUROCK_TYPE_NONE;
this->actionFunc = EnHakurock_WaitForSignal;
}
void func_80B22040(EnHakurock* this, PlayState* play) {
if (this->actor.params == EN_HAKUROCK_TYPE_BOULDER) {
func_80B220A8(this);
} else if (this->actor.params == EN_HAKUROCK_TYPE_UNK_2) {
func_80B222AC(this, play);
} else if (this->actor.params == EN_HAKUROCK_TYPE_FENCE_PILLAR) {
func_80B226AC(this);
/**
* Waits and does nothing until its params are changed, after which it will setup the appropriate action function for
* its new type. When an instance of this actor is visibly destroyed, it is put into this state to wait for BossHakugin
* to signal that its instance should be reused. If an instance of this actor is spawned by anything other than Goht, it
* will end up stuck in this state forever once it's destroyed.
*/
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.draw = func_80B228F4;
this->actor.draw = EnHakurock_DrawBoulder;
this->actor.speed = Rand_ZeroFloat(3.5f) + 2.5f;
this->actor.velocity.y = Rand_ZeroFloat(4.5f) + 18.0f;
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.yShift = -this->collider.dim.radius;
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);
this->actionFunc = func_80B221E8;
this->actionFunc = EnHakurock_Boulder_Move;
}
void func_80B221E8(EnHakurock* this, PlayState* play) {
if (this->counter > 0) {
this->counter--;
/**
* Flies through the air while spinning until it hits something, then it breaks apart into a bunch of small rocks.
*/
void EnHakurock_Boulder_Move(EnHakurock* this, PlayState* play) {
if (this->timer > 0) {
this->timer--;
}
this->actor.shape.rot.x += 0x700;
this->actor.shape.rot.y += 0x900;
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))) {
Actor_PlaySfx(&this->actor, NA_SE_EV_ROCK_BROKEN);
func_80B21EA4(this, 0);
func_80B21FFC(this);
EnHakurock_SpawnEffect(this, EN_HAKUROCK_EFFECT_TYPE_BOULDER_DESTROYED);
EnHakurock_SetupWaitForSignal(this);
}
}
void func_80B222AC(EnHakurock* this, PlayState* play) {
void EnHakurock_Stalactite_SetupFall(EnHakurock* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s16 angle;
this->actor.draw = EnHakurock_Draw;
this->actor.draw = EnHakurock_DrawStalactite;
angle = ((s32)Rand_Next() >> 0x13) + player->actor.shape.rot.y;
this->actor.shape.rot.y = (s32)Rand_Next() >> 0x10;
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.height = this->collider.dim.yShift * -2;
Math_Vec3f_Copy(&this->actor.prevPos, &this->actor.world.pos);
this->actor.params = EN_HAKUROCK_TYPE_UNK_2;
this->actionFunc = func_80B2242C;
this->actor.params = EN_HAKUROCK_TYPE_FALLING_STALACTITE;
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)) {
func_80B21EA4(this, 1);
func_80B21FFC(this);
EnHakurock_SpawnEffect(this, EN_HAKUROCK_EFFECT_TYPE_FALLING_STALACTITE_DESTROYED);
EnHakurock_SetupWaitForSignal(this);
} 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);
func_80B224C0(this);
EnHakurock_Stalactite_SetupStuckInGround(this);
}
}
void func_80B224C0(EnHakurock* this) {
this->actor.params = EN_HAKUROCK_TYPE_STALACTITE;
this->counter = 10;
void EnHakurock_Stalactite_SetupStuckInGround(EnHakurock* this) {
this->actor.params = EN_HAKUROCK_TYPE_STUCK_STALACTITE;
this->timer = 10;
this->actor.shape.shadowScale = 0.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);
if (this->counter > 0) {
this->counter--;
if ((this->counter & 1) == 0) {
this->actor.world.pos.y = (Math_SinF(this->counter * (M_PI / 20)) * 4.0f) + this->actor.floorHeight;
if (this->timer > 0) {
this->timer--;
if ((this->timer % 2) == 0) {
this->actor.world.pos.y = (Math_SinF(this->timer * (M_PI / 20)) * 4.0f) + this->actor.floorHeight;
} else {
this->actor.world.pos.y = this->actor.floorHeight;
}
}
if (this->collider.base.ocFlags1 & OC1_HIT) {
if ((this->collider.base.oc == this->actor.parent) ||
((this->collider.base.oc->id == ACTOR_EN_HAKUROCK) &&
(this->collider.base.oc->params == EN_HAKUROCK_TYPE_UNK_2))) {
func_80B21EA4(this, 3);
func_80B21FFC(this);
(EN_HAKUROCK_GET_TYPE(this->collider.base.oc) == EN_HAKUROCK_TYPE_FALLING_STALACTITE))) {
EnHakurock_SpawnEffect(this, EN_HAKUROCK_EFFECT_TYPE_STALACTITE_DESTROYED);
EnHakurock_SetupWaitForSignal(this);
} else if ((&player->actor == this->collider.base.oc) &&
(player->stateFlags3 & (PLAYER_STATE3_1000 | PLAYER_STATE3_80000)) &&
(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->unk_B8C = 4;
}
} 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;
this->actor.draw = EnHakurock_Draw;
this->actor.draw = EnHakurock_DrawStalactite;
Actor_SetScale(&this->actor, 0.35f);
this->actor.scale.y = 0.5f;
this->collider.dim.radius = this->actor.scale.x * 270.0f;
shiftFactor = -750.0f;
this->collider.dim.yShift = 0.5f * shiftFactor;
this->counter = 0;
this->timer = 0;
this->actor.shape.shadowScale = 0.0f;
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) {
func_80B21EA4(this, 3);
func_80B21FFC(this);
/**
* Waits until Goht changes its type as part of its intro cutscene. Once its type changes, the stalactite will break
* apart into a bunch of stalactite-shaped fragments.
*/
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) {
EnHakurock* this = THIS;
s16 rockParams;
s32 pad;
this->actionFunc(this, play);
rockParams = this->actor.params;
if ((rockParams == EN_HAKUROCK_TYPE_BOULDER) || (rockParams == EN_HAKUROCK_TYPE_UNK_2)) {
Actor_MoveWithGravity(&this->actor);
Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, this->collider.dim.radius, 0.0f,
if ((EN_HAKUROCK_GET_TYPE(thisx) == EN_HAKUROCK_TYPE_BOULDER) ||
(EN_HAKUROCK_GET_TYPE(thisx) == EN_HAKUROCK_TYPE_FALLING_STALACTITE)) {
Actor_MoveWithGravity(thisx);
Actor_UpdateBgCheckInfo(play, thisx, 30.0f, this->collider.dim.radius, 0.0f,
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 {
Collider_UpdateCylinder(&this->actor, &this->collider);
Collider_UpdateCylinder(thisx, &this->collider);
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
CollisionCheck_SetAC(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)) {
Collider_UpdateCylinder(&this->actor, &this->collider);
} else if ((EN_HAKUROCK_GET_TYPE(thisx) == EN_HAKUROCK_TYPE_STUCK_STALACTITE) ||
(EN_HAKUROCK_GET_TYPE(thisx) == EN_HAKUROCK_TYPE_LARGE_STALACTITE)) {
Collider_UpdateCylinder(thisx, &this->collider);
CollisionCheck_SetAC(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);
Gfx_SetupDL25_Opa(play->state.gfxCtx);
@ -351,7 +418,7 @@ void func_80B228F4(Actor* thisx, PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
}
void EnHakurock_Draw(Actor* thisx, PlayState* play) {
void EnHakurock_DrawStalactite(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
Gfx_SetupDL25_Opa(play->state.gfxCtx);

View File

@ -5,20 +5,22 @@
struct EnHakurock;
#define EN_HAKUROCK_GET_TYPE(thisx) ((thisx)->params)
typedef void (*EnHakurockActionFunc)(struct EnHakurock*, PlayState*);
typedef enum {
/* 0x0 */ EN_HAKUROCK_TYPE_UNK_0,
/* 0x0 */ EN_HAKUROCK_TYPE_NONE,
/* 0x1 */ EN_HAKUROCK_TYPE_BOULDER,
/* 0x2 */ EN_HAKUROCK_TYPE_UNK_2,
/* 0x3 */ EN_HAKUROCK_TYPE_STALACTITE,
/* 0x4 */ EN_HAKUROCK_TYPE_FENCE_PILLAR
/* 0x2 */ EN_HAKUROCK_TYPE_FALLING_STALACTITE,
/* 0x3 */ EN_HAKUROCK_TYPE_STUCK_STALACTITE,
/* 0x4 */ EN_HAKUROCK_TYPE_LARGE_STALACTITE
} EnHakurockType;
typedef struct EnHakurock {
/* 0x000 */ Actor actor;
/* 0x144 */ EnHakurockActionFunc actionFunc;
/* 0x148 */ s32 counter;
/* 0x148 */ s32 timer;
/* 0x14C */ ColliderCylinder collider;
} EnHakurock; // size = 0x198

View File

@ -123,6 +123,7 @@ void func_809469C0(Player* player, u8* shadowTexture, f32 arg2) {
Vec3f sp7C;
for (i = 0; i < 16; i++) {
// TODO: match with a continue
if ((arg2 == 0.0f) || ((j = D_80947ACC[i]) >= 0)) {
if (arg2 > 0.0f) {
lerp.x = D_80947EA0[i].x + (D_80947EA0[j].x - D_80947EA0[i].x) * arg2;

View File

@ -144,7 +144,7 @@ void EnTanron2_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetCylinder(play, &this->collider1, &this->actor, &sCylinderInit1);
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);
} else {
func_80BB6F64(this);

View File

@ -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.y = player->bodyPartsPos[randBodyPart].y + Rand_CenteredFloat(15.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;
Vec3f* bodyPartPos;
Vec3f* effectPos;
BossHakugin* goht = (BossHakugin*)this->actor;
s32 gohtIndex = goht->unk_191 - 3;
s32 effectIndex = goht->malfunctionEffectIndex - 3;
if (gohtIndex < 0) {
bodyPartPos = &goht->unk_2F00[this->rParams][12].unk_00;
if (effectIndex < 0) {
effectPos = &goht->malfunctionEffects[this->rParams - FHGFLASH_SHOCK_GOHT_BACK_LEFT_THIGH]
[GOHT_MALFUNCTION_EFFECTS_PER_TYPE - 3]
.pos;
} 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.y = Rand_CenteredFloat(70.0f) + bodyPartPos->y;
this->pos.z = Rand_CenteredFloat(70.0f) + bodyPartPos->z;
this->pos.x = Rand_CenteredFloat(70.0f) + effectPos->x;
this->pos.y = Rand_CenteredFloat(70.0f) + effectPos->y;
this->pos.z = Rand_CenteredFloat(70.0f) + effectPos->z;
}
if (this->life < 100) {
this->rAlpha -= 50;

View File

@ -23,11 +23,12 @@ typedef enum {
typedef enum {
/* 0 */ FHGFLASH_SHOCK_NO_ACTOR,
/* 1 */ FHGFLASH_SHOCK_PLAYER,
/* 2 */ FHGFLASH_SHOCK_GOHT_2,
/* 3 */ FHGFLASH_SHOCK_GOHT_3,
/* 4 */ FHGFLASH_SHOCK_GOHT_4,
/* 5 */ FHGFLASH_SHOCK_GOHT_5,
/* 6 */ FHGFLASH_SHOCK_GOHT_6
/* 2 */ FHGFLASH_SHOCK_GOHT_BACK_LEFT_THIGH,
/* 3 */ FHGFLASH_SHOCK_GOHT_BACK_RIGHT_PASTERN,
/* 4 */ FHGFLASH_SHOCK_GOHT_JAW_ROOT,
/* 5 */ FHGFLASH_SHOCK_GOHT_FRONT_LEFT_LOWER_LEG,
/* 6 */ FHGFLASH_SHOCK_GOHT_FRONT_RIGHT_UPPER_LEG,
/* 7 */ FHGFLASH_SHOCK_GOHT_MAX
} FhgFlashLightningParam;
typedef struct {

View File

@ -12909,83 +12909,83 @@
0x80B04D34:("func_80B04D34",),
0x80B05290:("BossHakugin_Init",),
0x80B05690:("BossHakugin_Destroy",),
0x80B0573C:("func_80B0573C",),
0x80B057A4:("func_80B057A4",),
0x80B058C0:("func_80B058C0",),
0x80B05A64:("func_80B05A64",),
0x80B05B04:("func_80B05B04",),
0x80B05CBC:("func_80B05CBC",),
0x80B05D4C:("func_80B05D4C",),
0x80B05EE0:("func_80B05EE0",),
0x80B0607C:("func_80B0607C",),
0x80B06558:("func_80B06558",),
0x80B06600:("func_80B06600",),
0x80B0696C:("func_80B0696C",),
0x80B06B20:("func_80B06B20",),
0x80B06C08:("func_80B06C08",),
0x80B06D38:("func_80B06D38",),
0x80B06F48:("func_80B06F48",),
0x80B0728C:("func_80B0728C",),
0x80B07450:("func_80B07450",),
0x80B07700:("func_80B07700",),
0x80B0791C:("func_80B0791C",),
0x80B07B88:("func_80B07B88",),
0x80B07BFC:("func_80B07BFC",),
0x80B07DA4:("func_80B07DA4",),
0x80B07EEC:("func_80B07EEC",),
0x80B08018:("func_80B08018",),
0x80B08124:("func_80B08124",),
0x80B0813C:("func_80B0813C",),
0x80B0825C:("func_80B0825C",),
0x80B082AC:("func_80B082AC",),
0x80B08550:("func_80B08550",),
0x80B0863C:("func_80B0863C",),
0x80B08848:("func_80B08848",),
0x80B08960:("func_80B08960",),
0x80B08C1C:("func_80B08C1C",),
0x80B08CB8:("func_80B08CB8",),
0x80B09178:("func_80B09178",),
0x80B091D8:("func_80B091D8",),
0x80B093C0:("func_80B093C0",),
0x80B094E0:("func_80B094E0",),
0x80B09840:("func_80B09840",),
0x80B098BC:("func_80B098BC",),
0x80B09A94:("func_80B09A94",),
0x80B09C78:("func_80B09C78",),
0x80B09DFC:("func_80B09DFC",),
0x80B09E20:("func_80B09E20",),
0x80B09E84:("func_80B09E84",),
0x80B09EDC:("func_80B09EDC",),
0x80B09F7C:("func_80B09F7C",),
0x80B0A2A4:("func_80B0A2A4",),
0x80B0A5EC:("func_80B0A5EC",),
0x80B0A638:("func_80B0A638",),
0x80B0A87C:("func_80B0A87C",),
0x80B0A8C4:("func_80B0A8C4",),
0x80B0AC30:("func_80B0AC30",),
0x80B0ADFC:("func_80B0ADFC",),
0x80B0B238:("func_80B0B238",),
0x80B0B34C:("func_80B0B34C",),
0x80B0B3F4:("func_80B0B3F4",),
0x80B0B548:("func_80B0B548",),
0x80B0B660:("func_80B0B660",),
0x80B0573C:("BossHakugin_Vec3fNormalize",),
0x80B057A4:("BossHakugin_StepVector",),
0x80B058C0:("BossHakugin_SpawnLargeStalactiteWalls",),
0x80B05A64:("BossHakugin_RequestQuakeAndRumble",),
0x80B05B04:("BossHakugin_SpawnIceSparkle",),
0x80B05CBC:("BossHakugin_ApplyGoronSpikeBoost",),
0x80B05D4C:("BossHakugin_UpdateLight",),
0x80B05EE0:("BossHakugin_SpawnBlueWarpAndHeartContainer",),
0x80B0607C:("BossHakugin_UpdateBaseRot",),
0x80B06558:("BossHakugin_SetLightningSegmentColliderVertices",),
0x80B06600:("BossHakugin_AddLightningSegments",),
0x80B0696C:("BossHakugin_SpawnGravel",),
0x80B06B20:("BossHakugin_SpawnBoulder",),
0x80B06C08:("BossHakugin_SpawnStalactite",),
0x80B06D38:("BossHakugin_SpawnBomb",),
0x80B06F48:("BossHakugin_AddMalfunctionEffects",),
0x80B0728C:("BossHakugin_ChargeUpAttack",),
0x80B07450:("BossHakugin_RunUpdateCommon",),
0x80B07700:("BossHakugin_SpawnSteam",),
0x80B0791C:("BossHakugin_ShouldWait",),
0x80B07B88:("BossHakugin_Thaw",),
0x80B07BFC:("BossHakugin_UpdateDrawDmgEffect",),
0x80B07DA4:("BossHakugin_UpdateSubCam",),
0x80B07EEC:("BossHakugin_SetupEntranceCutscene",),
0x80B08018:("BossHakugin_EntranceCutscene",),
0x80B08124:("BossHakugin_SetupFrozenBeforeFight",),
0x80B0813C:("BossHakugin_FrozenBeforeFight",),
0x80B0825C:("BossHakugin_SetupIntroCutsceneThaw",),
0x80B082AC:("BossHakugin_IntroCutsceneThaw",),
0x80B08550:("BossHakugin_SetupIntroCutsceneWakeUp",),
0x80B0863C:("BossHakugin_IntroCutsceneWakeUp",),
0x80B08848:("BossHakugin_SetupIntroCutsceneRun",),
0x80B08960:("BossHakugin_IntroCutsceneRun",),
0x80B08C1C:("BossHakugin_SetupRun",),
0x80B08CB8:("BossHakugin_Run",),
0x80B09178:("BossHakugin_SetupCharge",),
0x80B091D8:("BossHakugin_Charge",),
0x80B093C0:("BossHakugin_SetupDowned",),
0x80B094E0:("BossHakugin_Downed",),
0x80B09840:("BossHakugin_SetupThrow",),
0x80B098BC:("BossHakugin_Throw",),
0x80B09A94:("BossHakugin_SetupWait",),
0x80B09C78:("BossHakugin_Wait",),
0x80B09DFC:("BossHakugin_SetupShootLightning",),
0x80B09E20:("BossHakugin_ShootLightning",),
0x80B09E84:("BossHakugin_SetupCutsceneStart",),
0x80B09EDC:("BossHakugin_CutsceneStart",),
0x80B09F7C:("BossHakugin_SetupDeathCutsceneRun",),
0x80B0A2A4:("BossHakugin_DeathCutsceneRun",),
0x80B0A5EC:("BossHakugin_SetupDeathCutsceneSwerveIntoWall",),
0x80B0A638:("BossHakugin_DeathCutsceneSwerveIntoWall",),
0x80B0A87C:("BossHakugin_SetupDeathCutsceneCrushedByRocks",),
0x80B0A8C4:("BossHakugin_DeathCutsceneCrushedByRocks",),
0x80B0AC30:("BossHakugin_CheckForBodyColliderHit",),
0x80B0ADFC:("BossHakugin_UpdateDamage",),
0x80B0B238:("BossHakugin_UpdateRockEffects",),
0x80B0B34C:("BossHakugin_UpdateFallingCrushingRocks",),
0x80B0B3F4:("BossHakugin_UpdateMalfunctionEffects",),
0x80B0B548:("BossHakugin_UpdateLightningSegments",),
0x80B0B660:("BossHakugin_UpdateElectricBalls",),
0x80B0BAE0:("BossHakugin_Update",),
0x80B0C000:("func_80B0C000",),
0x80B0C1BC:("func_80B0C1BC",),
0x80B0C398:("func_80B0C398",),
0x80B0C570:("func_80B0C570",),
0x80B0C7B0:("func_80B0C7B0",),
0x80B0CAF0:("func_80B0CAF0",),
0x80B0CCD8:("func_80B0CCD8",),
0x80B0CF24:("func_80B0CF24",),
0x80B0C000:("BossHakugin_OverrideLimbDraw",),
0x80B0C1BC:("BossHakugin_PostLimbDraw",),
0x80B0C398:("BossHakugin_DrawRockEffects",),
0x80B0C570:("BossHakugin_DrawMalfunctionEffects",),
0x80B0C7B0:("BossHakugin_DrawChargingLightning",),
0x80B0CAF0:("BossHakugin_DrawLightningSegments",),
0x80B0CCD8:("BossHakugin_DrawElectricBalls",),
0x80B0CF24:("BossHakugin_DrawIce",),
0x80B0D0D4:("BossHakugin_Draw",),
0x80B0D2B8:("func_80B0D2B8",),
0x80B0D69C:("func_80B0D69C",),
0x80B0D750:("func_80B0D750",),
0x80B0D9CC:("func_80B0D9CC",),
0x80B0DFA8:("func_80B0DFA8",),
0x80B0E548:("func_80B0E548",),
0x80B0E5A4:("func_80B0E5A4",),
0x80B0D2B8:("BossHakugin_FillShadowTex",),
0x80B0D69C:("BossHakugin_GenShadowTex",),
0x80B0D750:("BossHakugin_DrawShadowTex",),
0x80B0D9CC:("BossHakugin_SpawnCrushingRocks",),
0x80B0DFA8:("BossHakugin_UpdateCrushingRocksCollision",),
0x80B0E548:("BossHakugin_UpdateStationaryCrushingRocks",),
0x80B0E5A4:("BossHakugin_DrawCrushingRocks",),
0x80B0F5E0:("func_80B0F5E0",),
0x80B0F660:("func_80B0F660",),
0x80B0F6DC:("func_80B0F6DC",),
@ -13236,21 +13236,21 @@
0x80B21344:("EnPp_Draw",),
0x80B21B00:("EnHakurock_Init",),
0x80B21BB4:("EnHakurock_Destroy",),
0x80B21BE0:("func_80B21BE0",),
0x80B21EA4:("func_80B21EA4",),
0x80B21FFC:("func_80B21FFC",),
0x80B22040:("func_80B22040",),
0x80B220A8:("func_80B220A8",),
0x80B221E8:("func_80B221E8",),
0x80B222AC:("func_80B222AC",),
0x80B2242C:("func_80B2242C",),
0x80B224C0:("func_80B224C0",),
0x80B22500:("func_80B22500",),
0x80B226AC:("func_80B226AC",),
0x80B22750:("func_80B22750",),
0x80B21BE0:("EnHakurock_AddRockEffect",),
0x80B21EA4:("EnHakurock_SpawnEffect",),
0x80B21FFC:("EnHakurock_SetupWaitForSignal",),
0x80B22040:("EnHakurock_WaitForSignal",),
0x80B220A8:("EnHakurock_Boulder_SetupMove",),
0x80B221E8:("EnHakurock_Boulder_Move",),
0x80B222AC:("EnHakurock_Stalactite_SetupFall",),
0x80B2242C:("EnHakurock_Stalactite_Fall",),
0x80B224C0:("EnHakurock_Stalactite_SetupStuckInGround",),
0x80B22500:("EnHakurock_Stalactite_StuckInGround",),
0x80B226AC:("EnHakurock_LargeStalactite_SetupWait",),
0x80B22750:("EnHakurock_LargeStalactite_Wait",),
0x80B2278C:("EnHakurock_Update",),
0x80B228F4:("func_80B228F4",),
0x80B229A4:("EnHakurock_Draw",),
0x80B228F4:("EnHakurock_DrawBoulder",),
0x80B229A4:("EnHakurock_DrawStalactite",),
0x80B22C00:("func_80B22C00",),
0x80B22C2C:("func_80B22C2C",),
0x80B22C80:("func_80B22C80",),

View File

@ -13399,48 +13399,39 @@
0x80B0504C:("D_80B0504C","f32","",0x4),
0x80B05050:("D_80B05050","f32","",0x4),
0x80B05054:("D_80B05054","f32","",0x4),
0x80B0E6E0:("Boss_Hakugin_InitVars","UNK_TYPE1","",0x1),
0x80B0E700:("D_80B0E700","UNK_TYPE1","",0x1),
0x80B0E9AC:("D_80B0E9AC","UNK_TYPE1","",0x1),
0x80B0E9BC:("D_80B0E9BC","UNK_TYPE1","",0x1),
0x80B0E9D4:("D_80B0E9D4","UNK_TYPE1","",0x1),
0x80B0E9F8:("D_80B0E9F8","UNK_TYPE1","",0x1),
0x80B0EA08:("D_80B0EA08","UNK_TYPE1","",0x1),
0x80B0EA34:("D_80B0EA34","UNK_TYPE1","",0x1),
0x80B0EA60:("D_80B0EA60","UNK_TYPE1","",0x1),
0x80B0EA80:("D_80B0EA80","UNK_TYPE1","",0x1),
0x80B0EA88:("D_80B0EA88","UNK_TYPE4","",0x4),
0x80B0EA8C:("D_80B0EA8C","UNK_TYPE1","",0x1),
0x80B0EA94:("D_80B0EA94","UNK_TYPE1","",0x1),
0x80B0EA95:("D_80B0EA95","UNK_TYPE1","",0x1),
0x80B0EA9A:("D_80B0EA9A","UNK_TYPE1","",0x1),
0x80B0EA9C:("D_80B0EA9C","UNK_TYPE1","",0x1),
0x80B0EAA4:("D_80B0EAA4","UNK_TYPE1","",0x1),
0x80B0EAA5:("D_80B0EAA5","UNK_TYPE1","",0x1),
0x80B0EAAC:("D_80B0EAAC","UNK_TYPE1","",0x1),
0x80B0EAB0:("D_80B0EAB0","UNK_TYPE1","",0x1),
0x80B0EAC4:("D_80B0EAC4","UNK_TYPE1","",0x1),
0x80B0EAC8:("D_80B0EAC8","UNK_TYPE1","",0x1),
0x80B0EACC:("D_80B0EACC","UNK_TYPE1","",0x1),
0x80B0EAD0:("D_80B0EAD0","UNK_TYPE1","",0x1),
0x80B0EAD4:("D_80B0EAD4","UNK_TYPE4","",0x4),
0x80B0EAD8:("D_80B0EAD8","UNK_TYPE1","",0x1),
0x80B0EAE8:("D_80B0EAE8","UNK_TYPE1","",0x1),
0x80B0EAF4:("D_80B0EAF4","UNK_TYPE1","",0x1),
0x80B0EB00:("D_80B0EB00","UNK_TYPE1","",0x1),
0x80B0EB0C:("D_80B0EB0C","UNK_TYPE1","",0x1),
0x80B0EB18:("D_80B0EB18","UNK_TYPE1","",0x1),
0x80B0EB24:("D_80B0EB24","UNK_TYPE1","",0x1),
0x80B0EB38:("D_80B0EB38","UNK_TYPE1","",0x1),
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),
0x80B0E6E0:("Boss_Hakugin_InitVars","ActorInit","",0x20),
0x80B0E700:("sJntSphElementsInit","ColliderJntSphElementInit","[19]",0x2AC),
0x80B0E9AC:("sJntSphInit","ColliderJntSphInit","",0x10),
0x80B0E9BC:("sTrisElementsInit","ColliderTrisElementInit","[1]",0x3C),
0x80B0E9F8:("sTrisInit","ColliderTrisInit","",0x10),
0x80B0EA08:("sSphereInit","ColliderSphereInit","",0x2C),
0x80B0EA34:("sCylinderInit","ColliderCylinderInit","",0x2C),
0x80B0EA60:("sDamageTable","DamageTable","",0x20),
0x80B0EA80:("sColChkInfoInit","CollisionCheckInfoInit","",0x8),
0x80B0EA88:("sChinTexture","TexturePtr","",0x4),
0x80B0EA8C:("sLimbToBodyParts","s8","[33]",0x21),
0x80B0EAB0:("sMalfunctionTypeToLimbIndex","s32","[5]",0x14),
0x80B0EAC4:("sSparklePrimColor","Color_RGBA8","",0x4),
0x80B0EAC8:("sSparkleEnvColor","Color_RGBA8","",0x4),
0x80B0EACC:("sLightColor","Color_RGBA8","",0x4),
0x80B0EAD0:("sLightningColor","Color_RGBA8","",0x4),
0x80B0EAD4:("sTexturesDesegmented","s32","",0x4),
0x80B0EAD8:("sInitChain","InitChainEntry","[4]",0x10),
0x80B0EAE8:("sSubCamAt","Vec3f","",0xC),
0x80B0EAF4:("sSubCamAt","Vec3f","",0xC),
0x80B0EB00:("sSubCamEye","Vec3f","",0xC),
0x80B0EB0C:("sSubCamAt","Vec3f","",0xC),
0x80B0EB18:("sSubCamEye","Vec3f","",0xC),
0x80B0EB24:("sRockNums","s32","[5]",0x14),
0x80B0EB38:("sExplosionLimbHideInfo","ExplosionLimbHideInfo","[6]",0x30),
0x80B0EB68:("sCurrentMalfunctionType","s32","",0x4),
0x80B0EB6C:("sCurrentLimbIndex","s32","",0x4),
0x80B0EB70:("sShadowSmallMap","s32","[6]",0x18),
0x80B0EB88:("sShadowMediumMap","s32","[7]",0x1C),
0x80B0EBA4:("sShadowLargeMap","s32","[8]",0x20),
0x80B0EBC4:("sShadowExtraLargeMap","s32","[14]",0x38),
0x80B0EBFC:("sParentShadowBodyParts","s32","[15]",0x3C),
0x80B0EC38:("sShadowSizes","u8","[15]",0xF),
0x80B0EC50:("D_80B0EC50","f32","",0x4),
0x80B0EC54:("D_80B0EC54","f32","",0x4),
0x80B0EC58:("D_80B0EC58","f32","",0x4),

View File

@ -263,23 +263,6 @@ D_06041B30 = 0x06041B30;
D_06042330 = 0x06042330;
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
D_06002D30 = 0x06002D30;