(Mostly) document EnSyatekiDekunuts (Shooting Gallery Deku Scrub) (#1095)

* (Mostly) document EnSyatekiDekunuts (Shooting Gallery Deku Scrub)

* Respond to Elliptic's review
This commit is contained in:
Tom Overton 2022-09-30 19:55:05 -07:00 committed by GitHub
parent 4935ec7ba1
commit bbc8aec36a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 280 additions and 214 deletions

View File

@ -83,7 +83,7 @@ void EnSyatekiCrow_Init(Actor* thisx, PlayState* play2) {
path = &play->setupPathList[path->unk1];
}
for (i = 0; i < EN_SYATEKI_CROW_GET_NUMBER(&this->actor); i++) {
for (i = 0; i < EN_SYATEKI_CROW_GET_INDEX(&this->actor); i++) {
path = &play->setupPathList[path->unk1];
}
@ -95,7 +95,7 @@ void EnSyatekiCrow_Init(Actor* thisx, PlayState* play2) {
this->collider.elements[0].dim.worldSphere.radius = sJntSphInit.elements[0].dim.modelSphere.radius;
ActorShape_Init(&this->actor.shape, 2000.0f, ActorShadow_DrawCircle, 20.0f);
if ((path == NULL) || (EN_SYATEKI_CROW_GET_NUMBER(&this->actor) >= 0x80)) {
if ((path == NULL) || (EN_SYATEKI_CROW_GET_INDEX(&this->actor) >= 0x80)) {
Actor_MarkForDeath(&this->actor);
return;
}
@ -133,7 +133,7 @@ void EnSyatekiCrow_WaitForSpawn(EnSyatekiCrow* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->isActive == true) &&
(syatekiMan->guayFlags & (1 << EN_SYATEKI_CROW_GET_NUMBER(&this->actor)))) {
(syatekiMan->guayFlags & (1 << EN_SYATEKI_CROW_GET_INDEX(&this->actor)))) {
EnSyatekiCrow_SetupWaitToMove(this);
} else if (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING) {
this->isActive = true;
@ -202,7 +202,7 @@ void EnSyatekiCrow_Fly(EnSyatekiCrow* this, PlayState* play) {
this->currentPointIndex++;
} else {
this->isActive = false;
syatekiMan->guayFlags &= ~(1 << EN_SYATEKI_CROW_GET_NUMBER(&this->actor));
syatekiMan->guayFlags &= ~(1 << EN_SYATEKI_CROW_GET_INDEX(&this->actor));
EnSyatekiCrow_SetupWaitForSpawn(this);
}
@ -241,7 +241,7 @@ void EnSyatekiCrow_Dead(EnSyatekiCrow* this, PlayState* play) {
if (this->deathTimer > 20) {
func_800B3030(play, &this->actor.world.pos, &sZeroVec, &sZeroVec, this->actor.scale.x * 10000.0f, 0, 0);
syatekiMan->guayHitCounter++;
syatekiMan->guayFlags &= ~(1 << EN_SYATEKI_CROW_GET_NUMBER(&this->actor));
syatekiMan->guayFlags &= ~(1 << EN_SYATEKI_CROW_GET_INDEX(&this->actor));
EnSyatekiCrow_SetupWaitForSpawn(this);
}

View File

@ -6,8 +6,8 @@
#define EN_SYATEKI_CROW_GET_WAIT_MOD(thisx) ((thisx)->params & 0xF)
#define EN_SYATEKI_CROW_GET_SPEED_MOD(thisx) (((thisx)->params & 0xF0) >> 4)
#define EN_SYATEKI_CROW_GET_NUMBER(thisx) (((thisx)->params & 0xFF00) >> 8)
#define EN_SYATEKI_CROW_PARAMS(number, speedMod, waitMod) (((number << 8) & 0xFF00) | ((speedMod << 4) & 0xF0) | (waitMod & 0xF))
#define EN_SYATEKI_CROW_GET_INDEX(thisx) (((thisx)->params & 0xFF00) >> 8)
#define EN_SYATEKI_CROW_PARAMS(index, speedMod, waitMod) (((index << 8) & 0xFF00) | ((speedMod << 4) & 0xF0) | (waitMod & 0xF))
struct EnSyatekiCrow;

View File

@ -17,22 +17,27 @@ void EnSyatekiDekunuts_Destroy(Actor* thisx, PlayState* play);
void EnSyatekiDekunuts_Update(Actor* thisx, PlayState* play);
void EnSyatekiDekunuts_Draw(Actor* thisx, PlayState* play);
void func_80A2BE54(EnSyatekiDekunuts* this);
void func_80A2BF18(EnSyatekiDekunuts* this, PlayState* play);
void func_80A2BFC4(EnSyatekiDekunuts* this);
void func_80A2C0F8(EnSyatekiDekunuts* this, PlayState* play);
void func_80A2C150(EnSyatekiDekunuts* this);
void func_80A2C168(EnSyatekiDekunuts* this, PlayState* play);
void func_80A2C1AC(EnSyatekiDekunuts* this);
void func_80A2C208(EnSyatekiDekunuts* this, PlayState* play);
void func_80A2C27C(EnSyatekiDekunuts* this);
void func_80A2C2E0(EnSyatekiDekunuts* this, PlayState* play);
void func_80A2C33C(EnSyatekiDekunuts* this, PlayState* play);
void func_80A2C3AC(EnSyatekiDekunuts* this);
void func_80A2C3F0(EnSyatekiDekunuts* this, PlayState* play);
void func_80A2C478(EnSyatekiDekunuts* this);
void func_80A2C48C(EnSyatekiDekunuts* this, PlayState* play);
void func_80A2C5DC(EnSyatekiDekunuts* this, PlayState* play);
void EnSyatekiDekunuts_SetupWaitForSpawn(EnSyatekiDekunuts* this);
void EnSyatekiDekunuts_WaitForSpawn(EnSyatekiDekunuts* this, PlayState* play);
void EnSyatekiDekunuts_SetupSpawn(EnSyatekiDekunuts* this);
void EnSyatekiDekunuts_Spawn(EnSyatekiDekunuts* this, PlayState* play);
void EnSyatekiDekunuts_SetupWaitToEmerge(EnSyatekiDekunuts* this);
void EnSyatekiDekunuts_WaitToEmerge(EnSyatekiDekunuts* this, PlayState* play);
void EnSyatekiDekunuts_SetupEmerge(EnSyatekiDekunuts* this);
void EnSyatekiDekunuts_Emerge(EnSyatekiDekunuts* this, PlayState* play);
void EnSyatekiDekunuts_SetupLookAround(EnSyatekiDekunuts* this);
void EnSyatekiDekunuts_LookAround(EnSyatekiDekunuts* this, PlayState* play);
void EnSyatekiDekunuts_BonusLookAround(EnSyatekiDekunuts* this, PlayState* play);
void EnSyatekiDekunuts_SetupBurrow(EnSyatekiDekunuts* this);
void EnSyatekiDekunuts_Burrow(EnSyatekiDekunuts* this, PlayState* play);
void EnSyatekiDekunuts_SetupGameEnd(EnSyatekiDekunuts* this);
void EnSyatekiDekunuts_GameEnd(EnSyatekiDekunuts* this, PlayState* play);
void EnSyatekiDekunuts_Dead(EnSyatekiDekunuts* this, PlayState* play);
typedef enum {
/* 0 */ EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_NORMAL,
/* 1 */ EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_FLIPPED_UP,
} EnSyatekiDekunutsHeaddressType;
const ActorInit En_Syateki_Dekunuts_InitVars = {
ACTOR_EN_SYATEKI_DEKUNUTS,
@ -66,7 +71,17 @@ static ColliderCylinderInit sCylinderInit = {
{ 48, 80, 0, { 0, 0, 0 } },
};
static Cylinder16 D_80A2CADC[] = { { 24, 40, 0, { 0, 0, 0 } } };
static Cylinder16 sBonusDekuScrubColliderDimensions[] = { { 24, 40, 0, { 0, 0, 0 } } };
typedef enum {
/* 0 */ EN_SYATEKI_DEKUNUTS_ANIM_UP,
/* 1 */ EN_SYATEKI_DEKUNUTS_ANIM_BURROW,
/* 2 */ EN_SYATEKI_DEKUNUTS_ANIM_IDLE, // unused
/* 3 */ EN_SYATEKI_DEKUNUTS_ANIM_LOOK_AROUND,
/* 4 */ EN_SYATEKI_DEKUNUTS_ANIM_DAMAGE,
/* 5 */ EN_SYATEKI_DEKUNUTS_ANIM_DIE,
/* 6 */ EN_SYATEKI_DEKUNUTS_ANIM_UNBURROW, // unused
} EnSyatekiDekunutsAnimation;
static AnimationInfo sAnimationInfo[] = {
{ &gDekuScrubUpAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
@ -85,10 +100,10 @@ static InitChainEntry sInitChain[] = {
};
void EnSyatekiDekunuts_Init(Actor* thisx, PlayState* play2) {
static s32 D_80A2CB9C = 1;
static s32 sDrawFlowers = true; // This makes it so only one EnSyatekiDekunuts draws all the flowers.
EnSyatekiDekunuts* this = THIS;
PlayState* play = play2;
s32 phi_v0;
s32 unkPathComparison;
Path* path;
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
s32 i;
@ -97,16 +112,16 @@ void EnSyatekiDekunuts_Init(Actor* thisx, PlayState* play2) {
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
if (EN_SYATEKI_DEKUNUTS_GET_PARAM_F(&this->actor) == 1) {
if (EN_SYATEKI_DEKUNUTS_GET_TYPE(&this->actor) == EN_SYATEKI_DEKUNUTS_TYPE_BONUS) {
Actor_SetScale(&this->actor, 0.01f);
this->collider.dim = D_80A2CADC[0];
phi_v0 = 3;
this->collider.dim = sBonusDekuScrubColliderDimensions[0];
unkPathComparison = 3;
} else {
Actor_SetScale(&this->actor, 0.02f);
phi_v0 = 1;
unkPathComparison = 1;
}
while (path->unk2 != phi_v0) {
while (path->unk2 != unkPathComparison) {
path = &play->setupPathList[path->unk1];
}
@ -114,29 +129,30 @@ void EnSyatekiDekunuts_Init(Actor* thisx, PlayState* play2) {
path = &play->setupPathList[path->unk1];
}
if (D_80A2CB9C == 1) {
this->unk_1EC = 1;
D_80A2CB9C = 0;
if (sDrawFlowers == true) {
this->shouldDrawFlowers = true;
sDrawFlowers = false;
} else {
this->unk_1EC = 0;
this->shouldDrawFlowers = false;
}
Actor_ProcessInitChain(&this->actor, sInitChain);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 35.0f);
SkelAnime_Init(play, &this->skelAnime, &gDekuScrubSkel, &gDekuScrubBurrowAnim, this->jointTable, this->morphTable,
DEKU_SCRUB_LIMB_MAX);
if (path == NULL) {
Actor_MarkForDeath(&this->actor);
return;
}
this->unk_1E4 = Lib_SegmentedToVirtual(path->points);
this->unk_1E8 = EN_SYATEKI_DEKUNUTS_GET_NUMBER(&this->actor);
this->unk_1EA = path->count;
this->unk_1D8 = 0;
this->flowerPos = Lib_SegmentedToVirtual(path->points);
this->index = EN_SYATEKI_DEKUNUTS_GET_INDEX(&this->actor);
this->flowerCount = path->count;
this->timer = 0;
this->unk_1DC = 0;
this->unk_1DA = 0;
func_80A2BE54(this);
this->waitTimer = 0;
EnSyatekiDekunuts_SetupWaitForSpawn(this);
}
void EnSyatekiDekunuts_Destroy(Actor* thisx, PlayState* play) {
@ -145,7 +161,7 @@ void EnSyatekiDekunuts_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->collider);
}
void func_80A2BE54(EnSyatekiDekunuts* this) {
void EnSyatekiDekunuts_SetupWaitForSpawn(EnSyatekiDekunuts* this) {
Animation_PlayOnceSetSpeed(&this->skelAnime, &gDekuScrubUpAnim, 0.0f);
this->actor.speedXZ = 0.0f;
@ -153,218 +169,252 @@ void func_80A2BE54(EnSyatekiDekunuts* this) {
this->actor.prevPos = this->actor.home.pos;
this->actor.shape.rot = this->actor.world.rot;
this->unk_1D8 = 0;
this->timer = 0;
this->unk_1DC = 0;
if (EN_SYATEKI_DEKUNUTS_GET_PARAM_F(&this->actor) != 1) {
this->unk_1E2 = 1;
if (EN_SYATEKI_DEKUNUTS_GET_TYPE(&this->actor) != EN_SYATEKI_DEKUNUTS_TYPE_BONUS) {
this->isAlive = true;
}
this->actionFunc = func_80A2BF18;
this->actionFunc = EnSyatekiDekunuts_WaitForSpawn;
}
void func_80A2BF18(EnSyatekiDekunuts* this, PlayState* play) {
/**
* Waits until the shooting gallery man sets the appropriate Deku Scrub flag to spawn.
*/
void EnSyatekiDekunuts_WaitForSpawn(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->unk_1E2 == 1) &&
((syatekiMan->dekuScrubFlags & (1 << this->unk_1E8)) != 0)) {
func_80A2BFC4(this);
if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->isAlive == true) &&
(syatekiMan->dekuScrubFlags & (1 << this->index))) {
EnSyatekiDekunuts_SetupSpawn(this);
} else if (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING) {
this->unk_1E2 = 1;
this->isAlive = true;
}
if ((syatekiMan->dekuScrubFlags == 0) && (syatekiMan->guayFlags == 0) &&
(EN_SYATEKI_DEKUNUTS_GET_PARAM_F(&this->actor) != 1)) {
this->unk_1E2 = 1;
if (!syatekiMan->dekuScrubFlags && !syatekiMan->guayFlags &&
(EN_SYATEKI_DEKUNUTS_GET_TYPE(&this->actor) != EN_SYATEKI_DEKUNUTS_TYPE_BONUS)) {
this->isAlive = true;
}
}
void func_80A2BFC4(EnSyatekiDekunuts* this) {
Vec3f sp14;
/**
* Positions the Deku Scrub to match up with its flower, then sets it up to start waiting.
*/
void EnSyatekiDekunuts_SetupSpawn(EnSyatekiDekunuts* this) {
Vec3f pos;
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
this->unk_1D8 = 0;
sp14.x = this->unk_1E4[this->unk_1E8].x;
sp14.y = this->unk_1E4[this->unk_1E8].y;
sp14.z = this->unk_1E4[this->unk_1E8].z;
this->actor.world.pos = this->actor.prevPos = sp14;
this->timer = 0;
pos.x = this->flowerPos[this->index].x;
pos.y = this->flowerPos[this->index].y;
pos.z = this->flowerPos[this->index].z;
this->actor.world.pos = this->actor.prevPos = pos;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
this->unk_1EE = 140 - (syatekiMan->currentWave * 20);
this->timeToBurrow = 140 - (syatekiMan->currentWave * 20);
if ((syatekiMan->currentWave & 1) != 0) {
this->unk_1F0 = 1;
this->unk_1F2 = 0;
if ((syatekiMan->currentWave % 2) != 0) {
this->headdressType = EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_FLIPPED_UP;
this->headdressRotZ = 0;
} else {
this->unk_1F0 = 0;
this->headdressType = EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_NORMAL;
}
this->actionFunc = func_80A2C0F8;
this->actionFunc = EnSyatekiDekunuts_Spawn;
}
void func_80A2C0F8(EnSyatekiDekunuts* this, PlayState* play) {
/**
* Waits 20 frames, then plays a sound and starts the process of making the Deku Scrubs emerge.
*/
void EnSyatekiDekunuts_Spawn(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiMan* syatekiMan;
if (this->unk_1DA > 20) {
if (this->waitTimer > 20) {
syatekiMan = (EnSyatekiMan*)this->actor.parent;
Actor_PlaySfxAtPos(&syatekiMan->actor, NA_SE_EN_NUTS_DAMAGE);
this->unk_1DA = 0;
func_80A2C150(this);
this->waitTimer = 0;
EnSyatekiDekunuts_SetupWaitToEmerge(this);
} else {
this->unk_1DA++;
this->waitTimer++;
}
}
void func_80A2C150(EnSyatekiDekunuts* this) {
this->unk_1D8 = 0;
this->actionFunc = func_80A2C168;
void EnSyatekiDekunuts_SetupWaitToEmerge(EnSyatekiDekunuts* this) {
this->timer = 0;
this->actionFunc = EnSyatekiDekunuts_WaitToEmerge;
}
void func_80A2C168(EnSyatekiDekunuts* this, PlayState* play) {
if (this->unk_1DA > 20) {
func_80A2C1AC(this);
this->unk_1DA = 0;
/**
* Waits 20 frames, then makes the Deku Scrubs emerge from underground.
*/
void EnSyatekiDekunuts_WaitToEmerge(EnSyatekiDekunuts* this, PlayState* play) {
if (this->waitTimer > 20) {
EnSyatekiDekunuts_SetupEmerge(this);
this->waitTimer = 0;
} else {
this->unk_1DA++;
this->waitTimer++;
}
}
void func_80A2C1AC(EnSyatekiDekunuts* this) {
void EnSyatekiDekunuts_SetupEmerge(EnSyatekiDekunuts* this) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_UP);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_SYATEKI_DEKUNUTS_ANIM_UP);
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
this->actionFunc = func_80A2C208;
this->actionFunc = EnSyatekiDekunuts_Emerge;
}
void func_80A2C208(EnSyatekiDekunuts* this, PlayState* play) {
/**
* Waits until the animation for coming out of the ground is done playing, then makes the
* Deku Scrubs look around. If the headdress should be flipped up, then this will also
* adjust the headdress's rotation.
*/
void EnSyatekiDekunuts_Emerge(EnSyatekiDekunuts* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
func_80A2C27C(this);
EnSyatekiDekunuts_SetupLookAround(this);
}
if (this->unk_1F0 == 1) {
Math_SmoothStepToS(&this->unk_1F2, -0x8000, 5, 0x1000, 0x100);
if (this->headdressType == EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_FLIPPED_UP) {
Math_SmoothStepToS(&this->headdressRotZ, -0x8000, 5, 0x1000, 0x100);
}
this->unk_1D8++;
this->timer++;
}
void func_80A2C27C(EnSyatekiDekunuts* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
if (EN_SYATEKI_DEKUNUTS_GET_PARAM_F(&this->actor) != 1) {
this->actionFunc = func_80A2C2E0;
void EnSyatekiDekunuts_SetupLookAround(EnSyatekiDekunuts* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_SYATEKI_DEKUNUTS_ANIM_LOOK_AROUND);
if (EN_SYATEKI_DEKUNUTS_GET_TYPE(&this->actor) != EN_SYATEKI_DEKUNUTS_TYPE_BONUS) {
this->actionFunc = EnSyatekiDekunuts_LookAround;
} else {
this->actionFunc = func_80A2C33C;
this->actionFunc = EnSyatekiDekunuts_BonusLookAround;
}
}
void func_80A2C2E0(EnSyatekiDekunuts* this, PlayState* play) {
/**
* Looks around back and forth until the timer reaches the time to burrow or until the game ends.
* No matter which occurs, the Deku Scrubs burrow underground afterwards.
*/
void EnSyatekiDekunuts_LookAround(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if ((this->unk_1EE < this->unk_1D8) || (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING)) {
func_80A2C3AC(this);
if ((this->timeToBurrow < this->timer) || (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING)) {
EnSyatekiDekunuts_SetupBurrow(this);
}
this->unk_1D8++;
this->timer++;
}
void func_80A2C33C(EnSyatekiDekunuts* this, PlayState* play) {
/**
* Looks around back and forth until the game ends, then burrow underground afterwards.
*/
void EnSyatekiDekunuts_BonusLookAround(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
// There are some cases where the minigame timer can reach 0, but the shooting game state is
// still SG_GAME_STATE_RUNNING. This check just makes absolutely sure that once the game is
// over, these Deku Scrubs will burrow.
if ((gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_1] <= SECONDS_TO_TIMER(0)) ||
(syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING)) {
func_80A2C3AC(this);
EnSyatekiDekunuts_SetupBurrow(this);
}
if (this->unk_1D8 < 11) {
this->unk_1D8++;
if (this->timer <= 10) {
this->timer++;
}
}
void func_80A2C3AC(EnSyatekiDekunuts* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
this->actionFunc = func_80A2C3F0;
void EnSyatekiDekunuts_SetupBurrow(EnSyatekiDekunuts* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_SYATEKI_DEKUNUTS_ANIM_BURROW);
this->actionFunc = EnSyatekiDekunuts_Burrow;
}
void func_80A2C3F0(EnSyatekiDekunuts* this, PlayState* play) {
/**
* Burrow underground. After 160 frames have passed since the Deku Scrub first emerged *and*
* after the burrowing animation is complete, this sets up the Deku Scrub to emerge again.
*/
void EnSyatekiDekunuts_Burrow(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if (syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) {
if (this->unk_1D8 > 160 && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->unk_1D8 = 0;
func_80A2C150(this);
if ((this->timer > 160) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->timer = 0;
EnSyatekiDekunuts_SetupWaitToEmerge(this);
} else {
this->unk_1D8++;
this->timer++;
}
} else {
func_80A2C478(this);
EnSyatekiDekunuts_SetupGameEnd(this);
}
}
void func_80A2C478(EnSyatekiDekunuts* this) {
this->actionFunc = func_80A2C48C;
void EnSyatekiDekunuts_SetupGameEnd(EnSyatekiDekunuts* this) {
this->actionFunc = EnSyatekiDekunuts_GameEnd;
}
void func_80A2C48C(EnSyatekiDekunuts* this, PlayState* play) {
if (this->unk_1DA > 20) {
func_80A2BE54(this);
this->unk_1DA = 0;
/**
* Waits 20 frames, then resets the Deku Scrub back to its initial state.
*/
void EnSyatekiDekunuts_GameEnd(EnSyatekiDekunuts* this, PlayState* play) {
if (this->waitTimer > 20) {
EnSyatekiDekunuts_SetupWaitForSpawn(this);
this->waitTimer = 0;
} else {
this->unk_1DA++;
this->waitTimer++;
}
}
void func_80A2C4D0(EnSyatekiDekunuts* this, PlayState* play) {
static Vec3f D_80A2CBA0 = { 0.0f, 20.0f, 0.0f };
static Vec3f D_80A2CBAC = { 0.0f, 0.0f, 0.0f };
void EnSyatekiDekunuts_SetupDead(EnSyatekiDekunuts* this, PlayState* play) {
static Vec3f sVelocity = { 0.0f, 20.0f, 0.0f };
static Vec3f sAccel = { 0.0f, 0.0f, 0.0f };
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if (EN_SYATEKI_DEKUNUTS_GET_PARAM_F(&this->actor) == 1) {
EffectSsExtra_Spawn(play, &this->actor.world.pos, &D_80A2CBA0, &D_80A2CBAC, 5, 2);
if (EN_SYATEKI_DEKUNUTS_GET_TYPE(&this->actor) == EN_SYATEKI_DEKUNUTS_TYPE_BONUS) {
EffectSsExtra_Spawn(play, &this->actor.world.pos, &sVelocity, &sAccel, 5, 2);
syatekiMan->score += 100;
syatekiMan->perGameVar2.bonusDekuScrubHitCounter++;
} else {
EffectSsExtra_Spawn(play, &this->actor.world.pos, &D_80A2CBA0, &D_80A2CBAC, 5, 0);
EffectSsExtra_Spawn(play, &this->actor.world.pos, &sVelocity, &sAccel, 5, 0);
syatekiMan->score += 30;
syatekiMan->dekuScrubHitCounter++;
}
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DAMAGE);
this->unk_1E2 = 0;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 4);
this->unk_1D8 = 160;
this->actionFunc = func_80A2C5DC;
this->isAlive = false;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_SYATEKI_DEKUNUTS_ANIM_DAMAGE);
this->timer = 160;
this->actionFunc = EnSyatekiDekunuts_Dead;
}
void func_80A2C5DC(EnSyatekiDekunuts* this, PlayState* play) {
static Color_RGBA8 D_80A2CBB8 = { 255, 255, 255, 255 };
static Color_RGBA8 D_80A2CBBC = { 150, 150, 150, 0 };
void EnSyatekiDekunuts_Dead(EnSyatekiDekunuts* this, PlayState* play) {
static Color_RGBA8 sPrimColor = { 255, 255, 255, 255 };
static Color_RGBA8 sEnvColor = { 150, 150, 150, 0 };
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
if (this->unk_1D8 == 160) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 5);
if (this->timer == 160) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_SYATEKI_DEKUNUTS_ANIM_DIE);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_DEAD);
this->unk_1D8--;
} else if (this->unk_1D8 < 160) {
Vec3f sp40;
this->timer--;
} else if (this->timer < 160) {
Vec3f pos;
sp40.x = this->actor.world.pos.x;
sp40.y = this->actor.world.pos.y + 18.0f;
sp40.z = this->actor.world.pos.z;
EffectSsDeadDb_Spawn(play, &sp40, &gZeroVec3f, &gZeroVec3f, &D_80A2CBB8, &D_80A2CBBC, 200, 0, 13);
pos.x = this->actor.world.pos.x;
pos.y = this->actor.world.pos.y + 18.0f;
pos.z = this->actor.world.pos.z;
EffectSsDeadDb_Spawn(play, &pos, &gZeroVec3f, &gZeroVec3f, &sPrimColor, &sEnvColor, 200, 0, 13);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 30, NA_SE_EN_EXTINCT);
sp40.y = this->actor.world.pos.y + 10.0f;
EffectSsHahen_SpawnBurst(play, &sp40, 3.0f, 0, 12, 3, 15, HAHEN_OBJECT_DEFAULT, 10, NULL);
pos.y = this->actor.world.pos.y + 10.0f;
EffectSsHahen_SpawnBurst(play, &pos, 3.0f, 0, 12, 3, 15, HAHEN_OBJECT_DEFAULT, 10, NULL);
if (EN_SYATEKI_DEKUNUTS_GET_PARAM_F(&this->actor) != 1) {
syatekiMan->dekuScrubFlags &= ~(1 << this->unk_1E8);
if (EN_SYATEKI_DEKUNUTS_GET_TYPE(&this->actor) != EN_SYATEKI_DEKUNUTS_TYPE_BONUS) {
syatekiMan->dekuScrubFlags &= ~(1 << this->index);
}
func_80A2BE54(this);
EnSyatekiDekunuts_SetupWaitForSpawn(this);
}
} else if (this->unk_1D8 < 160) {
this->unk_1D8--;
} else if (this->timer < 160) {
this->timer--;
}
}
@ -374,16 +424,17 @@ void EnSyatekiDekunuts_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if ((this->actionFunc != func_80A2BF18) && (this->unk_1D8 < this->unk_1EE) && (this->unk_1D8 > 10)) {
if ((this->collider.base.acFlags & AC_HIT) && (this->unk_1E2 == 1)) {
if (EN_SYATEKI_DEKUNUTS_GET_PARAM_F(&this->actor) == 1) {
if ((this->actionFunc != EnSyatekiDekunuts_WaitForSpawn) && (this->timer < this->timeToBurrow) &&
(this->timer > 10)) {
if ((this->collider.base.acFlags & AC_HIT) && (this->isAlive == true)) {
if (EN_SYATEKI_DEKUNUTS_GET_TYPE(&this->actor) == EN_SYATEKI_DEKUNUTS_TYPE_BONUS) {
Audio_PlayFanfare(NA_BGM_GET_ITEM | 0x900);
} else {
play_sound(NA_SE_SY_TRE_BOX_APPEAR);
}
this->collider.base.acFlags &= ~AC_HIT;
func_80A2C4D0(this, play);
EnSyatekiDekunuts_SetupDead(this, play);
}
Collider_UpdateCylinder(&this->actor, &this->collider);
@ -399,8 +450,9 @@ s32 EnSyatekiDekunuts_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dLi
Actor* thisx) {
EnSyatekiDekunuts* this = THIS;
if ((limbIndex == DEKU_SCRUB_LIMB_HEADDRESS) && (this->unk_1F0 == 1)) {
rot->z += this->unk_1F2;
if ((limbIndex == DEKU_SCRUB_LIMB_HEADDRESS) &&
(this->headdressType == EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_FLIPPED_UP)) {
rot->z += this->headdressRotZ;
}
return false;
@ -408,24 +460,24 @@ s32 EnSyatekiDekunuts_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dLi
void EnSyatekiDekunuts_Draw(Actor* thisx, PlayState* play) {
EnSyatekiDekunuts* this = THIS;
Vec3f temp_f20;
Vec3f flowerPos;
s32 i;
if (this->actionFunc != func_80A2BF18) {
if (this->actionFunc != EnSyatekiDekunuts_WaitForSpawn) {
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
EnSyatekiDekunuts_OverrideLimbDraw, NULL, &this->actor);
}
if (this->unk_1EC == 1) {
for (i = 0; i < this->unk_1EA; i++) {
temp_f20.x = this->unk_1E4[i].x;
temp_f20.y = this->unk_1E4[i].y;
temp_f20.z = this->unk_1E4[i].z;
if (this->shouldDrawFlowers == true) {
for (i = 0; i < this->flowerCount; i++) {
flowerPos.x = this->flowerPos[i].x;
flowerPos.y = this->flowerPos[i].y;
flowerPos.z = this->flowerPos[i].z;
OPEN_DISPS(play->state.gfxCtx);
func_8012C28C(play->state.gfxCtx);
Matrix_Translate(temp_f20.x, temp_f20.y, temp_f20.z, MTXMODE_NEW);
Matrix_Translate(flowerPos.x, flowerPos.y, flowerPos.z, MTXMODE_NEW);
Matrix_Scale(0.02f, 0.02f, 0.02f, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gDekuScrubFlowerDL);

View File

@ -4,10 +4,15 @@
#include "global.h"
#include "objects/object_dekunuts/object_dekunuts.h"
#define EN_SYATEKI_DEKUNUTS_GET_PARAM_F(thisx) ((thisx)->params & 0xF)
#define EN_SYATEKI_DEKUNUTS_GET_NUMBER(thisx) (((thisx)->params & 0xF0) >> 4)
#define EN_SYATEKI_DEKUNUTS_GET_TYPE(thisx) ((thisx)->params & 0xF)
#define EN_SYATEKI_DEKUNUTS_GET_INDEX(thisx) (((thisx)->params & 0xF0) >> 4)
#define EN_SYATEKI_DEKUNUTS_GET_PARAM_FF00(thisx) (((thisx)->params & 0xFF00) >> 8)
#define EN_SYATEKI_DEKUNUTS_PARAMS(unkFF00, number, unkF) (((unkFF00 << 8) & 0xFF00) | ((number << 4) & 0xF0) | (unkF & 0xF))
#define EN_SYATEKI_DEKUNUTS_PARAMS(unkFF00, index, type) (((unkFF00 << 8) & 0xFF00) | ((index << 4) & 0xF0) | (type & 0xF))
typedef enum {
/* 0 */ EN_SYATEKI_DEKUNUTS_TYPE_NORMAL, // Worth 30 points
/* 1 */ EN_SYATEKI_DEKUNUTS_TYPE_BONUS, // Worth 100 points
} EnSyatekiDekunutsType;
struct EnSyatekiDekunuts;
@ -18,18 +23,18 @@ typedef struct EnSyatekiDekunuts {
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnSyatekiDekunutsActionFunc actionFunc;
/* 0x18C */ ColliderCylinder collider;
/* 0x1D8 */ s16 unk_1D8;
/* 0x1DA */ s16 unk_1DA;
/* 0x1CD */ s16 unk_1DC;
/* 0x1D8 */ s16 timer;
/* 0x1DA */ s16 waitTimer;
/* 0x1CD */ s16 unk_1DC; // Initialized, but never used
/* 0x1DE */ UNK_TYPE1 unk_1DE[0x4];
/* 0x1E2 */ s16 unk_1E2;
/* 0x1E4 */ Vec3s* unk_1E4;
/* 0x1E8 */ s16 unk_1E8;
/* 0x1EA */ s16 unk_1EA;
/* 0x1EC */ s16 unk_1EC;
/* 0x1EE */ s16 unk_1EE;
/* 0x1F0 */ s16 unk_1F0;
/* 0x1F2 */ s16 unk_1F2;
/* 0x1E2 */ s16 isAlive;
/* 0x1E4 */ Vec3s* flowerPos;
/* 0x1E8 */ s16 index;
/* 0x1EA */ s16 flowerCount;
/* 0x1EC */ s16 shouldDrawFlowers;
/* 0x1EE */ s16 timeToBurrow;
/* 0x1F0 */ s16 headdressType;
/* 0x1F2 */ s16 headdressRotZ;
/* 0x1F4 */ Vec3s jointTable[DEKU_SCRUB_LIMB_MAX];
/* 0x230 */ Vec3s morphTable[DEKU_SCRUB_LIMB_MAX];
/* 0x26C */ UNK_TYPE1 unk_26C[0x4];

View File

@ -103,13 +103,20 @@ typedef struct {
static SwampTargetActorEntry sNormalSwampTargetActorList[] = {
{ ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_WF_PARAMS(1, 3, 0) },
{ ACTOR_EN_SYATEKI_WF, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_WF_PARAMS(0, 2, 0) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 0, 0) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 1, 0) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 2, 0) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 3, 0) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 4, 0) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 0, 1) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 1, 1) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
EN_SYATEKI_DEKUNUTS_PARAMS(0, 0, EN_SYATEKI_DEKUNUTS_TYPE_NORMAL) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
EN_SYATEKI_DEKUNUTS_PARAMS(0, 1, EN_SYATEKI_DEKUNUTS_TYPE_NORMAL) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
EN_SYATEKI_DEKUNUTS_PARAMS(0, 2, EN_SYATEKI_DEKUNUTS_TYPE_NORMAL) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
EN_SYATEKI_DEKUNUTS_PARAMS(0, 3, EN_SYATEKI_DEKUNUTS_TYPE_NORMAL) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
EN_SYATEKI_DEKUNUTS_PARAMS(0, 4, EN_SYATEKI_DEKUNUTS_TYPE_NORMAL) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
EN_SYATEKI_DEKUNUTS_PARAMS(0, 0, EN_SYATEKI_DEKUNUTS_TYPE_BONUS) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
EN_SYATEKI_DEKUNUTS_PARAMS(0, 1, EN_SYATEKI_DEKUNUTS_TYPE_BONUS) },
{ ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(0, 0, 0) },
{ ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(1, 0, 0) },
{ ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(2, 0, 0) },
@ -129,8 +136,10 @@ static SwampTargetActorEntry sNormalSwampTargetActorList[] = {
static SwampTargetActorEntry sUnusedSwampTargetActorList[] = {
{ ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(0, 0, 0) },
{ ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(1, 0, 0) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 0, 1) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_DEKUNUTS_PARAMS(0, 1, 1) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
EN_SYATEKI_DEKUNUTS_PARAMS(0, 0, EN_SYATEKI_DEKUNUTS_TYPE_BONUS) },
{ ACTOR_EN_SYATEKI_DEKUNUTS, -1000.0f, 200.0f, -700.0f,
EN_SYATEKI_DEKUNUTS_PARAMS(0, 1, EN_SYATEKI_DEKUNUTS_TYPE_BONUS) },
{ ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(2, 0, 2) },
{ ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(3, 0, 2) },
{ ACTOR_EN_SYATEKI_CROW, -1000.0f, 200.0f, -700.0f, EN_SYATEKI_CROW_PARAMS(0, 0, 3) },

View File

@ -151,7 +151,7 @@ void EnSyatekiWf_Init(Actor* thisx, PlayState* play) {
path = &play->setupPathList[path->unk1];
}
for (i = 0; i < EN_SYATEKI_WF_GET_NUMBER(&this->actor); i++) {
for (i = 0; i < EN_SYATEKI_WF_GET_INDEX(&this->actor); i++) {
path = &play->setupPathList[path->unk1];
}
@ -224,7 +224,7 @@ void func_80A201CC(EnSyatekiWf* this) {
this->actor.draw = NULL;
this->unk_2A4 = 1;
this->unk_298 = 0;
syatekiMan->wolfosFlags &= ~(1 << EN_SYATEKI_WF_GET_NUMBER(&this->actor));
syatekiMan->wolfosFlags &= ~(1 << EN_SYATEKI_WF_GET_INDEX(&this->actor));
this->actionFunc = func_80A20284;
}
@ -236,7 +236,7 @@ void func_80A20284(EnSyatekiWf* this, PlayState* play) {
if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->unk_298 == 1)) {
func_80A200E0(this);
func_80A2030C(this);
} else if (syatekiMan->wolfosFlags & (1 << EN_SYATEKI_WF_GET_NUMBER(&this->actor))) {
} else if (syatekiMan->wolfosFlags & (1 << EN_SYATEKI_WF_GET_INDEX(&this->actor))) {
this->unk_298 = 1;
}
}

View File

@ -5,8 +5,8 @@
#include "objects/object_wf/object_wf.h"
#define EN_SYATEKI_WF_GET_PARAM_F0(thisx) (((thisx)->params & 0xF0) >> 4)
#define EN_SYATEKI_WF_GET_NUMBER(thisx) (((thisx)->params & 0xFF00) >> 8)
#define EN_SYATEKI_WF_PARAMS(number, unkF0, unused) (((number << 8) & 0xFF00) | ((unkF0 << 4) & 0xF0) | (unused & 0xF))
#define EN_SYATEKI_WF_GET_INDEX(thisx) (((thisx)->params & 0xFF00) >> 8)
#define EN_SYATEKI_WF_PARAMS(index, unkF0, unused) (((index << 8) & 0xFF00) | ((unkF0 << 4) & 0xF0) | (unused & 0xF))
struct EnSyatekiWf;

View File

@ -10063,23 +10063,23 @@
0x80A2B390:("BgDblueMovebg_Draw",),
0x80A2BC00:("EnSyatekiDekunuts_Init",),
0x80A2BE28:("EnSyatekiDekunuts_Destroy",),
0x80A2BE54:("func_80A2BE54",),
0x80A2BF18:("func_80A2BF18",),
0x80A2BFC4:("func_80A2BFC4",),
0x80A2C0F8:("func_80A2C0F8",),
0x80A2C150:("func_80A2C150",),
0x80A2C168:("func_80A2C168",),
0x80A2C1AC:("func_80A2C1AC",),
0x80A2C208:("func_80A2C208",),
0x80A2C27C:("func_80A2C27C",),
0x80A2C2E0:("func_80A2C2E0",),
0x80A2C33C:("func_80A2C33C",),
0x80A2C3AC:("func_80A2C3AC",),
0x80A2C3F0:("func_80A2C3F0",),
0x80A2C478:("func_80A2C478",),
0x80A2C48C:("func_80A2C48C",),
0x80A2C4D0:("func_80A2C4D0",),
0x80A2C5DC:("func_80A2C5DC",),
0x80A2BE54:("EnSyatekiDekunuts_SetupWaitForSpawn",),
0x80A2BF18:("EnSyatekiDekunuts_WaitForSpawn",),
0x80A2BFC4:("EnSyatekiDekunuts_SetupSpawn",),
0x80A2C0F8:("EnSyatekiDekunuts_Spawn",),
0x80A2C150:("EnSyatekiDekunuts_SetupWaitToEmerge",),
0x80A2C168:("EnSyatekiDekunuts_WaitToEmerge",),
0x80A2C1AC:("EnSyatekiDekunuts_SetupEmerge",),
0x80A2C208:("EnSyatekiDekunuts_Emerge",),
0x80A2C27C:("EnSyatekiDekunuts_SetupLookAround",),
0x80A2C2E0:("EnSyatekiDekunuts_LookAround",),
0x80A2C33C:("EnSyatekiDekunuts_BonusLookAround",),
0x80A2C3AC:("EnSyatekiDekunuts_SetupBurrow",),
0x80A2C3F0:("EnSyatekiDekunuts_Burrow",),
0x80A2C478:("EnSyatekiDekunuts_SetupGameEnd",),
0x80A2C48C:("EnSyatekiDekunuts_GameEnd",),
0x80A2C4D0:("EnSyatekiDekunuts_SetupDead",),
0x80A2C5DC:("EnSyatekiDekunuts_Dead",),
0x80A2C78C:("EnSyatekiDekunuts_Update",),
0x80A2C8A0:("EnSyatekiDekunuts_OverrideLimbDraw",),
0x80A2C8E8:("EnSyatekiDekunuts_Draw",),

View File

@ -11112,15 +11112,15 @@
0x80A2BBF4:("D_80A2BBF4","UNK_TYPE1","",0x1),
0x80A2BBF5:("D_80A2BBF5","UNK_TYPE1","",0x1),
0x80A2CA90:("En_Syateki_Dekunuts_InitVars","UNK_TYPE1","",0x1),
0x80A2CAB0:("D_80A2CAB0","UNK_TYPE1","",0x1),
0x80A2CADC:("D_80A2CADC","UNK_TYPE4","",0x4),
0x80A2CAE8:("D_80A2CAE8","UNK_PTR","",0x4),
0x80A2CB90:("D_80A2CB90","UNK_TYPE1","",0x1),
0x80A2CB9C:("D_80A2CB9C","UNK_TYPE4","",0x4),
0x80A2CBA0:("D_80A2CBA0","UNK_TYPE1","",0x1),
0x80A2CBAC:("D_80A2CBAC","UNK_TYPE1","",0x1),
0x80A2CBB8:("D_80A2CBB8","UNK_TYPE1","",0x1),
0x80A2CBBC:("D_80A2CBBC","UNK_TYPE1","",0x1),
0x80A2CAB0:("sCylinderInit","UNK_TYPE1","",0x1),
0x80A2CADC:("sBonusDekuScrubColliderDimensions","UNK_TYPE4","",0x4),
0x80A2CAE8:("sAnimationInfo","UNK_PTR","",0x4),
0x80A2CB90:("sInitChain","UNK_TYPE1","",0x1),
0x80A2CB9C:("sDrawFlowers","UNK_TYPE4","",0x4),
0x80A2CBA0:("sVelocity","UNK_TYPE1","",0x1),
0x80A2CBAC:("sAccel","UNK_TYPE1","",0x1),
0x80A2CBB8:("sPrimColor","UNK_TYPE1","",0x1),
0x80A2CBBC:("sEnvColor","UNK_TYPE1","",0x1),
0x80A2CBC0:("D_80A2CBC0","f32","",0x4),
0x80A2D1C0:("Elf_Msg3_InitVars","UNK_TYPE1","",0x1),
0x80A2D1E0:("D_80A2D1E0","UNK_TYPE1","",0x1),