En_kusa OK and Documented (#640)

* matched one function

* More matches

* more matches

* cleaning up some stuff

* making some progress

* two new matches, and a partial match

* meh...i'll come back to this

* fixing ctx names

* more matches

* OK and documented

* fixing data stuff

* PR suggestions

* fixing name and DL issues

* fixing pr suggestions

* PR feedback

* ....format....

* PR fix

* fixes

* dang format

* fixing name

* I'm blind

* fixing obj_grass
This commit is contained in:
Parker Burnett 2022-03-25 22:10:25 -04:00 committed by GitHub
parent 2746266881
commit 9362fee5e8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 729 additions and 107 deletions

View File

@ -40,8 +40,8 @@
<DList Name="gameplay_field_keep_DL_006760" Offset="0x6760" />
<Texture Name="gameplay_field_keep_Tex_006810" OutName="tex_006810" Format="rgba16" Width="32" Height="32" Offset="0x6810" />
<Texture Name="gameplay_field_keep_Tex_007010" OutName="tex_007010" Format="rgba16" Width="32" Height="32" Offset="0x7010" />
<DList Name="gameplay_field_keep_DL_0078A0" Offset="0x78A0" />
<DList Name="gameplay_field_keep_DL_007938" Offset="0x7938" />
<DList Name="gKusaBushType1" Offset="0x78A0" />
<DList Name="gKusaBushType2" Offset="0x7938" />
<Texture Name="gameplay_field_keep_Tex_0079D0" OutName="tex_0079D0" Format="i8" Width="64" Height="32" Offset="0x79D0" />
<Texture Name="gameplay_field_keep_Tex_0081D0" OutName="tex_0081D0" Format="ia8" Width="64" Height="32" Offset="0x81D0" />
<DList Name="gameplay_field_keep_DL_0089D0" Offset="0x89D0" />

View File

@ -1172,8 +1172,8 @@
<Limb Name="gameplay_keep_Standardlimb_05272C" Type="Standard" Offset="0x5272C" />
<Limb Name="gameplay_keep_Standardlimb_052738" Type="Standard" Offset="0x52738" />
<Skeleton Name="gameplay_keep_Skel_0527A0" Type="Normal" LimbType="Standard" Offset="0x527A0" />
<DList Name="gameplay_keep_DL_0527F0" Offset="0x527F0" />
<DList Name="gameplay_keep_DL_0528B0" Offset="0x528B0" />
<DList Name="gKakeraLeafMiddle" Offset="0x527F0" />
<DList Name="gKakeraLeafTip" Offset="0x528B0" />
<Texture Name="gameplay_keep_Tex_052940" OutName="tex_052940" Format="rgba16" Width="32" Height="32" Offset="0x52940" />
<Texture Name="gameplay_keep_Tex_053140" OutName="tex_053140" Format="rgba16" Width="32" Height="32" Offset="0x53140" />
<Texture Name="gameplay_keep_Tex_053940" OutName="tex_053940" Format="i4" Width="64" Height="64" Offset="0x53940" />

View File

@ -1,6 +1,6 @@
<Root>
<File Name="object_kusa" Segment="6">
<DList Name="object_kusa_DL_000140" Offset="0x140" />
<DList Name="object_kusa_DL_0002E0" Offset="0x2E0" />
<DList Name="gKusaSprout" Offset="0x140" />
<DList Name="gKusaStump" Offset="0x2E0" />
</File>
</Root>

4
spec
View File

@ -1469,9 +1469,7 @@ beginseg
name "ovl_En_Kusa"
compress
include "build/src/overlays/actors/ovl_En_Kusa/z_en_kusa.o"
include "build/data/ovl_En_Kusa/ovl_En_Kusa.data.o"
include "build/data/ovl_En_Kusa/ovl_En_Kusa.bss.o"
include "build/data/ovl_En_Kusa/ovl_En_Kusa.reloc.o"
include "build/src/overlays/actors/ovl_En_Kusa/ovl_En_Kusa_reloc.o"
endseg
beginseg

View File

@ -5,6 +5,9 @@
*/
#include "z_en_kusa.h"
#include "objects/object_kusa/object_kusa.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/gameplay_field_keep/gameplay_field_keep.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_800000)
@ -14,15 +17,46 @@ void EnKusa_Init(Actor* thisx, GlobalContext* globalCtx);
void EnKusa_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnKusa_Update(Actor* thisx, GlobalContext* globalCtx);
void func_809358D8(EnKusa* this, GlobalContext* globalCtx);
void func_809359AC(EnKusa* this, GlobalContext* globalCtx);
void func_80935BBC(EnKusa* this, GlobalContext* globalCtx);
void func_80935D64(EnKusa* this, GlobalContext* globalCtx);
void func_809361A4(EnKusa* this, GlobalContext* globalCtx);
void func_80936220(EnKusa* this, GlobalContext* globalCtx);
void func_809362D8(EnKusa* this, GlobalContext* globalCtx);
s32 EnKusa_SnapToFloor(EnKusa* this, GlobalContext* globalCtx, f32 yOffset);
void EnKusa_DropCollectible(EnKusa* this, GlobalContext* globalCtx);
void EnKusa_UpdateVelY(EnKusa* this);
void EnKusa_RandScaleVecToZero(Vec3f* vec, f32 scaleFactor);
void EnKusa_SetScaleSmall(EnKusa* this);
s32 EnKusa_GetWaterBox(EnKusa* this, GlobalContext* globalCtx);
void EnKusa_SetupWaitObject(EnKusa* this);
void EnKusa_WaitObject(EnKusa* this, GlobalContext* globalCtx);
void EnKusa_WaitForInteract(EnKusa* this, GlobalContext* globalCtx);
void EnKusa_SetupLiftedUp(EnKusa* this);
void EnKusa_LiftedUp(EnKusa* this, GlobalContext* globalCtx);
void EnKusa_WaitObject(EnKusa* this, GlobalContext* globalCtx);
void EnKusa_SetupInteract(EnKusa* this);
void EnKusa_SetupFall(EnKusa* this);
void EnKusa_Fall(EnKusa* this, GlobalContext* globalCtx);
void EnKusa_SetupCut(EnKusa* this);
void EnKusa_CutWaitRegrow(EnKusa* this, GlobalContext* globalCtx);
void EnKusa_DoNothing(EnKusa* this, GlobalContext* globalCtx);
void EnKusa_SetupUprootedWaitRegrow(EnKusa* this);
void EnKusa_UprootedWaitRegrow(EnKusa* this, GlobalContext* globalCtx);
void EnKusa_SetupRegrow(EnKusa* this);
void EnKusa_Regrow(EnKusa* this, GlobalContext* globalCtx);
void EnKusa_DrawBush(Actor* thisx, GlobalContext* globalCtx2);
void EnKusa_DrawGrass(Actor* thisx, GlobalContext* globalCtx);
s16 rotSpeedXtarget = 0;
s16 rotSpeedX = 0;
s16 rotSpeedYtarget = 0;
s16 rotSpeedY = 0;
s16 D_809366B0 = 0;
u8 D_809366B4 = true;
u32 kusaGameplayFrames;
MtxF D_80936AD8[8];
s16 D_80936CD8;
s16 D_80936CDA;
s16 D_80936CDC;
s16 D_80936CDE;
s16 D_80936CE0;
#if 0
const ActorInit En_Kusa_InitVars = {
ACTOR_EN_KUSA,
ACTORCAT_PROP,
@ -35,18 +69,40 @@ const ActorInit En_Kusa_InitVars = {
(ActorFunc)NULL,
};
// static ColliderCylinderInit sCylinderInit = {
static ColliderCylinderInit D_809366E0 = {
{ COLTYPE_NONE, AT_ON | AT_TYPE_PLAYER, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_PLAYER | OC1_TYPE_2, OC2_TYPE_2, COLSHAPE_CYLINDER, },
{ ELEMTYPE_UNK0, { 0x00400000, 0x00, 0x02 }, { 0x0580C71C, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NONE, BUMP_ON, OCELEM_ON, },
static s16 objectIds[] = { GAMEPLAY_FIELD_KEEP, OBJECT_KUSA, OBJECT_KUSA, OBJECT_KUSA };
static ColliderCylinderInit sCylinderInit = {
{
COLTYPE_NONE,
AT_ON | AT_TYPE_PLAYER,
AC_ON | AC_TYPE_PLAYER,
OC1_ON | OC1_TYPE_PLAYER | OC1_TYPE_2,
OC2_TYPE_2,
COLSHAPE_CYLINDER,
},
{
ELEMTYPE_UNK0,
{ 0x00400000, 0x00, 0x02 },
{ 0x0580C71C, 0x00, 0x00 },
TOUCH_ON | TOUCH_SFX_NONE,
BUMP_ON,
OCELEM_ON,
},
{ 6, 44, 0, { 0, 0, 0 } },
};
// sColChkInfoInit
static CollisionCheckInfoInit D_8093670C = { 0, 12, 30, MASS_IMMOVABLE };
static CollisionCheckInfoInit sColChkInfoInit = { 0, 12, 30, MASS_IMMOVABLE };
// static InitChainEntry sInitChain[] = {
static InitChainEntry D_80936754[] = {
static Vec3f sUnitDirections[] = {
{ 0.0f, 0.7071f, 0.7071f },
{ 0.7071f, 0.7071f, 0.0f },
{ 0.0f, 0.7071f, -0.7071f },
{ -0.7071f, 0.7071f, 0.0f },
};
static s16 sFragmentScales[] = { 108, 102, 96, 84, 66, 55, 42, 38 };
static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 400, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -3200, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(terminalVelocity, -17000, ICHAIN_CONTINUE),
@ -55,72 +111,623 @@ static InitChainEntry D_80936754[] = {
ICHAIN_F32(uncullZoneDownward, 200, ICHAIN_STOP),
};
#endif
/**
* @brief Applies a "swaying" motion to the provided matrix
*
*/
void EnKusa_ApplySway(MtxF* matrix) {
MtxF* mtxState = Matrix_GetCurrentState();
f32* tmp = &mtxState->mf[0][0];
f32* tmp2 = &matrix->mf[0][0];
s32 i;
extern ColliderCylinderInit D_809366E0;
extern CollisionCheckInfoInit D_8093670C;
extern InitChainEntry D_80936754[];
for (i = 0; i < 16; i++) {
*tmp++ += *tmp2++;
}
}
extern UNK_TYPE D_060002E0;
/**
* @brief Updates the matrix controlling movement of the leaves of grass to simulate a swaying motion from the wind
* blowing.
*/
void EnKusa_Sway(void) {
s32 i;
s32 pad;
f32 sin_6CDA;
f32* ptr;
f32 sin_6CDE;
f32 sin_6CE0;
f32 tempf1;
f32 tempf2;
f32 tempf3;
f32 tempf4;
f32 tempf5;
f32 sp7C[8];
f32 cos_6CE0;
f32 cos_6CDA;
f32 cos_6CDC;
f32 cos_6CDE;
f32 cos_6CD8;
f32 sin_6CD8;
f32 sin_6CDC;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_809349E0.s")
D_80936CD8 += 0x46;
D_80936CDA += 0x12C;
D_80936CDC += 0x2BC;
D_80936CDE += 0x514;
D_80936CE0 += 0x22C4;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_80934AB4.s")
sin_6CD8 = Math_SinS(D_80936CD8);
sin_6CDA = Math_SinS(D_80936CDA);
sin_6CDC = Math_SinS(D_80936CDC);
sin_6CDE = Math_SinS(D_80936CDE) * 1.2f;
sin_6CE0 = Math_SinS(D_80936CE0) * 1.5f;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_80934F58.s")
cos_6CD8 = Math_CosS(D_80936CD8);
cos_6CDA = Math_CosS(D_80936CDA);
cos_6CDC = Math_CosS(D_80936CDC);
cos_6CDE = Math_CosS(D_80936CDE) * 1.3f;
cos_6CE0 = Math_CosS(D_80936CE0) * 1.7f;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_80934FFC.s")
sp7C[0] = (sin_6CD8 - cos_6CDA) * sin_6CDC * cos_6CD8 * sin_6CD8 * 0.0015f;
sp7C[1] = (sin_6CDA - cos_6CDC) * sin_6CDE * cos_6CDA * sin_6CD8 * 0.0015f;
sp7C[2] = (sin_6CDC - cos_6CDE) * cos_6CDC * sin_6CD8 * cos_6CD8 * 0.0015f;
sp7C[3] = (sin_6CDE - cos_6CDA) * cos_6CDE * sin_6CDA * cos_6CD8 * 0.0015f;
sp7C[4] = (sin_6CD8 - cos_6CDC) * sin_6CD8 * sin_6CDA * sin_6CE0 * 0.0015f;
sp7C[5] = (sin_6CDA - cos_6CDE) * sin_6CDC * sin_6CDE * sin_6CE0 * 0.0015f;
sp7C[6] = (sin_6CDC - cos_6CD8) * cos_6CD8 * cos_6CDA * cos_6CE0 * 0.0015f;
sp7C[7] = (sin_6CDE - cos_6CDA) * cos_6CDC * cos_6CDE * cos_6CE0 * 0.0015f;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_809350C4.s")
for (i = 0; i < ARRAY_COUNT(D_80936AD8); i++) {
ptr = &D_80936AD8[i].mf[0][0];
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_809350F8.s")
tempf1 = sp7C[i & 7];
tempf2 = sp7C[(i + 1) & 7];
tempf3 = sp7C[(i + 2) & 7];
tempf4 = sp7C[(i + 3) & 7];
tempf5 = sp7C[(i + 4) & 7];
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_8093517C.s")
ptr[0] = sp7C[1] * 0.2f;
ptr[1] = tempf1;
ptr[2] = tempf2;
ptr[3] = 0.0f;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_809351A0.s")
ptr[4] = tempf3;
ptr[5] = sp7C[0];
ptr[6] = tempf3;
ptr[7] = 0.0f;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_809354F8.s")
ptr[8] = tempf4;
ptr[9] = tempf5;
ptr[10] = sp7C[3] * 0.2f;
ptr[11] = 0.0f;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_809355A4.s")
ptr[12] = 0.0f;
ptr[13] = 0.0f;
ptr[14] = 0.0f;
ptr[15] = 0.0f;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_8093561C.s")
/**
* @brief Detects if a bush is able to snap to the floor. BgCheck_EntityRaycastFloor5 will give the intersect point
* if no poit is found, a false value is returned.
*
* @param this
* @param globalCtx
* @param yOffset offset of Y coordinate, can be positive or negative.
* @return true/false if the bush is able to snap to the floor and is above BGCHECK_Y_MIN
*/
s32 EnKusa_SnapToFloor(EnKusa* this, GlobalContext* globalCtx, f32 yOffset) {
s32 pad;
CollisionPoly* poly;
Vec3f pos;
s32 bgId;
f32 floorY;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/EnKusa_Init.s")
pos.x = this->actor.world.pos.x;
pos.y = this->actor.world.pos.y + 30.0f;
pos.z = this->actor.world.pos.z;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/EnKusa_Destroy.s")
floorY = BgCheck_EntityRaycastFloor5(&globalCtx->colCtx, &poly, &bgId, &this->actor, &pos);
if (floorY > BGCHECK_Y_MIN) {
this->actor.world.pos.y = floorY + yOffset;
Math_Vec3f_Copy(&this->actor.home.pos, &this->actor.world.pos);
return true;
} else {
return false;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_809358C4.s")
void EnKusa_DropCollectible(EnKusa* this, GlobalContext* globalCtx) {
s32 collectible;
s32 collectableParams;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_809358D8.s")
if ((GET_KUSA_TYPE(&this->actor) == ENKUSA_TYPE_GRASS) || (GET_KUSA_TYPE(&this->actor) == ENKUSA_TYPE_BUSH)) {
if (!(KUSA_GET_PARAMS_0C(&this->actor))) {
Item_DropCollectibleRandom(globalCtx, NULL, &this->actor.world.pos,
KUSA_GET_RAND_COLLECTIBLE_ID(&this->actor) * 0x10);
}
} else if (GET_KUSA_TYPE(&this->actor) == ENKUSA_TYPE_REGROWING_GRASS) {
Item_DropCollectible(globalCtx, &this->actor.world.pos, 3);
} else {
collectible = func_800A8150(KUSA_GET_PARAMS_3F(&this->actor));
if (collectible >= 0) {
collectableParams = KUSA_GET_COLLECTIBLE_ID(&this->actor);
Item_DropCollectible(globalCtx, &this->actor.world.pos, (collectableParams << 8) | collectible);
}
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_80935988.s")
void EnKusa_UpdateVelY(EnKusa* this) {
this->actor.velocity.y += this->actor.gravity;
if (this->actor.velocity.y < this->actor.terminalVelocity) {
this->actor.velocity.y = this->actor.terminalVelocity;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_809359AC.s")
/**
* @brief Scales a vector down by provided scale factor
*
* @param vec vector to be scaled
* @param scaleFactor scale factor to be applied to vector
*/
void EnKusa_RandScaleVecToZero(Vec3f* vec, f32 scaleFactor) {
scaleFactor += ((Rand_ZeroOne() * 0.2f) - 0.1f) * scaleFactor;
vec->x -= vec->x * scaleFactor;
vec->y -= vec->y * scaleFactor;
vec->z -= vec->z * scaleFactor;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_80935B94.s")
void EnKusa_SetScaleSmall(EnKusa* this) {
this->actor.scale.y = 160.0f * 0.001f;
this->actor.scale.x = 120.0f * 0.001f;
this->actor.scale.z = 120.0f * 0.001f;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_80935BBC.s")
void EnKusa_SpawnFragments(EnKusa* this, GlobalContext* globalCtx) {
Vec3f velocity;
Vec3f pos;
s32 i;
s32 scaleIndex;
Vec3f* directon;
s32 pad;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_80935CE8.s")
for (i = 0; i < ARRAY_COUNT(sUnitDirections); i++) {
directon = &sUnitDirections[i];
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_80935D64.s")
pos.x = this->actor.world.pos.x + (directon->x * this->actor.scale.x * 20.0f);
pos.y = this->actor.world.pos.y + (directon->y * this->actor.scale.y * 20.0f) + 10.0f;
pos.z = this->actor.world.pos.z + (directon->z * this->actor.scale.z * 20.0f);
velocity.x = (Rand_ZeroOne() - 0.5f) * 8.0f;
velocity.y = Rand_ZeroOne() * 10.0f;
velocity.z = (Rand_ZeroOne() - 0.5f) * 8.0f;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_80936120.s")
scaleIndex = (s32)(Rand_ZeroOne() * 111.1f) & 7;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_80936168.s")
EffectSsKakera_Spawn(globalCtx, &pos, &velocity, &pos, -100, 64, 40, 3, 0, sFragmentScales[scaleIndex], 0, 0,
0x50, -1, 1, gKakeraLeafMiddle);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_809361A4.s")
pos.x = this->actor.world.pos.x + (directon->x * this->actor.scale.x * 40.0f);
pos.y = this->actor.world.pos.y + (directon->y * this->actor.scale.y * 40.0f) + 10.0f;
pos.z = this->actor.world.pos.z + (directon->z * this->actor.scale.z * 40.0f);
velocity.x = (Rand_ZeroOne() - 0.5f) * 6.0f;
velocity.y = Rand_ZeroOne() * 10.0f;
velocity.z = (Rand_ZeroOne() - 0.5f) * 6.0f;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_809361B4.s")
scaleIndex = (s32)(Rand_ZeroOne() * 111.1f) % 7;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_80936220.s")
EffectSsKakera_Spawn(globalCtx, &pos, &velocity, &pos, -100, 64, 40, 3, 0, sFragmentScales[scaleIndex], 0, 0,
0x50, -1, 1, gKakeraLeafTip);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_80936290.s")
void EnKusa_SpawnBugs(EnKusa* this, GlobalContext* globalCtx) {
u32 numBugs;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_809362D8.s")
for (numBugs = 0; numBugs < 3; numBugs++) {
Actor* bug = Actor_SpawnAsChildAndCutscene(
&globalCtx->actorCtx, globalCtx, ACTOR_EN_INSECT, this->actor.world.pos.x, this->actor.world.pos.y,
this->actor.world.pos.z, 0, 0, 0, 1, this->actor.cutscene, this->actor.unk20, 0);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/EnKusa_Update.s")
if (bug == NULL) {
break;
}
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_80936414.s")
s32 EnKusa_GetWaterBox(EnKusa* this, GlobalContext* globalCtx) {
s32 pad;
WaterBox* waterBox;
f32 ySurface;
s32 bgId;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kusa/func_809365CC.s")
if (WaterBox_GetSurfaceImpl(globalCtx, &globalCtx->colCtx, this->actor.world.pos.x, this->actor.world.pos.z,
&ySurface, &waterBox, &bgId) &&
(this->actor.world.pos.y < ySurface)) {
return true;
}
return false;
}
void EnKusa_InitCollider(Actor* thisx, GlobalContext* globalCtx) {
EnKusa* this = THIS;
Collider_InitCylinder(globalCtx, &this->collider);
Collider_SetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
Collider_UpdateCylinder(thisx, &this->collider);
}
void EnKusa_Init(Actor* thisx, GlobalContext* globalCtx) {
EnKusa* this = THIS;
s32 pad;
s32 kusaType = GET_KUSA_TYPE(&this->actor);
Actor_ProcessInitChain(&this->actor, sInitChain);
if (globalCtx->csCtx.state != 0) {
this->actor.uncullZoneForward += 1000.0f;
}
EnKusa_InitCollider(&this->actor, globalCtx);
CollisionCheck_SetInfo(&this->actor.colChkInfo, NULL, &sColChkInfoInit);
if (kusaType == ENKUSA_TYPE_BUSH) {
this->actor.shape.shadowScale = 1.0f;
this->actor.shape.shadowAlpha = 60;
} else {
this->actor.shape.shadowScale = 0.9f;
this->actor.shape.shadowAlpha = 70;
}
if (this->actor.shape.rot.y == 0) {
this->actor.shape.rot.y = ((u32)Rand_Next() >> 0x10);
this->actor.home.rot.y = this->actor.shape.rot.y;
this->actor.world.rot.y = this->actor.shape.rot.y;
}
if (!EnKusa_SnapToFloor(this, globalCtx, 0.0f)) {
Actor_MarkForDeath(&this->actor);
return;
}
if (EnKusa_GetWaterBox(this, globalCtx)) {
this->isInWater |= 1;
}
this->objIndex = Object_GetIndex(&globalCtx->objectCtx, objectIds[(GET_KUSA_TYPE(&this->actor))]);
if (this->objIndex < 0) {
Actor_MarkForDeath(&this->actor);
return;
}
EnKusa_SetupWaitObject(this);
if (D_809366B4) {
D_80936CD8 = ((u32)Rand_Next() >> 0x10);
D_80936CDA = ((u32)Rand_Next() >> 0x10);
D_80936CDC = ((u32)Rand_Next() >> 0x10);
D_80936CDE = ((u32)Rand_Next() >> 0x10);
D_80936CE0 = ((u32)Rand_Next() >> 0x10);
D_809366B4 = false;
EnKusa_Sway();
kusaGameplayFrames = globalCtx->gameplayFrames;
}
this->kusaMtxIdx = D_809366B0 & 7;
D_809366B0++;
}
void EnKusa_Destroy(Actor* thisx, GlobalContext* globalCtx) {
GlobalContext* globalCtx2 = globalCtx;
EnKusa* this = THIS;
Collider_DestroyCylinder(globalCtx, &this->collider);
}
void EnKusa_SetupWaitObject(EnKusa* this) {
this->actionFunc = EnKusa_WaitObject;
}
void EnKusa_WaitObject(EnKusa* this, GlobalContext* globalCtx) {
s32 pad;
if (Object_IsLoaded(&globalCtx->objectCtx, this->objIndex)) {
s32 kusaType = GET_KUSA_TYPE(&this->actor);
if (this->isCut) {
EnKusa_SetupCut(this);
} else {
EnKusa_SetupInteract(this);
}
if (kusaType == ENKUSA_TYPE_BUSH) {
this->actor.draw = EnKusa_DrawBush;
} else {
this->actor.draw = EnKusa_DrawGrass;
}
this->actor.objBankIndex = this->objIndex;
this->actor.flags &= ~ACTOR_FLAG_10;
}
}
void EnKusa_SetupInteract(EnKusa* this) {
this->actionFunc = EnKusa_WaitForInteract;
this->actor.flags &= ~ACTOR_FLAG_10;
}
void EnKusa_WaitForInteract(EnKusa* this, GlobalContext* globalCtx) {
s32 pad;
if (Actor_HasParent(&this->actor, globalCtx)) {
EnKusa_SetupLiftedUp(this);
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &this->actor.world.pos, 20, NA_SE_PL_PULL_UP_PLANT);
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
} else if (this->collider.base.acFlags & AC_HIT) {
this->collider.base.acFlags &= ~AC_HIT;
EnKusa_SpawnFragments(this, globalCtx);
EnKusa_DropCollectible(this, globalCtx);
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &this->actor.world.pos, 20, NA_SE_EV_PLANT_BROKEN);
if (KUSA_SHOULD_SPAWN_BUGS(&this->actor)) {
if (GET_KUSA_TYPE(&this->actor) != ENKUSA_TYPE_GRASS_2) {
EnKusa_SpawnBugs(this, globalCtx);
}
}
if (GET_KUSA_TYPE(&this->actor) == ENKUSA_TYPE_BUSH) {
Actor_MarkForDeath(&this->actor);
} else {
EnKusa_SetupCut(this);
this->isCut = true;
}
} else {
if (!(this->collider.base.ocFlags1 & OC1_TYPE_PLAYER) && (this->actor.xzDistToPlayer > 12.0f)) {
this->collider.base.ocFlags1 |= OC1_TYPE_PLAYER;
}
if (this->actor.xzDistToPlayer < 600.0f) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
if (this->actor.xzDistToPlayer < 400.0f) {
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
if (this->actor.xzDistToPlayer < 100.0f) {
if (GET_KUSA_TYPE(&this->actor) != ENKUSA_TYPE_GRASS_2) {
Actor_LiftActor(&this->actor, globalCtx);
}
}
}
}
}
}
void EnKusa_SetupLiftedUp(EnKusa* this) {
this->actionFunc = EnKusa_LiftedUp;
this->actor.room = -1;
this->actor.flags |= ACTOR_FLAG_10;
}
void EnKusa_LiftedUp(EnKusa* this, GlobalContext* globalCtx) {
s32 pad;
Vec3f pos;
s32 bgId;
if (Actor_HasNoParent(&this->actor, globalCtx)) {
this->actor.room = globalCtx->roomCtx.currRoom.num;
EnKusa_SetupFall(this);
this->actor.velocity.x = this->actor.speedXZ * Math_SinS(this->actor.world.rot.y);
this->actor.velocity.z = this->actor.speedXZ * Math_CosS(this->actor.world.rot.y);
this->actor.colChkInfo.mass = 80;
this->actor.gravity = -0.1f;
EnKusa_UpdateVelY(this);
EnKusa_RandScaleVecToZero(&this->actor.velocity, 0.005f);
Actor_UpdatePos(&this->actor);
Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 7.5f, 35.0f, 0.0f, 0xC5);
this->actor.gravity = -3.2f;
} else {
pos.x = this->actor.world.pos.x;
pos.y = this->actor.world.pos.y + 20.0f;
pos.z = this->actor.world.pos.z;
this->actor.floorHeight =
BgCheck_EntityRaycastFloor5(&globalCtx->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &pos);
}
}
void EnKusa_SetupFall(EnKusa* this) {
this->actionFunc = EnKusa_Fall;
rotSpeedXtarget = -0xBB8;
rotSpeedYtarget = (Rand_ZeroOne() - 0.5f) * 1600.0f;
rotSpeedX = 0;
rotSpeedY = 0;
this->timer = 0;
}
void EnKusa_Fall(EnKusa* this, GlobalContext* globalCtx) {
s32 pad;
s32 wasHit;
Vec3f contactPos;
s32 i;
s16 angleOffset;
wasHit = (this->collider.base.atFlags & AT_HIT) != 0;
if (wasHit) {
this->collider.base.atFlags &= ~AT_HIT;
}
this->timer++;
if ((this->actor.bgCheckFlags & 0xB) || wasHit || (this->timer >= 100)) {
if (!(this->actor.bgCheckFlags & 0x20)) {
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &this->actor.world.pos, 20, NA_SE_EV_PLANT_BROKEN);
}
EnKusa_SpawnFragments(this, globalCtx);
EnKusa_DropCollectible(this, globalCtx);
switch (GET_KUSA_TYPE(&this->actor)) {
case ENKUSA_TYPE_BUSH:
case ENKUSA_TYPE_GRASS:
Actor_MarkForDeath(&this->actor);
break;
case ENKUSA_TYPE_REGROWING_GRASS:
EnKusa_SetupUprootedWaitRegrow(this);
this->actor.shape.shadowDraw = NULL;
break;
}
} else {
if (this->actor.bgCheckFlags & 0x40) {
contactPos.y = this->actor.world.pos.y + this->actor.depthInWater;
for (angleOffset = 0, i = 0; i < 4; i++, angleOffset += 0x4000) {
contactPos.x =
(Math_SinS((s32)(Rand_ZeroOne() * 7200.0f) + angleOffset) * 15.0f) + this->actor.world.pos.x;
contactPos.z =
(Math_CosS((s32)(Rand_ZeroOne() * 7200.0f) + angleOffset) * 15.0f) + this->actor.world.pos.z;
EffectSsGSplash_Spawn(globalCtx, &contactPos, NULL, NULL, 0, 190);
}
contactPos.x = this->actor.world.pos.x;
contactPos.z = this->actor.world.pos.z;
EffectSsGSplash_Spawn(globalCtx, &contactPos, NULL, NULL, 0, 280);
EffectSsGRipple_Spawn(globalCtx, &contactPos, 300, 700, 0);
this->actor.terminalVelocity = -3.0f;
this->actor.velocity.x *= 0.1f;
this->actor.velocity.y *= 0.4f;
this->actor.velocity.z *= 0.1f;
this->actor.gravity *= 0.5f;
rotSpeedX >>= 1;
rotSpeedXtarget >>= 1;
rotSpeedY >>= 1;
rotSpeedYtarget >>= 1;
this->actor.bgCheckFlags &= ~0x40;
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &this->actor.world.pos, 40, NA_SE_EV_DIVE_INTO_WATER_L);
}
EnKusa_UpdateVelY(this);
Math_StepToS(&rotSpeedX, rotSpeedXtarget, 500);
Math_StepToS(&rotSpeedY, rotSpeedYtarget, 170);
this->actor.shape.rot.x += rotSpeedX;
this->actor.shape.rot.y += rotSpeedY;
EnKusa_RandScaleVecToZero(&this->actor.velocity, 0.05f);
Actor_UpdatePos(&this->actor);
Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 7.5f, 35.0f, 0.0f, 0xC5);
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetAT(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
}
}
void EnKusa_SetupCut(EnKusa* this) {
switch (GET_KUSA_TYPE(&this->actor)) {
case ENKUSA_TYPE_GRASS:
case ENKUSA_TYPE_GRASS_2:
this->actionFunc = EnKusa_DoNothing;
break;
case ENKUSA_TYPE_REGROWING_GRASS:
this->actionFunc = EnKusa_CutWaitRegrow;
break;
}
this->timer = 0;
}
void EnKusa_CutWaitRegrow(EnKusa* this, GlobalContext* globalCtx) {
this->timer++;
if (this->timer >= 120) {
EnKusa_SetupRegrow(this);
}
}
void EnKusa_DoNothing(EnKusa* this, GlobalContext* globalCtx) {
}
void EnKusa_SetupUprootedWaitRegrow(EnKusa* this) {
this->actor.world.pos.x = this->actor.home.pos.x;
this->actor.world.pos.y = this->actor.home.pos.y - 9.0f;
this->actor.world.pos.z = this->actor.home.pos.z;
EnKusa_SetScaleSmall(this);
this->timer = 0;
this->actor.shape.rot = this->actor.home.rot;
this->actionFunc = EnKusa_UprootedWaitRegrow;
}
void EnKusa_UprootedWaitRegrow(EnKusa* this, GlobalContext* globalCtx) {
this->timer++;
if (this->timer > 120) {
if (Math_StepToF(&this->actor.world.pos.y, this->actor.home.pos.y, 0.6f) && (this->timer >= 170)) {
EnKusa_SetupRegrow(this);
}
}
}
void EnKusa_SetupRegrow(EnKusa* this) {
this->actionFunc = EnKusa_Regrow;
EnKusa_SetScaleSmall(this);
this->isCut = false;
this->actor.shape.rot = this->actor.home.rot;
}
void EnKusa_Regrow(EnKusa* this, GlobalContext* globalCtx) {
s32 isFullyGrown = 1;
isFullyGrown &= Math_StepToF(&this->actor.scale.y, 0.4f, 0.014f);
isFullyGrown &= Math_StepToF(&this->actor.scale.x, 0.4f, 0.011f);
this->actor.scale.z = this->actor.scale.x;
if (isFullyGrown) {
Actor_SetScale(&this->actor, 0.4f);
EnKusa_SetupInteract(this);
this->collider.base.ocFlags1 &= ~OC1_TYPE_PLAYER;
}
}
void EnKusa_Update(Actor* thisx, GlobalContext* globalCtx2) {
GlobalContext* globalCtx = globalCtx2;
EnKusa* this = THIS;
this->actionFunc(this, globalCtx);
if (this->isCut) {
this->actor.shape.yOffset = -6.25f;
} else {
this->actor.shape.yOffset = 0.0f;
}
if ((kusaGameplayFrames != globalCtx->gameplayFrames) && (globalCtx->roomCtx.currRoom.unk3 == 0)) {
EnKusa_Sway();
kusaGameplayFrames = globalCtx->gameplayFrames;
}
}
void EnKusa_DrawBush(Actor* thisx, GlobalContext* globalCtx2) {
GlobalContext* globalCtx = globalCtx2;
EnKusa* this = THIS;
if ((this->actor.projectedPos.z <= 1200.0f) || ((this->isInWater & 1) && (this->actor.projectedPos.z < 1300.0f))) {
if ((globalCtx->roomCtx.currRoom.unk3 == 0) && (this->actionFunc == EnKusa_WaitForInteract) &&
(this->actor.projectedPos.z > -150.0f) && (this->actor.projectedPos.z < 400.0f)) {
EnKusa_ApplySway(&D_80936AD8[this->kusaMtxIdx]);
}
Gfx_DrawDListOpa(globalCtx, gKusaBushType1);
} else if (this->actor.projectedPos.z < 1300.0f) {
s32 alpha;
OPEN_DISPS(globalCtx->state.gfxCtx);
alpha = (1300.0f - this->actor.projectedPos.z) * 2.55f;
func_8012C2DC(globalCtx->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, alpha);
gSPDisplayList(POLY_XLU_DISP++, gKusaBushType2);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
}
void EnKusa_DrawGrass(Actor* thisx, GlobalContext* globalCtx) {
EnKusa* this = THIS;
if (this->isCut) {
Gfx_DrawDListOpa(globalCtx, gKusaStump);
} else {
if ((globalCtx->roomCtx.currRoom.unk3 == 0) && (this->actionFunc == EnKusa_WaitForInteract)) {
if ((this->actor.projectedPos.z > -150.0f) && (this->actor.projectedPos.z < 400.0f)) {
EnKusa_ApplySway(&D_80936AD8[this->kusaMtxIdx]);
}
}
Gfx_DrawDListOpa(globalCtx, gKusaSprout);
}
}

View File

@ -7,12 +7,33 @@ struct EnKusa;
typedef void (*EnKusaActionFunc)(struct EnKusa*, GlobalContext*);
typedef enum {
/* 0 */ ENKUSA_TYPE_BUSH,
/* 1 */ ENKUSA_TYPE_REGROWING_GRASS,
/* 2 */ ENKUSA_TYPE_GRASS,
/* 3 */ ENKUSA_TYPE_GRASS_2
} EnKusaType;
typedef struct EnKusa {
/* 0x0000 */ Actor actor;
/* 0x0144 */ EnKusaActionFunc actionFunc;
/* 0x0148 */ char unk_148[0x54];
/* 0x000 */ Actor actor;
/* 0x144 */ EnKusaActionFunc actionFunc;
/* 0x148 */ ColliderCylinder collider;
/* 0x194 */ u8 timer;
/* 0x195 */ s8 objIndex;
/* 0x196 */ s8 kusaMtxIdx;
/* 0x197 */ u8 isCut;
/* 0x198 */ u8 isInWater;
} EnKusa; // size = 0x19C
extern const ActorInit En_Kusa_InitVars;
#define KUSA_GET_COLLECTIBLE_ID(thisx) ((((thisx)->params >> 8) & 0x7F))
#define KUSA_GET_RAND_COLLECTIBLE_ID(thisx) (((thisx)->params >> 8) & 0xF)
#define KUSA_SHOULD_SPAWN_BUGS(thisx) (((thisx)->params >> 0x4) & 1)
#define KUSA_GET_PARAMS_0C(thisx) (((thisx)->params >> 0xC) & 0x1)
#define KUSA_GET_PARAMS_3F(thisx) (((thisx)->params >> 0x2) & 0x3F)
#define GET_KUSA_TYPE(thisx)((thisx)->params & 0x3)
#endif // Z_EN_KUSA_H

View File

@ -1310,8 +1310,8 @@ void EnKusa2_Update(Actor* thisx, GlobalContext* globalCtx) {
void func_80A5E6F0(Actor* thisx, GlobalContext* globalCtx) {
static Gfx* D_80A5EB68[] = {
gameplay_keep_DL_0528B0,
gameplay_keep_DL_0527F0,
gKakeraLeafTip,
gKakeraLeafMiddle,
};
EnKusa2* this = THIS;
s32 i;
@ -1343,7 +1343,7 @@ void func_80A5E80C(GlobalContext* globalCtx, s32 arg1) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, arg1);
gSPDisplayList(POLY_XLU_DISP++, gameplay_field_keep_DL_007938);
gSPDisplayList(POLY_XLU_DISP++, gKusaBushType2);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
@ -1356,7 +1356,7 @@ void EnKusa2_Draw(Actor* thisx, GlobalContext* globalCtx) {
(this->actor.projectedPos.z < 400.0f)) {
func_80A5B954(&D_80A60908[this->unk_1CE], 0.0015f);
}
Gfx_DrawDListOpa(globalCtx, gameplay_field_keep_DL_0078A0);
Gfx_DrawDListOpa(globalCtx, gKusaBushType1);
} else if (this->actor.projectedPos.z < 1300.0f) {
func_80A5E80C(globalCtx, (1300.0f - this->actor.projectedPos.z) * 2.55f);
}
@ -1370,14 +1370,14 @@ void func_80A5E9B4(Actor* thisx, GlobalContext* globalCtx) {
sp18.z = thisx->shape.rot.z + D_80A5EAFC.z;
Matrix_SetStateRotationAndTranslation(thisx->world.pos.x, thisx->world.pos.y, thisx->world.pos.z, &sp18);
Matrix_Scale(thisx->scale.x, thisx->scale.y, thisx->scale.z, MTXMODE_APPLY);
Gfx_DrawDListOpa(globalCtx, gameplay_field_keep_DL_0078A0);
Gfx_DrawDListOpa(globalCtx, gKusaBushType1);
}
void func_80A5EA48(Actor* thisx, GlobalContext* globalCtx) {
EnKusa2* this = THIS;
if (this->unk_1CF == 0xFF) {
Gfx_DrawDListOpa(globalCtx, gameplay_field_keep_DL_0078A0);
Gfx_DrawDListOpa(globalCtx, gKusaBushType1);
} else {
func_80A5E80C(globalCtx, this->unk_1CF);
}

View File

@ -90,7 +90,7 @@ static AnimationInfoS sAnimations[] = {
{ &object_dnt_Anim_002670, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
};
Gfx* D_80BCCCDC[] = { gameplay_keep_DL_0527F0, gameplay_keep_DL_0528B0 };
Gfx* D_80BCCCDC[] = { gKakeraLeafMiddle, gKakeraLeafTip };
Vec3f D_80BCCCE4 = { 0.0f, -0.5f, 0.0f };

View File

@ -303,8 +303,8 @@ void func_809375C8(ObjBean* this, GlobalContext* globalCtx) {
void func_809375F4(ObjBean* this, GlobalContext* globalCtx) {
static Gfx* D_80939024[] = {
gameplay_keep_DL_0527F0,
gameplay_keep_DL_0528B0,
gKakeraLeafMiddle,
gKakeraLeafTip,
};
Vec3f spC4;
Vec3f spB8;

View File

@ -118,7 +118,7 @@ void func_809A9314(ObjGrassStruct1_1* ptr, GlobalContext* globalCtx) {
spBC.z = (Rand_ZeroOne() - 0.5f) * 8.0f;
EffectSsKakera_Spawn(globalCtx, &spB0, &spBC, &spB0, -100, 64, 40, 3, 0,
D_809AAB7C[(s32)(Rand_ZeroOne() * 111.1f) & 7], 0, 0, 80, -1, 1, gameplay_keep_DL_0527F0);
D_809AAB7C[(s32)(Rand_ZeroOne() * 111.1f) & 7], 0, 0, 80, -1, 1, gKakeraLeafMiddle);
spB0.x = ptr->unk_00.x + (ptr2->x * 16.0f);
spB0.y = (ptr->unk_00.y + (ptr2->y * 16.0f)) + 10.0f;
@ -129,7 +129,7 @@ void func_809A9314(ObjGrassStruct1_1* ptr, GlobalContext* globalCtx) {
spBC.z = (Rand_ZeroOne() - 0.5f) * 6.0f;
EffectSsKakera_Spawn(globalCtx, &spB0, &spBC, &spB0, -100, 64, 40, 3, 0,
D_809AAB7C[(s32)(Rand_ZeroOne() * 111.1f) % 7], 0, 0, 80, -1, 1, gameplay_keep_DL_0528B0);
D_809AAB7C[(s32)(Rand_ZeroOne() * 111.1f) % 7], 0, 0, 80, -1, 1, gKakeraLeafTip);
}
}

View File

@ -7251,37 +7251,37 @@
0x809340BC:("func_809340BC",),
0x80934178:("func_80934178",),
0x80934464:("func_80934464",),
0x809349E0:("func_809349E0",),
0x80934AB4:("func_80934AB4",),
0x80934F58:("func_80934F58",),
0x80934FFC:("func_80934FFC",),
0x809350C4:("func_809350C4",),
0x809350F8:("func_809350F8",),
0x8093517C:("func_8093517C",),
0x809351A0:("func_809351A0",),
0x809354F8:("func_809354F8",),
0x809355A4:("func_809355A4",),
0x8093561C:("func_8093561C",),
0x809349E0:("EnKusa_ApplySway",),
0x80934AB4:("EnKusa_Sway",),
0x80934F58:("EnKusa_SnapToFloor",),
0x80934FFC:("EnKusa_DropCollectible",),
0x809350C4:("EnKusa_UpdateVelY",),
0x809350F8:("EnKusa_RandScaleVecToZero",),
0x8093517C:("EnKusa_SetScaleSmall",),
0x809351A0:("EnKusa_SpawnFragments",),
0x809354F8:("EnKusa_SpawnBugs",),
0x809355A4:("EnKusa_GetWaterBox",),
0x8093561C:("EnKusa_InitCollider",),
0x80935674:("EnKusa_Init",),
0x80935898:("EnKusa_Destroy",),
0x809358C4:("func_809358C4",),
0x809358D8:("func_809358D8",),
0x80935988:("func_80935988",),
0x809359AC:("func_809359AC",),
0x80935B94:("func_80935B94",),
0x80935BBC:("func_80935BBC",),
0x80935CE8:("func_80935CE8",),
0x80935D64:("func_80935D64",),
0x80936120:("func_80936120",),
0x80936168:("func_80936168",),
0x809361A4:("func_809361A4",),
0x809361B4:("func_809361B4",),
0x80936220:("func_80936220",),
0x80936290:("func_80936290",),
0x809362D8:("func_809362D8",),
0x809358C4:("EnKusa_SetupWaitObject",),
0x809358D8:("EnKusa_WaitObject",),
0x80935988:("EnKusa_SetupInteract",),
0x809359AC:("EnKusa_WaitForInteract",),
0x80935B94:("EnKusa_SetupLiftedUp",),
0x80935BBC:("EnKusa_LiftedUp",),
0x80935CE8:("EnKusa_SetupFall",),
0x80935D64:("EnKusa_Fall",),
0x80936120:("EnKusa_SetupCut",),
0x80936168:("EnKusa_CutWaitRegrow",),
0x809361A4:("EnKusa_DoNothing",),
0x809361B4:("EnKusa_SetupUprootedWaitRegrow",),
0x80936220:("EnKusa_UprootedWaitRegrow",),
0x80936290:("EnKusa_SetupRegrow",),
0x809362D8:("EnKusa_Regrow",),
0x80936370:("EnKusa_Update",),
0x80936414:("func_80936414",),
0x809365CC:("func_809365CC",),
0x80936414:("EnKusa_DrawBush",),
0x809365CC:("EnKusa_DrawGrass",),
0x80936CF0:("func_80936CF0",),
0x80936D58:("func_80936D58",),
0x80936F04:("func_80936F04",),

View File

@ -1495,10 +1495,6 @@ D_06003C80 = 0x06003C80;
D_06003D58 = 0x06003D58;
D_06006198 = 0x06006198;
// ovl_En_Kusa
D_06000140 = 0x06000140;
D_060002E0 = 0x060002E0;
// ovl_En_Lift_Nuts