mirror of https://github.com/zeldaret/mm.git
parent
e77a22e8a9
commit
49aeece9ee
|
|
@ -0,0 +1,7 @@
|
|||
<Root>
|
||||
<File Name="ovl_Obj_Grass" BaseAddress="0x809A9110" RangeStart="0x18E0" RangeEnd="0x19F0">
|
||||
<DList Name="gObjGrass_D_809AA9F0" Offset="0x18E0"/>
|
||||
<DList Name="gObjGrass_D_809AAA68" Offset="0x1958"/>
|
||||
<DList Name="gObjGrass_D_809AAAE0" Offset="0x19D0"/>
|
||||
</File>
|
||||
</Root>
|
||||
4
spec
4
spec
|
|
@ -2306,9 +2306,7 @@ beginseg
|
|||
name "ovl_Obj_Grass"
|
||||
compress
|
||||
include "build/src/overlays/actors/ovl_Obj_Grass/z_obj_grass.o"
|
||||
include "build/data/ovl_Obj_Grass/ovl_Obj_Grass.data.o"
|
||||
include "build/data/ovl_Obj_Grass/ovl_Obj_Grass.bss.o"
|
||||
include "build/data/ovl_Obj_Grass/ovl_Obj_Grass.reloc.o"
|
||||
include "build/src/overlays/actors/ovl_Obj_Grass/ovl_Obj_Grass_reloc.o"
|
||||
endseg
|
||||
|
||||
beginseg
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
|
||||
#include "z_obj_grass.h"
|
||||
#include "objects/gameplay_keep/gameplay_keep.h"
|
||||
|
||||
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20)
|
||||
|
||||
|
|
@ -15,7 +16,13 @@ void ObjGrass_Destroy(Actor* thisx, GlobalContext* globalCtx);
|
|||
void ObjGrass_Update(Actor* thisx, GlobalContext* globalCtx);
|
||||
void ObjGrass_Draw(Actor* thisx, GlobalContext* globalCtx);
|
||||
|
||||
#if 0
|
||||
ObjGrassStruct1* D_809AADA0[4];
|
||||
f32 D_809AADB0[4];
|
||||
ObjGrassStruct1_1* D_809AADC0[20];
|
||||
f32 D_809AAE10[20];
|
||||
|
||||
#include "overlays/ovl_Obj_Grass/ovl_Obj_Grass.c"
|
||||
|
||||
const ActorInit Obj_Grass_InitVars = {
|
||||
ACTOR_OBJ_GRASS,
|
||||
ACTORCAT_PROP,
|
||||
|
|
@ -28,41 +35,486 @@ const ActorInit Obj_Grass_InitVars = {
|
|||
(ActorFunc)ObjGrass_Draw,
|
||||
};
|
||||
|
||||
// static ColliderCylinderInit sCylinderInit = {
|
||||
static ColliderCylinderInit D_809AAB20 = {
|
||||
{ COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_PLAYER | OC1_TYPE_2, OC2_TYPE_2, COLSHAPE_CYLINDER, },
|
||||
{ ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0x0580C71C, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
|
||||
static ColliderCylinderInit sCylinderInit = {
|
||||
{
|
||||
COLTYPE_NONE,
|
||||
AT_NONE,
|
||||
AC_ON | AC_TYPE_PLAYER,
|
||||
OC1_ON | OC1_TYPE_PLAYER | OC1_TYPE_2,
|
||||
OC2_TYPE_2,
|
||||
COLSHAPE_CYLINDER,
|
||||
},
|
||||
{
|
||||
ELEMTYPE_UNK0,
|
||||
{ 0x00000000, 0x00, 0x00 },
|
||||
{ 0x0580C71C, 0x00, 0x00 },
|
||||
TOUCH_NONE | TOUCH_SFX_NORMAL,
|
||||
BUMP_ON,
|
||||
OCELEM_ON,
|
||||
},
|
||||
{ 6, 44, 0, { 0, 0, 0 } },
|
||||
};
|
||||
|
||||
#endif
|
||||
Vec3f D_809AAB4C[] = {
|
||||
{ 0.0f, 0.707099974155f, 0.707099974155f },
|
||||
{ 0.707099974155f, 0.707099974155f, 0.0f },
|
||||
{ 0.0f, 0.707099974155f, -0.707099974155f },
|
||||
{ -0.707099974155f, 0.707099974155f, 0.0f },
|
||||
};
|
||||
|
||||
extern ColliderCylinderInit D_809AAB20;
|
||||
s16 D_809AAB7C[] = { 0x6C, 0x66, 0x60, 0x54, 0x42, 0x37, 0x2A, 0x26 };
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Grass/func_809A9110.s")
|
||||
s32 func_809A9110(GlobalContext* globalCtx, Vec3f* arg1) {
|
||||
f32 sp2C;
|
||||
Vec3f sp20;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Grass/func_809A91FC.s")
|
||||
SkinMatrix_Vec3fMtxFMultXYZW(&globalCtx->viewProjectionMtxF, arg1, &sp20, &sp2C);
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Grass/func_809A92D0.s")
|
||||
if ((globalCtx->unk_187F0.z * -130.13191f) < sp20.z) {
|
||||
if (sp2C < 1.0f) {
|
||||
sp2C = 1.0f;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Grass/func_809A9314.s")
|
||||
if (((fabsf(sp20.x) - (130.13191f * globalCtx->unk_187F0.x)) < sp2C) &&
|
||||
((fabsf(sp20.y) - (130.13191f * globalCtx->unk_187F0.y)) < sp2C)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Grass/ObjGrass_Init.s")
|
||||
void func_809A91FC(MtxF* matrix) {
|
||||
s32 i;
|
||||
MtxF* temp = Matrix_GetCurrentState();
|
||||
f32* tmp = &temp->xx;
|
||||
f32* tmp2 = &matrix->xx;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Grass/ObjGrass_Destroy.s")
|
||||
for (i = 0; i < 16; i++) {
|
||||
*tmp++ += *tmp2++;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Grass/func_809A9790.s")
|
||||
void func_809A92D0(ObjGrassStruct1_1* ptr, GlobalContext* globalCtx) {
|
||||
if (!(ptr->unk_0E & 0x10)) {
|
||||
Item_DropCollectibleRandom(globalCtx, NULL, &ptr->unk_00, ptr->unk_0E * 0x10);
|
||||
}
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Grass/func_809A983C.s")
|
||||
void func_809A9314(ObjGrassStruct1_1* ptr, GlobalContext* globalCtx) {
|
||||
Vec3f spBC;
|
||||
Vec3f spB0;
|
||||
s32 i;
|
||||
Vec3f* ptr2;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Grass/func_809A9DB8.s")
|
||||
for (i = 0; i < ARRAY_COUNT(D_809AAB4C); i++) {
|
||||
ptr2 = &D_809AAB4C[i];
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Grass/ObjGrass_Update.s")
|
||||
spB0.x = ptr->unk_00.x + (ptr2->x * 8.0f);
|
||||
spB0.y = (ptr->unk_00.y + (ptr2->y * 8.0f)) + 10.0f;
|
||||
spB0.z = ptr->unk_00.z + (ptr2->z * 8.0f);
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Grass/func_809AA278.s")
|
||||
spBC.x = (Rand_ZeroOne() - 0.5f) * 8.0f;
|
||||
spBC.y = Rand_ZeroOne() * 10.0f;
|
||||
spBC.z = (Rand_ZeroOne() - 0.5f) * 8.0f;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Grass/func_809AA54C.s")
|
||||
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);
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Grass/func_809AA798.s")
|
||||
spB0.x = ptr->unk_00.x + (ptr2->x * 16.0f);
|
||||
spB0.y = (ptr->unk_00.y + (ptr2->y * 16.0f)) + 10.0f;
|
||||
spB0.z = ptr->unk_00.z + (ptr2->z * 16.0f);
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Grass/ObjGrass_Draw.s")
|
||||
spBC.x = (Rand_ZeroOne() - 0.5f) * 6.0f;
|
||||
spBC.y = Rand_ZeroOne() * 10.0f;
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
void ObjGrass_Init(Actor* thisx, GlobalContext* globalCtx) {
|
||||
ObjGrass* this = THIS;
|
||||
s32 i;
|
||||
|
||||
Actor_SetScale(&this->actor, 0.4f);
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(this->unk_2948); i++) {
|
||||
Collider_InitCylinder(globalCtx, &this->unk_2948[i].collider);
|
||||
Collider_SetCylinder(globalCtx, &this->unk_2948[i].collider, &this->actor, &sCylinderInit);
|
||||
}
|
||||
|
||||
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
|
||||
this->unk_3288 = (u32)Rand_Next() >> 0x10;
|
||||
this->unk_328A = (u32)Rand_Next() >> 0x10;
|
||||
this->unk_328C = (u32)Rand_Next() >> 0x10;
|
||||
this->unk_328E = (u32)Rand_Next() >> 0x10;
|
||||
this->unk_3290 = (u32)Rand_Next() >> 0x10;
|
||||
}
|
||||
|
||||
void ObjGrass_Destroy(Actor* thisx, GlobalContext* globalCtx) {
|
||||
ObjGrass* this = THIS;
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(this->unk_2948); i++) {
|
||||
Collider_DestroyCylinder(globalCtx, &this->unk_2948[i].collider);
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(this->unk_3298); i++) {
|
||||
ObjGrassCarry** ptr = &this->unk_3298[i];
|
||||
|
||||
if (*ptr != NULL) {
|
||||
(*ptr)->unk_190 = 0;
|
||||
*ptr = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void func_809A9790(ObjGrass* this, GlobalContext* globalCtx) {
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(this->unk_2948); i++) {
|
||||
ObjGrassStruct1_1* ptr = this->unk_2948[i].unk_4C;
|
||||
|
||||
if ((ptr != NULL) && (this->unk_2948[i].collider.base.acFlags & AC_HIT)) {
|
||||
func_809A9314(ptr, globalCtx);
|
||||
func_809A92D0(ptr, globalCtx);
|
||||
ptr->unk_0F |= 4;
|
||||
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &ptr->unk_00, 20, NA_SE_EV_PLANT_BROKEN);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void func_809A983C(ObjGrass* this, GlobalContext* globalCtx) {
|
||||
Player* player = GET_PLAYER(globalCtx);
|
||||
s32 i;
|
||||
s32 j;
|
||||
s32 x;
|
||||
s32 y;
|
||||
f32 temp_f0;
|
||||
ObjGrassStruct1* ptr;
|
||||
ObjGrassStruct1_1* ptr2;
|
||||
ObjGrassStruct2* ptr3;
|
||||
s16 yaw;
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(D_809AADC0); i++) {
|
||||
D_809AADC0[i] = NULL;
|
||||
D_809AAE10[i] = 422500.0f;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(D_809AADA0); i++) {
|
||||
D_809AADA0[i] = NULL;
|
||||
D_809AADB0[i] = 422500.0f;
|
||||
}
|
||||
|
||||
for (i = 0; i < this->unk_2944; i++) {
|
||||
ptr = &this->unk_144[i];
|
||||
|
||||
for (j = 0; j < ptr->unk_FC; j++) {
|
||||
ptr->unk_0C[j].unk_0F &= (u16)~2;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < this->unk_2944; i++) {
|
||||
ptr = &this->unk_144[i];
|
||||
temp_f0 = Math3D_Vec3fDistSq(&ptr->unk_00, &player->actor.world.pos);
|
||||
|
||||
for (j = 0; j < ARRAY_COUNT(D_809AADB0); j++) {
|
||||
if (temp_f0 < D_809AADB0[j]) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (j < ARRAY_COUNT(D_809AADB0)) {
|
||||
for (x = 2; x >= j; x--) {
|
||||
D_809AADB0[x + 1] = D_809AADB0[x];
|
||||
D_809AADA0[x + 1] = D_809AADA0[x];
|
||||
}
|
||||
|
||||
D_809AADB0[j] = temp_f0;
|
||||
D_809AADA0[j] = ptr;
|
||||
}
|
||||
}
|
||||
|
||||
this->unk_3294 = NULL;
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(D_809AADA0); i++) {
|
||||
ptr = D_809AADA0[i];
|
||||
|
||||
if (ptr != NULL) {
|
||||
for (j = 0; j < ptr->unk_FC; j++) {
|
||||
if (!(ptr->unk_0C[j].unk_0F & 4)) {
|
||||
temp_f0 = Math3D_Vec3fDistSq(&ptr->unk_0C[j].unk_00, &player->actor.world.pos);
|
||||
|
||||
for (x = 0; x < ARRAY_COUNT(D_809AAE10); x++) {
|
||||
if (temp_f0 < D_809AAE10[x]) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (x < ARRAY_COUNT(D_809AAE10)) {
|
||||
for (y = 18; y >= x; y--) {
|
||||
D_809AAE10[y + 1] = D_809AAE10[y];
|
||||
D_809AADC0[y + 1] = D_809AADC0[y];
|
||||
}
|
||||
|
||||
D_809AAE10[x] = temp_f0;
|
||||
D_809AADC0[x] = &ptr->unk_0C[j];
|
||||
|
||||
if (temp_f0 < 2500.0f) {
|
||||
yaw = player->actor.shape.rot.y -
|
||||
Math_Vec3f_Yaw(&player->actor.world.pos, &ptr->unk_0C[j].unk_00);
|
||||
|
||||
if (ABS_ALT(yaw) < 0x2000) {
|
||||
this->unk_3294 = &ptr->unk_0C[j].unk_00;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(this->unk_2948); i++) {
|
||||
ptr3 = &this->unk_2948[i];
|
||||
|
||||
ptr3->collider.base.acFlags &= (u16)~AC_HIT;
|
||||
ptr3->collider.base.ocFlags1 &= (u16)~OC1_HIT;
|
||||
|
||||
ptr2 = D_809AADC0[i];
|
||||
if (ptr2 != NULL) {
|
||||
ptr3->collider.dim.pos.x = ptr2->unk_00.x;
|
||||
ptr3->collider.dim.pos.y = ptr2->unk_00.y;
|
||||
ptr3->collider.dim.pos.z = ptr2->unk_00.z;
|
||||
CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &ptr3->collider.base);
|
||||
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &ptr3->collider.base);
|
||||
ptr2->unk_0F |= 2;
|
||||
ptr3->unk_4C = ptr2;
|
||||
} else {
|
||||
ptr3->unk_4C = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void func_809A9DB8(ObjGrass* this) {
|
||||
s32 i;
|
||||
s32 pad;
|
||||
f32* ptr;
|
||||
f32 temp_f28;
|
||||
f32 spA4;
|
||||
f32 spA0;
|
||||
f32 temp_f22;
|
||||
f32 temp_f24;
|
||||
f32 sp94;
|
||||
f32 sp90;
|
||||
f32 temp_f26;
|
||||
f32 sp6C[8];
|
||||
f32 tempf1;
|
||||
f32 tempf2;
|
||||
f32 tempf3;
|
||||
f32 tempf4;
|
||||
f32 tempf5;
|
||||
f32 temp_f16;
|
||||
f32 temp_f20;
|
||||
|
||||
this->unk_3288 += 70;
|
||||
this->unk_328A += 300;
|
||||
this->unk_328C += 700;
|
||||
this->unk_328E += 1300;
|
||||
this->unk_3290 += 8900;
|
||||
|
||||
temp_f24 = Math_SinS(this->unk_3288);
|
||||
temp_f28 = Math_SinS(this->unk_328A);
|
||||
temp_f26 = Math_SinS(this->unk_328C);
|
||||
spA4 = Math_SinS(this->unk_328E) * 1.2f;
|
||||
spA0 = Math_SinS(this->unk_3290) * 1.5f;
|
||||
temp_f22 = Math_CosS(this->unk_3288);
|
||||
temp_f20 = Math_CosS(this->unk_328A);
|
||||
sp94 = Math_CosS(this->unk_328C);
|
||||
sp90 = Math_CosS(this->unk_328E) * 1.3f;
|
||||
temp_f16 = Math_CosS(this->unk_3290) * 1.7f;
|
||||
|
||||
sp6C[0] = (temp_f24 - temp_f20) * temp_f26 * temp_f22 * temp_f24 * 0.0015f;
|
||||
sp6C[1] = (temp_f28 - sp94) * spA4 * temp_f20 * temp_f24 * 0.0015f;
|
||||
sp6C[2] = (temp_f26 - sp90) * sp94 * temp_f24 * temp_f22 * 0.0015f;
|
||||
sp6C[3] = (spA4 - temp_f20) * sp90 * temp_f28 * temp_f22 * 0.0015f;
|
||||
sp6C[4] = (temp_f24 - sp94) * temp_f24 * temp_f28 * spA0 * 0.0015f;
|
||||
sp6C[5] = (temp_f28 - sp90) * temp_f26 * spA4 * spA0 * 0.0015f;
|
||||
sp6C[6] = (temp_f26 - temp_f22) * temp_f22 * temp_f20 * temp_f16 * 0.0015f;
|
||||
sp6C[7] = (spA4 - temp_f20) * sp94 * sp90 * temp_f16 * 0.0015f;
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(this->unk_2F88); i++) {
|
||||
ptr = &this->unk_2F88[i].mf[0][0];
|
||||
|
||||
tempf1 = sp6C[(i + 0) & 7];
|
||||
tempf2 = sp6C[(i + 1) & 7];
|
||||
tempf3 = sp6C[(i + 2) & 7];
|
||||
tempf4 = sp6C[(i + 3) & 7];
|
||||
tempf5 = sp6C[(i + 4) & 7];
|
||||
|
||||
ptr[0] = sp6C[1] * 0.2f;
|
||||
ptr[1] = tempf1;
|
||||
ptr[2] = tempf2;
|
||||
ptr[3] = 0.0f;
|
||||
|
||||
ptr[4] = tempf3;
|
||||
ptr[5] = sp6C[0];
|
||||
ptr[6] = tempf3;
|
||||
ptr[7] = 0.0f;
|
||||
|
||||
ptr[8] = tempf4;
|
||||
ptr[9] = tempf5;
|
||||
ptr[10] = sp6C[3] * 0.2f;
|
||||
ptr[11] = 0.0f;
|
||||
|
||||
ptr[12] = 0.0f;
|
||||
ptr[13] = 0.0f;
|
||||
ptr[14] = 0.0f;
|
||||
ptr[15] = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
void ObjGrass_Update(Actor* thisx, GlobalContext* globalCtx) {
|
||||
ObjGrass* this = THIS;
|
||||
|
||||
func_809A9790(this, globalCtx);
|
||||
func_809A983C(this, globalCtx);
|
||||
func_809A9DB8(this);
|
||||
}
|
||||
|
||||
void func_809AA278(ObjGrass* this, GlobalContext* globalCtx) {
|
||||
ObjGrassStruct1* ptr;
|
||||
ObjGrassStruct1_1* ptr2;
|
||||
s32 i;
|
||||
s32 j;
|
||||
f32 distSq;
|
||||
f32 temp_f22;
|
||||
|
||||
for (i = 0; i < this->unk_2944; i++) {
|
||||
ptr = &this->unk_144[i];
|
||||
|
||||
temp_f22 = Math3D_Vec3fDistSq(&ptr->unk_00, &GET_ACTIVE_CAM(globalCtx)->eye);
|
||||
|
||||
if ((temp_f22 < SQ(1280.0f)) && func_809A9110(globalCtx, &ptr->unk_00)) {
|
||||
ptr->unk_FE |= 1;
|
||||
|
||||
for (j = 0; j < ptr->unk_FC; j++) {
|
||||
ptr2 = &ptr->unk_0C[j];
|
||||
|
||||
if (ptr2->unk_0F & 4) {
|
||||
ptr2->unk_10 = 255;
|
||||
ptr2->unk_0F &= ~1;
|
||||
} else {
|
||||
ptr2->unk_0F |= 1;
|
||||
if (temp_f22 < SQ(980.0f)) {
|
||||
ptr2->unk_10 = 255;
|
||||
} else {
|
||||
distSq = Math3D_Vec3fDistSq(&ptr2->unk_00, &GET_ACTIVE_CAM(globalCtx)->eye);
|
||||
if ((distSq <= SQ(1080.0f)) || ((ptr2->unk_0F & 8) && (distSq < SQ(1180.0f)))) {
|
||||
ptr2->unk_10 = 255;
|
||||
} else if (distSq >= SQ(1180.0f)) {
|
||||
ptr2->unk_10 = 0;
|
||||
} else {
|
||||
ptr2->unk_10 = (1180.0f - sqrtf(distSq)) * 2.55f;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ptr->unk_FE &= ~1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void func_809AA54C(Actor* thisx, GlobalContext* globalCtx2) {
|
||||
ObjGrass* this = THIS;
|
||||
GlobalContext* globalCtx = globalCtx2;
|
||||
Lights* temp_s0;
|
||||
ObjGrassStruct1* ptr;
|
||||
s32 i;
|
||||
s32 j;
|
||||
Vec3s sp70 = { 0, 0, 0 };
|
||||
ObjGrassStruct1_1* ptr2;
|
||||
|
||||
OPEN_DISPS(globalCtx->state.gfxCtx);
|
||||
|
||||
func_8012C28C(globalCtx->state.gfxCtx);
|
||||
|
||||
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
|
||||
gSPDisplayList(POLY_OPA_DISP++, gObjGrass_D_809AA9F0);
|
||||
|
||||
for (i = 0; i < this->unk_2944; i++) {
|
||||
ptr = &this->unk_144[i];
|
||||
|
||||
if (ptr->unk_FE & 1) {
|
||||
temp_s0 = LightContext_NewLights(&globalCtx->lightCtx, globalCtx->state.gfxCtx);
|
||||
Lights_BindAll(temp_s0, globalCtx->lightCtx.listHead, &ptr->unk_00, globalCtx);
|
||||
Lights_Draw(temp_s0, globalCtx->state.gfxCtx);
|
||||
|
||||
for (j = 0; j < ptr->unk_FC; j++) {
|
||||
ptr2 = &ptr->unk_0C[j];
|
||||
|
||||
if ((ptr2->unk_0F & 1) && (ptr2->unk_10 == 255)) {
|
||||
sp70.y = ptr2->unk_0C;
|
||||
Matrix_SetStateRotationAndTranslation(ptr2->unk_00.x, ptr2->unk_00.y, ptr2->unk_00.z, &sp70);
|
||||
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
|
||||
if (ptr2->unk_0F & 2) {
|
||||
func_809A91FC(&this->unk_2F88[j]);
|
||||
}
|
||||
|
||||
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx),
|
||||
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
gSPDisplayList(POLY_OPA_DISP++, gObjGrass_D_809AAAE0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CLOSE_DISPS(globalCtx->state.gfxCtx);
|
||||
}
|
||||
|
||||
void func_809AA798(Actor* thisx, GlobalContext* globalCtx) {
|
||||
ObjGrass* this = THIS;
|
||||
ObjGrassStruct1* ptr;
|
||||
ObjGrassStruct1_1* ptr2;
|
||||
s32 i;
|
||||
s32 j;
|
||||
Vec3s sp6C = { 0, 0, 0 };
|
||||
|
||||
OPEN_DISPS(globalCtx->state.gfxCtx);
|
||||
|
||||
func_8012C2DC(globalCtx->state.gfxCtx);
|
||||
|
||||
gSPDisplayList(POLY_XLU_DISP++, gObjGrass_D_809AAA68);
|
||||
|
||||
for (i = 0; i < this->unk_2944; i++) {
|
||||
ptr = &this->unk_144[i];
|
||||
|
||||
if (ptr->unk_FE & 1) {
|
||||
for (j = 0; j < ptr->unk_FC; j++) {
|
||||
ptr2 = &ptr->unk_0C[j];
|
||||
|
||||
if ((ptr2->unk_0F & 1) && (ptr2->unk_10 > 0) && (ptr2->unk_10 < 255)) {
|
||||
sp6C.y = ptr2->unk_0C;
|
||||
Matrix_SetStateRotationAndTranslation(ptr2->unk_00.x, ptr2->unk_00.y, ptr2->unk_00.z, &sp6C);
|
||||
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
|
||||
|
||||
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, ptr2->unk_10);
|
||||
gSPDisplayList(POLY_XLU_DISP++, gObjGrass_D_809AAAE0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CLOSE_DISPS(globalCtx->state.gfxCtx);
|
||||
}
|
||||
|
||||
void ObjGrass_Draw(Actor* thisx, GlobalContext* globalCtx) {
|
||||
ObjGrass* this = THIS;
|
||||
|
||||
func_809AA278(this, globalCtx);
|
||||
func_809AA54C(thisx, globalCtx);
|
||||
func_809AA798(thisx, globalCtx);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,12 +2,44 @@
|
|||
#define Z_OBJ_GRASS_H
|
||||
|
||||
#include "global.h"
|
||||
#include "overlays/actors/ovl_Obj_Grass_Carry/z_obj_grass_carry.h"
|
||||
|
||||
struct ObjGrass;
|
||||
|
||||
typedef struct {
|
||||
/* 0x00 */ Vec3f unk_00;
|
||||
/* 0x0C */ s16 unk_0C;
|
||||
/* 0x0E */ s8 unk_0E;
|
||||
/* 0x0F */ u8 unk_0F;
|
||||
/* 0x10 */ u8 unk_10;
|
||||
/* 0x11 */ UNK_TYPE1 unk_11[0x3];
|
||||
} ObjGrassStruct1_1; // size = 0x14
|
||||
|
||||
typedef struct {
|
||||
/* 0x00 */ Vec3f unk_00;
|
||||
/* 0x0C */ ObjGrassStruct1_1 unk_0C[12];
|
||||
/* 0xFC */ s16 unk_FC;
|
||||
/* 0xFE */ u8 unk_FE;
|
||||
} ObjGrassStruct1; // size = 0x100
|
||||
|
||||
typedef struct {
|
||||
/* 0x00 */ ColliderCylinder collider;
|
||||
/* 0x4C */ ObjGrassStruct1_1* unk_4C;
|
||||
} ObjGrassStruct2; // size = 0x50
|
||||
|
||||
typedef struct ObjGrass {
|
||||
/* 0x0000 */ Actor actor;
|
||||
/* 0x0144 */ char unk_0144[0x315C];
|
||||
/* 0x0144 */ ObjGrassStruct1 unk_144[40];
|
||||
/* 0x2944 */ s16 unk_2944;
|
||||
/* 0x2948 */ ObjGrassStruct2 unk_2948[20];
|
||||
/* 0x2F88 */ MtxF unk_2F88[12];
|
||||
/* 0x3288 */ s16 unk_3288;
|
||||
/* 0x328A */ s16 unk_328A;
|
||||
/* 0x328C */ s16 unk_328C;
|
||||
/* 0x328E */ s16 unk_328E;
|
||||
/* 0x3290 */ s16 unk_3290;
|
||||
/* 0x3294 */ Vec3f* unk_3294;
|
||||
/* 0x3298 */ ObjGrassCarry* unk_3298[2];
|
||||
} ObjGrass; // size = 0x32A0
|
||||
|
||||
extern const ActorInit Obj_Grass_InitVars;
|
||||
|
|
|
|||
|
|
@ -9,7 +9,9 @@ typedef void (*ObjGrassCarryActionFunc)(struct ObjGrassCarry*, GlobalContext*);
|
|||
|
||||
typedef struct ObjGrassCarry {
|
||||
/* 0x0000 */ Actor actor;
|
||||
/* 0x0144 */ char unk_144[0x58];
|
||||
/* 0x0144 */ char unk_144[0x4C];
|
||||
/* 0x0190 */ s32 unk_190;
|
||||
/* 0x0194 */ char unk_194[0x8];
|
||||
/* 0x019C */ ObjGrassCarryActionFunc actionFunc;
|
||||
} ObjGrassCarry; // size = 0x1A0
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue