mirror of https://github.com/zeldaret/mm.git
parent
36391bee46
commit
c0979dcb07
5
spec
5
spec
|
@ -2795,8 +2795,11 @@ beginseg
|
|||
name "ovl_Obj_Vspinyroll"
|
||||
compress
|
||||
include "build/src/overlays/actors/ovl_Obj_Vspinyroll/z_obj_vspinyroll.o"
|
||||
include "build/data/ovl_Obj_Vspinyroll/ovl_Obj_Vspinyroll.data.o"
|
||||
#ifdef NON_MATCHING
|
||||
include "build/src/overlays/actors/ovl_Obj_Vspinyroll/ovl_Obj_Vspinyroll_reloc.o"
|
||||
#else
|
||||
include "build/data/ovl_Obj_Vspinyroll/ovl_Obj_Vspinyroll.reloc.o"
|
||||
#endif
|
||||
endseg
|
||||
|
||||
beginseg
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
|
||||
#include "z_obj_vspinyroll.h"
|
||||
#include "objects/object_spinyroll/object_spinyroll.h"
|
||||
|
||||
#define FLAGS (ACTOR_FLAG_10)
|
||||
|
||||
|
@ -15,13 +16,17 @@ void ObjVspinyroll_Destroy(Actor* thisx, GlobalContext* globalCtx);
|
|||
void ObjVspinyroll_Update(Actor* thisx, GlobalContext* globalCtx);
|
||||
void ObjVspinyroll_Draw(Actor* thisx, GlobalContext* globalCtx);
|
||||
|
||||
void func_80A3CEC4(ObjVspinyroll* this);
|
||||
void func_80A3CEE0(ObjVspinyroll* this, GlobalContext* globalCtx);
|
||||
void func_80A3CF4C(ObjVspinyroll* this, GlobalContext* globalCtx);
|
||||
void func_80A3CFAC(ObjVspinyroll* this);
|
||||
void func_80A3CFE0(ObjVspinyroll* this, GlobalContext* globalCtx);
|
||||
void func_80A3D024(ObjVspinyroll* this);
|
||||
void func_80A3D038(ObjVspinyroll* this, GlobalContext* globalCtx);
|
||||
void func_80A3D0E8(ObjVspinyroll* this);
|
||||
void func_80A3D0FC(ObjVspinyroll* this, GlobalContext* globalCtx);
|
||||
void func_80A3D2C0(Actor* thisx, GlobalContext* globalCtx);
|
||||
|
||||
#if 0
|
||||
const ActorInit Obj_Vspinyroll_InitVars = {
|
||||
ACTOR_OBJ_VSPINYROLL,
|
||||
ACTORCAT_PROP,
|
||||
|
@ -34,77 +39,419 @@ const ActorInit Obj_Vspinyroll_InitVars = {
|
|||
(ActorFunc)ObjVspinyroll_Draw,
|
||||
};
|
||||
|
||||
// static ColliderCylinderInit sCylinderInit = {
|
||||
static ColliderCylinderInit D_80A3D488 = {
|
||||
{ COLTYPE_METAL, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_HARD | AC_TYPE_PLAYER, OC1_NONE, OC2_NONE, COLSHAPE_CYLINDER, },
|
||||
{ ELEMTYPE_UNK0, { 0x20000000, 0x00, 0x04 }, { 0x01C37BB6, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE, },
|
||||
f32 D_80A3D450[] = { 1.0f, 2.0f };
|
||||
|
||||
f32 D_80A3D458[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f };
|
||||
|
||||
s16 D_80A3D478[] = { 1, 10, 20, 30, 40, 50, 60, 70 };
|
||||
|
||||
static ColliderCylinderInit sCylinderInit = {
|
||||
{
|
||||
COLTYPE_METAL,
|
||||
AT_ON | AT_TYPE_ENEMY,
|
||||
AC_ON | AC_HARD | AC_TYPE_PLAYER,
|
||||
OC1_NONE,
|
||||
OC2_NONE,
|
||||
COLSHAPE_CYLINDER,
|
||||
},
|
||||
{
|
||||
ELEMTYPE_UNK0,
|
||||
{ 0x20000000, 0x00, 0x04 },
|
||||
{ 0x01C37BB6, 0x00, 0x00 },
|
||||
TOUCH_ON | TOUCH_SFX_NORMAL,
|
||||
BUMP_ON,
|
||||
OCELEM_NONE,
|
||||
},
|
||||
{ 30, 120, 0, { 0, 0, 0 } },
|
||||
};
|
||||
|
||||
// static InitChainEntry sInitChain[] = {
|
||||
static InitChainEntry D_80A3D4D4[] = {
|
||||
f32 D_80A3D4B4[] = { 1.0f, 1.0f, -1.0f, -1.0f };
|
||||
|
||||
f32 D_80A3D4C4[] = { 29.0f, -29.0f, 29.0f, -29.0f };
|
||||
|
||||
static InitChainEntry sInitChain[] = {
|
||||
ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE),
|
||||
ICHAIN_F32(uncullZoneDownward, 500, ICHAIN_STOP),
|
||||
};
|
||||
|
||||
s16 D_80A3D4DC[] = { 0xFA0, -0xFA0 };
|
||||
|
||||
void func_80A3C4E0(Vec3f* arg0, Vec3f* arg1, s16 arg2) {
|
||||
f32 sp1C = Math_SinS(arg2);
|
||||
f32 temp_f0 = Math_CosS(arg2);
|
||||
|
||||
arg0->x = (arg1->z * sp1C) + (arg1->x * temp_f0);
|
||||
arg0->y = arg1->y;
|
||||
arg0->z = (arg1->z * temp_f0) - (arg1->x * sp1C);
|
||||
}
|
||||
|
||||
void func_80A3C560(ObjVspinyroll* this) {
|
||||
f32 magnitude;
|
||||
Vec3f* sp20 = &this->unk_39C[this->unk_398 ^ 1];
|
||||
|
||||
Math_Vec3f_Diff(sp20, &this->dyna.actor.world.pos, &this->unk_3B4);
|
||||
magnitude = Math3D_Vec3fMagnitude(&this->unk_3B4);
|
||||
if (magnitude < 0.01f) {
|
||||
Math_Vec3f_Diff(sp20, &this->unk_39C[this->unk_398], &this->unk_3B4);
|
||||
magnitude = Math3D_Vec3fMagnitude(&this->unk_3B4);
|
||||
if (magnitude < 0.01f) {
|
||||
Math_Vec3f_Copy(&this->unk_3B4, &gZeroVec3f);
|
||||
return;
|
||||
}
|
||||
}
|
||||
Math_Vec3f_Scale(&this->unk_3B4, 1.0f / magnitude);
|
||||
}
|
||||
|
||||
void func_80A3C658(ObjVspinyroll* this) {
|
||||
this->dyna.actor.world.rot.y = Math_Vec3f_Yaw(&this->dyna.actor.world.pos, &this->unk_39C[this->unk_398 ^ 1]);
|
||||
}
|
||||
|
||||
void func_80A3C6A0(ObjVspinyroll* this) {
|
||||
this->unk_398 = 0;
|
||||
func_80A3C658(this);
|
||||
func_80A3C560(this);
|
||||
}
|
||||
|
||||
void func_80A3C6CC(ObjVspinyroll* this) {
|
||||
this->unk_398 ^= 1;
|
||||
func_80A3C658(this);
|
||||
func_80A3C560(this);
|
||||
}
|
||||
|
||||
s32 func_80A3C700(ObjVspinyroll* this) {
|
||||
s32 pad;
|
||||
s32 sp30 = this->unk_398 ^ 1;
|
||||
Vec3f sp24;
|
||||
|
||||
Math_StepToF(&this->dyna.actor.speedXZ, this->unk_394, this->unk_394 * 0.2f);
|
||||
|
||||
this->dyna.actor.world.pos.x += this->dyna.actor.speedXZ * this->unk_3B4.x;
|
||||
this->dyna.actor.world.pos.y += this->dyna.actor.speedXZ * this->unk_3B4.y;
|
||||
this->dyna.actor.world.pos.z += this->dyna.actor.speedXZ * this->unk_3B4.z;
|
||||
|
||||
Math_Vec3f_Diff(&this->unk_39C[sp30], &this->dyna.actor.world.pos, &sp24);
|
||||
return Math3D_LengthSquared(&sp24) < (SQ(this->dyna.actor.speedXZ) + 0.05f);
|
||||
}
|
||||
|
||||
void func_80A3C7E8(ObjVspinyroll* this) {
|
||||
f32 phi_f2;
|
||||
s32 i;
|
||||
s32 j;
|
||||
f32 tempf;
|
||||
s32 index = D_80A3D450[OBJVSPINYROLL_GET_4000(&this->dyna.actor)] * 120.0f * (1.0f / 58.0f);
|
||||
|
||||
index += 2;
|
||||
this->unk_38C = index * 4;
|
||||
|
||||
tempf = ((D_80A3D450[OBJVSPINYROLL_GET_4000(&this->dyna.actor)] * 120.0f) - 2.0f) / (index - 1);
|
||||
phi_f2 = 1.0f;
|
||||
|
||||
for (i = 0, j = 0; i < this->unk_38C; i++) {
|
||||
this->unk_1A8[i].unk_00.x = D_80A3D4C4[j];
|
||||
this->unk_1A8[i].unk_00.y = phi_f2;
|
||||
this->unk_1A8[i].unk_00.z = D_80A3D4B4[j];
|
||||
|
||||
j++;
|
||||
if (j >= 4) {
|
||||
j = 0;
|
||||
phi_f2 += tempf;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef NON_MATCHING
|
||||
s32 func_80A3C8D8(ObjVspinyroll* this, GlobalContext* globalCtx, Vec3f* arg2, s32 arg3) {
|
||||
s32 pad;
|
||||
ObjVspinyrollStruct2* ptr = &this->unk_1A8[0];
|
||||
s32 pad2;
|
||||
s32 i;
|
||||
Vec3f spE4;
|
||||
Vec3f spD8;
|
||||
Vec3f spCC;
|
||||
Vec3f spC0;
|
||||
Vec3f spB4;
|
||||
Vec3f spA8;
|
||||
f32 temp_f20 = FLT_MAX;
|
||||
f32 temp_f0;
|
||||
s32 sp9C;
|
||||
|
||||
spE4.z = 0.0f;
|
||||
sp9C = false;
|
||||
this->unk_388 = NULL;
|
||||
|
||||
for (i = 0; i < this->unk_38C; i++, ptr++) {
|
||||
spE4.x = ptr->unk_00.x;
|
||||
spE4.y = ptr->unk_00.y;
|
||||
func_80A3C4E0(&spD8, &spE4, this->dyna.actor.world.rot.y);
|
||||
|
||||
spD8.x += this->dyna.actor.world.pos.x;
|
||||
spD8.y += this->dyna.actor.world.pos.y;
|
||||
spD8.z += this->dyna.actor.world.pos.z;
|
||||
|
||||
Math_Vec3f_Copy(&spCC, &spD8);
|
||||
|
||||
spCC.x += 30.0f * this->unk_3B4.x;
|
||||
spCC.z += 30.0f * this->unk_3B4.z;
|
||||
|
||||
if (BgCheck_EntityLineTest3(&globalCtx->colCtx, &spD8, &spCC, &spC0, &this->unk_1A8[i].collisionPoly, true,
|
||||
false, false, true, &this->unk_1A8[i].bgId, &this->dyna.actor, 0.0f)) {
|
||||
if ((arg3 != 0) && (this->dyna.actor.flags & ACTOR_FLAG_40)) {
|
||||
spA8.x = ptr->unk_00.x * 0.2f;
|
||||
spA8.y = ptr->unk_00.y;
|
||||
spA8.z = 20.0f;
|
||||
|
||||
func_80A3C4E0(&spB4, &spA8, this->dyna.actor.world.rot.y);
|
||||
|
||||
spB4.x += this->dyna.actor.world.pos.x;
|
||||
spB4.y += this->dyna.actor.world.pos.y;
|
||||
spB4.z += this->dyna.actor.world.pos.z;
|
||||
|
||||
EffectSsHitMark_SpawnFixedScale(globalCtx, 3, &spB4);
|
||||
Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_IT_SHIELD_REFLECT_SW);
|
||||
}
|
||||
|
||||
temp_f0 = Math3D_Vec3fDistSq(&spD8, &spC0);
|
||||
if (temp_f0 < temp_f20) {
|
||||
temp_f20 = temp_f0;
|
||||
sp9C = true;
|
||||
Math_Vec3f_Diff(&spC0, &spCC, arg2);
|
||||
this->unk_388 = ptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return sp9C;
|
||||
}
|
||||
#else
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3C8D8.s")
|
||||
#endif
|
||||
|
||||
extern ColliderCylinderInit D_80A3D488;
|
||||
extern InitChainEntry D_80A3D4D4[];
|
||||
s32 func_80A3CB94(ObjVspinyroll* this, GlobalContext* globalCtx, s32 arg2) {
|
||||
Vec3f sp1C;
|
||||
|
||||
extern UNK_TYPE D_06000460;
|
||||
extern UNK_TYPE D_06000F80;
|
||||
if (func_80A3C8D8(this, globalCtx, &sp1C, arg2)) {
|
||||
this->dyna.actor.world.pos.x += sp1C.x;
|
||||
this->dyna.actor.world.pos.z += sp1C.z;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3C4E0.s")
|
||||
DynaPolyActor* func_80A3CBF0(ObjVspinyroll* this, GlobalContext* globalCtx) {
|
||||
if (this->unk_388 != NULL) {
|
||||
return DynaPoly_GetActor(&globalCtx->colCtx, this->unk_388->bgId);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3C560.s")
|
||||
s32 func_80A3CC30(ObjVspinyroll* this, GlobalContext* globalCtx) {
|
||||
DynaPolyActor* actor = func_80A3CBF0(this, globalCtx);
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3C658.s")
|
||||
if ((actor != NULL) && (Math3D_Vec3fDistSq(&actor->actor.world.pos, &actor->actor.prevPos) > 0.0001f)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3C6A0.s")
|
||||
void func_80A3CC84(f32 arg0) {
|
||||
MtxF* matrix = Matrix_GetCurrentState();
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3C6CC.s")
|
||||
matrix->wy += arg0;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3C700.s")
|
||||
void ObjVspinyroll_Init(Actor* thisx, GlobalContext* globalCtx) {
|
||||
s32 pad;
|
||||
ObjVspinyroll* this = THIS;
|
||||
s32 params = OBJVSPINYROLL_GET_4000(&this->dyna.actor);
|
||||
f32 sp40 = D_80A3D450[params];
|
||||
s32 pad2;
|
||||
Path* path;
|
||||
Vec3s* points;
|
||||
Vec3s* point1;
|
||||
Vec3s* point2;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3C7E8.s")
|
||||
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3C8D8.s")
|
||||
this->dyna.actor.world.rot.x = 0;
|
||||
this->dyna.actor.world.rot.z = 0;
|
||||
this->dyna.actor.shape.rot.x = 0;
|
||||
this->dyna.actor.shape.rot.z = 0;
|
||||
this->dyna.actor.scale.y = 0.1f * sp40;
|
||||
this->dyna.actor.scale.z = 0.1f;
|
||||
this->dyna.actor.uncullZoneScale = 300.0f * sp40;
|
||||
this->dyna.actor.scale.x = 0.1f;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3CB94.s")
|
||||
DynaPolyActor_Init(&this->dyna, 0);
|
||||
DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &object_spinyroll_Colheader_000F80);
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3CBF0.s")
|
||||
Collider_InitCylinder(globalCtx, &this->collider);
|
||||
Collider_SetCylinder(globalCtx, &this->collider, &this->dyna.actor, &sCylinderInit);
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3CC30.s")
|
||||
if (params == OBJVSPINYROLL_4000_1) {
|
||||
this->dyna.actor.draw = func_80A3D2C0;
|
||||
this->collider.dim.height = 240;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3CC84.s")
|
||||
if (OBJVSPINYROLL_GET_7F(&this->dyna.actor) == OBJVSPINYROLL_7F_7F) {
|
||||
func_80A3CEC4(this);
|
||||
return;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/ObjVspinyroll_Init.s")
|
||||
this->dyna.actor.world.rot.y = 0;
|
||||
func_80A3C7E8(this);
|
||||
this->unk_394 = D_80A3D458[OBJVSPINYROLL_GET_380(thisx)];
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/ObjVspinyroll_Destroy.s")
|
||||
path = &globalCtx->setupPathList[OBJVSPINYROLL_GET_7F(&this->dyna.actor)];
|
||||
points = Lib_SegmentedToVirtual(path->points);
|
||||
point1 = &points[0];
|
||||
point2 = &points[1];
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3CEC4.s")
|
||||
Math_Vec3s_ToVec3f(&this->unk_39C[0], point1);
|
||||
Math_Vec3s_ToVec3f(&this->unk_39C[1], point2);
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3CEE0.s")
|
||||
Math_Vec3f_Copy(&this->dyna.actor.world.pos, &this->unk_39C[0]);
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3CF10.s")
|
||||
func_80A3C6A0(this);
|
||||
this->dyna.actor.shape.rot.y = this->dyna.actor.world.rot.y;
|
||||
func_80A3CFAC(this);
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3CF4C.s")
|
||||
void ObjVspinyroll_Destroy(Actor* thisx, GlobalContext* globalCtx) {
|
||||
ObjVspinyroll* this = THIS;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3CFAC.s")
|
||||
DynaPoly_DeleteBgActor(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
|
||||
Collider_DestroyCylinder(globalCtx, &this->collider);
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3CFE0.s")
|
||||
void func_80A3CEC4(ObjVspinyroll* this) {
|
||||
this->dyna.actor.speedXZ = 0.0f;
|
||||
this->actionFunc = func_80A3CEE0;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3D024.s")
|
||||
void func_80A3CEE0(ObjVspinyroll* this, GlobalContext* globalCtx) {
|
||||
this->unk_3C0 += 0x6E;
|
||||
if (this->unk_3C0 > 0xFA0) {
|
||||
this->unk_3C0 = 0xFA0;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3D038.s")
|
||||
void func_80A3CF10(ObjVspinyroll* this) {
|
||||
this->actionFunc = func_80A3CF4C;
|
||||
this->unk_3C8 = D_80A3D478[OBJVSPINYROLL_GET_1C00(&this->dyna.actor)];
|
||||
this->dyna.actor.speedXZ = 0.0f;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3D0E8.s")
|
||||
void func_80A3CF4C(ObjVspinyroll* this, GlobalContext* globalCtx) {
|
||||
if (Math_ScaledStepToS(&this->unk_3C0, 0, this->unk_3C4) && (this->unk_3C8 > 0)) {
|
||||
this->unk_3C8--;
|
||||
if (this->unk_3C8 <= 0) {
|
||||
func_80A3CFAC(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3D0FC.s")
|
||||
void func_80A3CFAC(ObjVspinyroll* this) {
|
||||
this->actionFunc = func_80A3CFE0;
|
||||
this->unk_3C2 = D_80A3D4DC[this->unk_398];
|
||||
this->dyna.actor.speedXZ = 0.0f;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/ObjVspinyroll_Update.s")
|
||||
void func_80A3CFE0(ObjVspinyroll* this, GlobalContext* globalCtx) {
|
||||
if (Math_ScaledStepToS(&this->unk_3C0, this->unk_3C2, 0x6E)) {
|
||||
func_80A3D024(this);
|
||||
}
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/ObjVspinyroll_Draw.s")
|
||||
void func_80A3D024(ObjVspinyroll* this) {
|
||||
this->actionFunc = func_80A3D038;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Vspinyroll/func_80A3D2C0.s")
|
||||
void func_80A3D038(ObjVspinyroll* this, GlobalContext* globalCtx) {
|
||||
s32 sp24 = func_80A3C700(this);
|
||||
|
||||
if (func_80A3CB94(this, globalCtx, 1)) {
|
||||
this->unk_3C4 = 0x7D0;
|
||||
if (func_80A3CBF0(this, globalCtx) != NULL) {
|
||||
func_80A3D0E8(this);
|
||||
} else {
|
||||
func_80A3C6CC(this);
|
||||
func_80A3CF10(this);
|
||||
}
|
||||
} else if (sp24 != 0) {
|
||||
func_80A3C6CC(this);
|
||||
this->unk_3C4 = 120;
|
||||
func_80A3CF10(this);
|
||||
}
|
||||
}
|
||||
|
||||
void func_80A3D0E8(ObjVspinyroll* this) {
|
||||
this->actionFunc = func_80A3D0FC;
|
||||
}
|
||||
|
||||
void func_80A3D0FC(ObjVspinyroll* this, GlobalContext* globalCtx) {
|
||||
s32 sp24 = true;
|
||||
|
||||
Math_ScaledStepToS(&this->unk_3C0, 0, this->unk_3C4);
|
||||
if (func_80A3CB94(this, globalCtx, 0) && func_80A3CC30(this, globalCtx)) {
|
||||
sp24 = false;
|
||||
}
|
||||
|
||||
if (sp24) {
|
||||
func_80A3C6CC(this);
|
||||
func_80A3CF10(this);
|
||||
}
|
||||
}
|
||||
|
||||
void ObjVspinyroll_Update(Actor* thisx, GlobalContext* globalCtx2) {
|
||||
GlobalContext* globalCtx = globalCtx2;
|
||||
ObjVspinyroll* this = THIS;
|
||||
|
||||
this->actionFunc(this, globalCtx);
|
||||
|
||||
this->unk_3C6 += this->unk_3C0;
|
||||
|
||||
Collider_UpdateCylinder(&this->dyna.actor, &this->collider);
|
||||
CollisionCheck_SetAT(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
|
||||
CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
|
||||
}
|
||||
|
||||
void ObjVspinyroll_Draw(Actor* thisx, GlobalContext* globalCtx) {
|
||||
ObjVspinyroll* this = THIS;
|
||||
|
||||
Matrix_InsertTranslation(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y + 60.0f,
|
||||
this->dyna.actor.world.pos.z, MTXMODE_NEW);
|
||||
Matrix_RotateY(this->dyna.actor.shape.rot.y, MTXMODE_APPLY);
|
||||
Matrix_InsertZRotation_s(this->dyna.actor.shape.rot.z + 0x4000, MTXMODE_APPLY);
|
||||
Matrix_InsertXRotation_s(this->dyna.actor.shape.rot.x + this->unk_3C6, MTXMODE_APPLY);
|
||||
Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
|
||||
Gfx_DrawDListOpa(globalCtx, object_spinyroll_DL_000460);
|
||||
}
|
||||
|
||||
void func_80A3D2C0(Actor* thisx, GlobalContext* globalCtx) {
|
||||
ObjVspinyroll* this = THIS;
|
||||
Vec3s sp3C;
|
||||
|
||||
OPEN_DISPS(globalCtx->state.gfxCtx);
|
||||
|
||||
sp3C.x = this->dyna.actor.shape.rot.x + this->unk_3C6;
|
||||
sp3C.y = this->dyna.actor.shape.rot.y;
|
||||
sp3C.z = this->dyna.actor.shape.rot.z + 0x4000;
|
||||
|
||||
func_8012C28C(globalCtx->state.gfxCtx);
|
||||
Matrix_InsertTranslation(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y + 60.0f,
|
||||
this->dyna.actor.world.pos.z, MTXMODE_NEW);
|
||||
Matrix_RotateY(sp3C.y, MTXMODE_APPLY);
|
||||
Matrix_InsertZRotation_s(sp3C.z, MTXMODE_APPLY);
|
||||
Matrix_InsertXRotation_s(sp3C.x, MTXMODE_APPLY);
|
||||
Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
|
||||
|
||||
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
gSPDisplayList(POLY_OPA_DISP++, object_spinyroll_DL_000460);
|
||||
|
||||
func_80A3CC84(120.0f);
|
||||
|
||||
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
gSPDisplayList(POLY_OPA_DISP++, object_spinyroll_DL_000460);
|
||||
|
||||
CLOSE_DISPS(globalCtx->state.gfxCtx);
|
||||
}
|
||||
|
|
|
@ -7,11 +7,36 @@ struct ObjVspinyroll;
|
|||
|
||||
typedef void (*ObjVspinyrollActionFunc)(struct ObjVspinyroll*, GlobalContext*);
|
||||
|
||||
#define OBJVSPINYROLL_GET_7F(thisx) ((thisx)->params & 0x7F)
|
||||
#define OBJVSPINYROLL_GET_380(thisx) (((thisx)->params >> 7) & 7)
|
||||
#define OBJVSPINYROLL_GET_1C00(thisx) (((thisx)->params >> 0xA) & 7)
|
||||
#define OBJVSPINYROLL_GET_4000(thisx) (((thisx)->params >> 0xE) & 1)
|
||||
|
||||
#define OBJVSPINYROLL_7F_7F 0x7F
|
||||
#define OBJVSPINYROLL_4000_1 1
|
||||
|
||||
typedef struct {
|
||||
/* 0x00 */ Vec3f unk_00;
|
||||
/* 0x0C */ CollisionPoly* collisionPoly;
|
||||
/* 0x10 */ s32 bgId;
|
||||
} ObjVspinyrollStruct2; // size = 0x14
|
||||
|
||||
typedef struct ObjVspinyroll {
|
||||
/* 0x0000 */ Actor actor;
|
||||
/* 0x0144 */ char unk_144[0x24C];
|
||||
/* 0x0000 */ DynaPolyActor dyna;
|
||||
/* 0x015C */ ColliderCylinder collider;
|
||||
/* 0x01A8 */ ObjVspinyrollStruct2 unk_1A8[24];
|
||||
/* 0x0388 */ ObjVspinyrollStruct2* unk_388;
|
||||
/* 0x038C */ s32 unk_38C;
|
||||
/* 0x0390 */ ObjVspinyrollActionFunc actionFunc;
|
||||
/* 0x0394 */ char unk_394[0x38];
|
||||
/* 0x0394 */ f32 unk_394;
|
||||
/* 0x0398 */ s32 unk_398;
|
||||
/* 0x039C */ Vec3f unk_39C[2];
|
||||
/* 0x03B4 */ Vec3f unk_3B4;
|
||||
/* 0x03C0 */ s16 unk_3C0;
|
||||
/* 0x03C2 */ s16 unk_3C2;
|
||||
/* 0x03C4 */ s16 unk_3C4;
|
||||
/* 0x03C6 */ s16 unk_3C6;
|
||||
/* 0x03C8 */ s16 unk_3C8;
|
||||
} ObjVspinyroll; // size = 0x3CC
|
||||
|
||||
extern const ActorInit Obj_Vspinyroll_InitVars;
|
||||
|
|
|
@ -1895,11 +1895,6 @@ D_06000098 = 0x06000098;
|
|||
D_06000838 = 0x06000838;
|
||||
D_060022AC = 0x060022AC;
|
||||
|
||||
// ovl_Obj_Vspinyroll
|
||||
|
||||
D_06000460 = 0x06000460;
|
||||
D_06000F80 = 0x06000F80;
|
||||
|
||||
// ovl_Obj_Y2lift
|
||||
|
||||
D_06001680 = 0x06001680;
|
||||
|
|
Loading…
Reference in New Issue