mirror of https://github.com/zeldaret/mm.git
				
				
				
			Obj_Spinyroll (2 non-matching) (#635)
* Obj_Spinyroll * syms * PR * PR * PR
This commit is contained in:
		
							parent
							
								
									ad25a1dc47
								
							
						
					
					
						commit
						47ef03494b
					
				
							
								
								
									
										5
									
								
								spec
								
								
								
								
							
							
						
						
									
										5
									
								
								spec
								
								
								
								
							| 
						 | 
					@ -2619,8 +2619,11 @@ beginseg
 | 
				
			||||||
    name "ovl_Obj_Spinyroll"
 | 
					    name "ovl_Obj_Spinyroll"
 | 
				
			||||||
    compress
 | 
					    compress
 | 
				
			||||||
    include "build/src/overlays/actors/ovl_Obj_Spinyroll/z_obj_spinyroll.o"
 | 
					    include "build/src/overlays/actors/ovl_Obj_Spinyroll/z_obj_spinyroll.o"
 | 
				
			||||||
    include "build/data/ovl_Obj_Spinyroll/ovl_Obj_Spinyroll.data.o"
 | 
					#ifdef NON_MATCHING
 | 
				
			||||||
 | 
					    include "build/src/overlays/actors/ovl_Obj_Spinyroll/ovl_Obj_Spinyroll_reloc.o"
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
    include "build/data/ovl_Obj_Spinyroll/ovl_Obj_Spinyroll.reloc.o"
 | 
					    include "build/data/ovl_Obj_Spinyroll/ovl_Obj_Spinyroll.reloc.o"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
endseg
 | 
					endseg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
beginseg
 | 
					beginseg
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,7 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "z_obj_spinyroll.h"
 | 
					#include "z_obj_spinyroll.h"
 | 
				
			||||||
 | 
					#include "objects/object_spinyroll/object_spinyroll.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define FLAGS (ACTOR_FLAG_10)
 | 
					#define FLAGS (ACTOR_FLAG_10)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +16,18 @@ void ObjSpinyroll_Destroy(Actor* thisx, GlobalContext* globalCtx);
 | 
				
			||||||
void ObjSpinyroll_Update(Actor* thisx, GlobalContext* globalCtx);
 | 
					void ObjSpinyroll_Update(Actor* thisx, GlobalContext* globalCtx);
 | 
				
			||||||
void ObjSpinyroll_Draw(Actor* thisx, GlobalContext* globalCtx);
 | 
					void ObjSpinyroll_Draw(Actor* thisx, GlobalContext* globalCtx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if 0
 | 
					void func_80A1E9C4(ObjSpinyroll* this);
 | 
				
			||||||
 | 
					void func_80A1E9E0(ObjSpinyroll* this, GlobalContext* globalCtx);
 | 
				
			||||||
 | 
					void func_80A1EA4C(ObjSpinyroll* this, GlobalContext* globalCtx);
 | 
				
			||||||
 | 
					void func_80A1EAAC(ObjSpinyroll* this);
 | 
				
			||||||
 | 
					void func_80A1EAE0(ObjSpinyroll* this, GlobalContext* globalCtx);
 | 
				
			||||||
 | 
					void func_80A1EB40(ObjSpinyroll* this);
 | 
				
			||||||
 | 
					void func_80A1EB54(ObjSpinyroll* this, GlobalContext* globalCtx);
 | 
				
			||||||
 | 
					void func_80A1EC24(ObjSpinyroll* this);
 | 
				
			||||||
 | 
					void func_80A1EC38(ObjSpinyroll* this, GlobalContext* globalCtx);
 | 
				
			||||||
 | 
					void func_80A1ECC0(ObjSpinyroll* this);
 | 
				
			||||||
 | 
					void func_80A1ECD4(ObjSpinyroll* this, GlobalContext* globalCtx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const ActorInit Obj_Spinyroll_InitVars = {
 | 
					const ActorInit Obj_Spinyroll_InitVars = {
 | 
				
			||||||
    ACTOR_OBJ_SPINYROLL,
 | 
					    ACTOR_OBJ_SPINYROLL,
 | 
				
			||||||
    ACTORCAT_PROP,
 | 
					    ACTORCAT_PROP,
 | 
				
			||||||
| 
						 | 
					@ -28,121 +40,669 @@ const ActorInit Obj_Spinyroll_InitVars = {
 | 
				
			||||||
    (ActorFunc)ObjSpinyroll_Draw,
 | 
					    (ActorFunc)ObjSpinyroll_Draw,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// static ColliderTrisElementInit sTrisElementsInit[6] = {
 | 
					static ColliderTrisElementInit sTrisElementsInit[] = {
 | 
				
			||||||
static ColliderTrisElementInit D_80A1F040[6] = {
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        { ELEMTYPE_UNK0, { 0x20000000, 0x00, 0x04 }, { 0x01C37BB6, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE, },
 | 
					        {
 | 
				
			||||||
 | 
					            ELEMTYPE_UNK0,
 | 
				
			||||||
 | 
					            { 0x20000000, 0x00, 0x04 },
 | 
				
			||||||
 | 
					            { 0x01C37BB6, 0x00, 0x00 },
 | 
				
			||||||
 | 
					            TOUCH_ON | TOUCH_SFX_NORMAL,
 | 
				
			||||||
 | 
					            BUMP_ON,
 | 
				
			||||||
 | 
					            OCELEM_NONE,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        { { { -60.0f, 0.0f, 17.0f }, { 60.0f, 0.0f, 17.0f }, { 60.0f, 40.0f, 17.0f } } },
 | 
					        { { { -60.0f, 0.0f, 17.0f }, { 60.0f, 0.0f, 17.0f }, { 60.0f, 40.0f, 17.0f } } },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        { ELEMTYPE_UNK0, { 0x20000000, 0x00, 0x04 }, { 0x01C37BB6, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE, },
 | 
					        {
 | 
				
			||||||
 | 
					            ELEMTYPE_UNK0,
 | 
				
			||||||
 | 
					            { 0x20000000, 0x00, 0x04 },
 | 
				
			||||||
 | 
					            { 0x01C37BB6, 0x00, 0x00 },
 | 
				
			||||||
 | 
					            TOUCH_ON | TOUCH_SFX_NORMAL,
 | 
				
			||||||
 | 
					            BUMP_ON,
 | 
				
			||||||
 | 
					            OCELEM_NONE,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        { { { -60.0f, 0.0f, 17.0f }, { 60.0f, 40.0f, 17.0f }, { -60.0f, 40.0f, 17.0f } } },
 | 
					        { { { -60.0f, 0.0f, 17.0f }, { 60.0f, 40.0f, 17.0f }, { -60.0f, 40.0f, 17.0f } } },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        { ELEMTYPE_UNK0, { 0x20000000, 0x00, 0x04 }, { 0x01C37BB6, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE, },
 | 
					        {
 | 
				
			||||||
 | 
					            ELEMTYPE_UNK0,
 | 
				
			||||||
 | 
					            { 0x20000000, 0x00, 0x04 },
 | 
				
			||||||
 | 
					            { 0x01C37BB6, 0x00, 0x00 },
 | 
				
			||||||
 | 
					            TOUCH_ON | TOUCH_SFX_NORMAL,
 | 
				
			||||||
 | 
					            BUMP_ON,
 | 
				
			||||||
 | 
					            OCELEM_NONE,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        { { { 60.0f, 0.0f, -17.0f }, { -60.0f, 0.0f, -17.0f }, { -60.0f, 40.0f, -17.0f } } },
 | 
					        { { { 60.0f, 0.0f, -17.0f }, { -60.0f, 0.0f, -17.0f }, { -60.0f, 40.0f, -17.0f } } },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        { ELEMTYPE_UNK0, { 0x20000000, 0x00, 0x04 }, { 0x01C37BB6, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE, },
 | 
					        {
 | 
				
			||||||
 | 
					            ELEMTYPE_UNK0,
 | 
				
			||||||
 | 
					            { 0x20000000, 0x00, 0x04 },
 | 
				
			||||||
 | 
					            { 0x01C37BB6, 0x00, 0x00 },
 | 
				
			||||||
 | 
					            TOUCH_ON | TOUCH_SFX_NORMAL,
 | 
				
			||||||
 | 
					            BUMP_ON,
 | 
				
			||||||
 | 
					            OCELEM_NONE,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        { { { 60.0f, 0.0f, -17.0f }, { -60.0f, 40.0f, -17.0f }, { 60.0f, 40.0f, -17.0f } } },
 | 
					        { { { 60.0f, 0.0f, -17.0f }, { -60.0f, 40.0f, -17.0f }, { 60.0f, 40.0f, -17.0f } } },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        { ELEMTYPE_UNK0, { 0xF7CFFFFF, 0x04, 0x04 }, { 0x01C37BB6, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE, },
 | 
					        {
 | 
				
			||||||
 | 
					            ELEMTYPE_UNK0,
 | 
				
			||||||
 | 
					            { 0xF7CFFFFF, 0x04, 0x04 },
 | 
				
			||||||
 | 
					            { 0x01C37BB6, 0x00, 0x00 },
 | 
				
			||||||
 | 
					            TOUCH_ON | TOUCH_SFX_NORMAL,
 | 
				
			||||||
 | 
					            BUMP_ON,
 | 
				
			||||||
 | 
					            OCELEM_NONE,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        { { { 60.0f, 20.0f, -12.0f }, { -60.0f, 20.0f, -12.0f }, { -60.0f, 20.0f, 12.0f } } },
 | 
					        { { { 60.0f, 20.0f, -12.0f }, { -60.0f, 20.0f, -12.0f }, { -60.0f, 20.0f, 12.0f } } },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        { ELEMTYPE_UNK0, { 0xF7CFFFFF, 0x04, 0x04 }, { 0x01C37BB6, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE, },
 | 
					        {
 | 
				
			||||||
 | 
					            ELEMTYPE_UNK0,
 | 
				
			||||||
 | 
					            { 0xF7CFFFFF, 0x04, 0x04 },
 | 
				
			||||||
 | 
					            { 0x01C37BB6, 0x00, 0x00 },
 | 
				
			||||||
 | 
					            TOUCH_ON | TOUCH_SFX_NORMAL,
 | 
				
			||||||
 | 
					            BUMP_ON,
 | 
				
			||||||
 | 
					            OCELEM_NONE,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        { { { 60.0f, 20.0f, -12.0f }, { -60.0f, 20.0f, 12.0f }, { 60.0f, 20.0f, 12.0f } } },
 | 
					        { { { 60.0f, 20.0f, -12.0f }, { -60.0f, 20.0f, 12.0f }, { 60.0f, 20.0f, 12.0f } } },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// static ColliderTrisInit sTrisInit = {
 | 
					static ColliderTrisInit sTrisInit = {
 | 
				
			||||||
static ColliderTrisInit D_80A1F1A8 = {
 | 
					    {
 | 
				
			||||||
    { COLTYPE_METAL, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_HARD | AC_TYPE_PLAYER, OC1_NONE, OC2_NONE, COLSHAPE_TRIS, },
 | 
					        COLTYPE_METAL,
 | 
				
			||||||
    6, D_80A1F040, // sTrisElementsInit,
 | 
					        AT_ON | AT_TYPE_ENEMY,
 | 
				
			||||||
 | 
					        AC_ON | AC_HARD | AC_TYPE_PLAYER,
 | 
				
			||||||
 | 
					        OC1_NONE,
 | 
				
			||||||
 | 
					        OC2_NONE,
 | 
				
			||||||
 | 
					        COLSHAPE_TRIS,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    6,
 | 
				
			||||||
 | 
					    sTrisElementsInit,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// static InitChainEntry sInitChain[] = {
 | 
					f32 D_80A1F1B8[] = { 1.0f, 2.0f, 4.0f };
 | 
				
			||||||
static InitChainEntry D_80A1F204[] = {
 | 
					
 | 
				
			||||||
 | 
					f32 D_80A1F1C4[] = {
 | 
				
			||||||
 | 
					    1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					s16 D_80A1F1E4[] = {
 | 
				
			||||||
 | 
					    1, 10, 20, 30, 40, 50, 60, 70,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					f32 D_80A1F1F4[] = { 30.0f, -30.0f };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					f32 D_80A1F1FC[] = { 9.0f, -9.0f };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static InitChainEntry sInitChain[] = {
 | 
				
			||||||
    ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE),
 | 
					    ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE),
 | 
				
			||||||
    ICHAIN_F32(uncullZoneDownward, 500, ICHAIN_STOP),
 | 
					    ICHAIN_F32(uncullZoneDownward, 500, ICHAIN_STOP),
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					s16 D_80A1F20C[] = { 0xFA0, -0xFA0 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1DA50(GlobalContext* globalCtx, ObjSpinyroll* this, Vec3f* arg2, Vec3f* arg3) {
 | 
				
			||||||
 | 
					    Vec3f sp1C;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Math_Vec3f_Sum(arg2, arg3, &sp1C);
 | 
				
			||||||
 | 
					    Math_Vec3f_Scale(&sp1C, 0.5f);
 | 
				
			||||||
 | 
					    EffectSsHitMark_SpawnFixedScale(globalCtx, 3, &sp1C);
 | 
				
			||||||
 | 
					    Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_IT_SHIELD_REFLECT_SW);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1DAAC(Vec3f* arg0, Vec3f* arg1, s16 arg2) {
 | 
				
			||||||
 | 
					    f32 sp1C = Math_SinS(arg2);
 | 
				
			||||||
 | 
					    f32 sp18 = Math_CosS(arg2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    arg0->x = (arg1->z * sp1C) + (arg1->x * sp18);
 | 
				
			||||||
 | 
					    arg0->y = arg1->y;
 | 
				
			||||||
 | 
					    arg0->z = (arg1->z * sp18) - (arg1->x * sp1C);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1DB2C(Actor* thisx) {
 | 
				
			||||||
 | 
					    ObjSpinyroll* this = THIS;
 | 
				
			||||||
 | 
					    s32 i;
 | 
				
			||||||
 | 
					    s32 j;
 | 
				
			||||||
 | 
					    s32 params = OBJSPINYROLL_GET_C000(&this->dyna.actor);
 | 
				
			||||||
 | 
					    Vec3f sp7C[3];
 | 
				
			||||||
 | 
					    Vec3f sp70;
 | 
				
			||||||
 | 
					    f32 temp = D_80A1F1B8[params];
 | 
				
			||||||
 | 
					    ColliderTrisElementInit* ptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < ARRAY_COUNT(this->colliderElements); i++) {
 | 
				
			||||||
 | 
					        for (j = 0; j < ARRAY_COUNT(sp7C); j++) {
 | 
				
			||||||
 | 
					            ptr = &sTrisInit.elements[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sp70.x = ptr->dim.vtx[j].x * temp;
 | 
				
			||||||
 | 
					            sp70.y = ptr->dim.vtx[j].y;
 | 
				
			||||||
 | 
					            sp70.z = ptr->dim.vtx[j].z;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            func_80A1DAAC(&sp7C[j], &sp70, this->dyna.actor.shape.rot.y);
 | 
				
			||||||
 | 
					            Math_Vec3f_Sum(&sp7C[j], &this->dyna.actor.world.pos, &sp7C[j]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        Collider_SetTrisVertices(&this->collider, i, &sp7C[0], &sp7C[1], &sp7C[2]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1DC5C(ObjSpinyroll* this) {
 | 
				
			||||||
 | 
					    this->unk_4D8 += 0x5DC0;
 | 
				
			||||||
 | 
					    Math_StepToF(&this->unk_4D4, 0.0f, 0.32f);
 | 
				
			||||||
 | 
					    this->unk_4D0 = ((Math_SinS(this->unk_4D8) + 1.0f) * this->unk_4D4) + 24.0f;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1DCCC(ObjSpinyroll* this) {
 | 
				
			||||||
 | 
					    f32 phi_f2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (this->dyna.actor.speedXZ > 3.0f) {
 | 
				
			||||||
 | 
					        phi_f2 = 3.0f;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        phi_f2 = this->dyna.actor.speedXZ;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (this->unk_4D4 < phi_f2) {
 | 
				
			||||||
 | 
					        this->unk_4D4 = phi_f2;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1DD18(ObjSpinyroll* this) {
 | 
				
			||||||
 | 
					    f32 temp_f0;
 | 
				
			||||||
 | 
					    Vec3f* sp20 = &this->unk_4AC[this->unk_4A8 ^ 1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Math_Vec3f_Diff(sp20, &this->dyna.actor.world.pos, &this->unk_4C4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    temp_f0 = Math3D_Vec3fMagnitude(&this->unk_4C4);
 | 
				
			||||||
 | 
					    if (temp_f0 < 0.01f) {
 | 
				
			||||||
 | 
					        Math_Vec3f_Diff(sp20, &this->unk_4AC[this->unk_4A8], &this->unk_4C4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        temp_f0 = Math3D_Vec3fMagnitude(&this->unk_4C4);
 | 
				
			||||||
 | 
					        if (temp_f0 < 0.01f) {
 | 
				
			||||||
 | 
					            Math_Vec3f_Copy(&this->unk_4C4, &gZeroVec3f);
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Math_Vec3f_Scale(&this->unk_4C4, 1.0f / temp_f0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1DE10(ObjSpinyroll* this) {
 | 
				
			||||||
 | 
					    this->dyna.actor.world.rot.y = Math_Vec3f_Yaw(&this->dyna.actor.world.pos, &this->unk_4AC[this->unk_4A8 ^ 1]);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1DE58(ObjSpinyroll* this) {
 | 
				
			||||||
 | 
					    this->unk_4A8 = 0;
 | 
				
			||||||
 | 
					    func_80A1DE10(this);
 | 
				
			||||||
 | 
					    func_80A1DD18(this);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1DE84(ObjSpinyroll* this) {
 | 
				
			||||||
 | 
					    this->unk_4A8 ^= 1;
 | 
				
			||||||
 | 
					    func_80A1DE10(this);
 | 
				
			||||||
 | 
					    func_80A1DD18(this);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					s32 func_80A1DEB8(ObjSpinyroll* this) {
 | 
				
			||||||
 | 
					    s32 pad;
 | 
				
			||||||
 | 
					    s32 sp30 = this->unk_4A8 ^ 1;
 | 
				
			||||||
 | 
					    Vec3f sp24;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Math_StepToF(&this->dyna.actor.speedXZ, this->unk_4A4, this->unk_4A4 * 0.2f);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this->dyna.actor.world.pos.x += this->dyna.actor.speedXZ * this->unk_4C4.x;
 | 
				
			||||||
 | 
					    this->dyna.actor.world.pos.y += this->dyna.actor.speedXZ * this->unk_4C4.y;
 | 
				
			||||||
 | 
					    this->dyna.actor.world.pos.z += this->dyna.actor.speedXZ * this->unk_4C4.z;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Math_Vec3f_Diff(&this->unk_4AC[sp30], &this->dyna.actor.world.pos, &sp24);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return Math3D_LengthSquared(&sp24) < (SQ(this->dyna.actor.speedXZ) + 0.05f);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1DFA0(ObjSpinyroll* this) {
 | 
				
			||||||
 | 
					    f32 temp_f0;
 | 
				
			||||||
 | 
					    f32 phi_f12;
 | 
				
			||||||
 | 
					    s32 i;
 | 
				
			||||||
 | 
					    s32 j;
 | 
				
			||||||
 | 
					    f32 temp_f2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this->unk_3A4.unk_F4 = (s32)(D_80A1F1B8[OBJSPINYROLL_GET_C000(&this->dyna.actor)] * 120.0f * (1.0f / 58)) + 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    temp_f0 = (D_80A1F1B8[OBJSPINYROLL_GET_C000(&this->dyna.actor)] * 120.0f) - 2.0f;
 | 
				
			||||||
 | 
					    temp_f2 = temp_f0 / (this->unk_3A4.unk_F4 - 1);
 | 
				
			||||||
 | 
					    temp_f0 *= 0.5f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < ARRAY_COUNT(this->unk_3A4.unk_00); i++) {
 | 
				
			||||||
 | 
					        for (j = 0, phi_f12 = temp_f0; j < this->unk_3A4.unk_F4; j++, phi_f12 -= temp_f2) {
 | 
				
			||||||
 | 
					            this->unk_3A4.unk_00[i].unk_00[j].unk_00 = phi_f12;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef NON_MATCHING
 | 
				
			||||||
 | 
					// globalCtx not in s reg, something with ptr->unk_F0 = temp_s1; line
 | 
				
			||||||
 | 
					s32 func_80A1E074(ObjSpinyroll* this, GlobalContext* globalCtx, Vec3f* arg2, s32 arg3) {
 | 
				
			||||||
 | 
					    s32 i;
 | 
				
			||||||
 | 
					    s32 j;
 | 
				
			||||||
 | 
					    ObjSpinyrollStruct2* ptr = &this->unk_3A4;
 | 
				
			||||||
 | 
					    f32 temp_f0;
 | 
				
			||||||
 | 
					    f32 temp_f20;
 | 
				
			||||||
 | 
					    Vec3f spC8;
 | 
				
			||||||
 | 
					    Vec3f spBC;
 | 
				
			||||||
 | 
					    Vec3f spB0;
 | 
				
			||||||
 | 
					    ObjSpinyrollStruct* temp_s1;
 | 
				
			||||||
 | 
					    f32 temp_f22;
 | 
				
			||||||
 | 
					    f32 temp_f24;
 | 
				
			||||||
 | 
					    f32 temp;
 | 
				
			||||||
 | 
					    s32 sp98;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    spC8.y = this->dyna.actor.world.pos.y + 10.0f;
 | 
				
			||||||
 | 
					    spBC.y = spC8.y;
 | 
				
			||||||
 | 
					    sp98 = false;
 | 
				
			||||||
 | 
					    temp_f20 = FLT_MAX;
 | 
				
			||||||
 | 
					    ptr->unk_F0 = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < ARRAY_COUNT(this->unk_3A4.unk_00); i++) {
 | 
				
			||||||
 | 
					        temp = D_80A1F1F4[i];
 | 
				
			||||||
 | 
					        temp_f22 = temp * this->unk_4C4.x;
 | 
				
			||||||
 | 
					        temp_f24 = temp * this->unk_4C4.z;
 | 
				
			||||||
 | 
					        temp_s1 = &ptr->unk_00[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (j = 0; j < ptr->unk_F4; j++) {
 | 
				
			||||||
 | 
					            spC8.x =
 | 
				
			||||||
 | 
					                (temp_s1->unk_00[j].unk_00 * Math_CosS(this->dyna.actor.world.rot.y)) + this->dyna.actor.world.pos.x;
 | 
				
			||||||
 | 
					            spC8.z =
 | 
				
			||||||
 | 
					                (temp_s1->unk_00[j].unk_00 * -Math_SinS(this->dyna.actor.world.rot.y)) + this->dyna.actor.world.pos.z;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            spBC.x = temp_f22 + spC8.x;
 | 
				
			||||||
 | 
					            spBC.z = temp_f24 + spC8.z;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (BgCheck_EntityLineTest3(&globalCtx->colCtx, &spC8, &spBC, &spB0, &temp_s1->unk_00[j].unk_04, 1, 0, 0, 1,
 | 
				
			||||||
 | 
					                                        &temp_s1->unk_00[j].bgId, &this->dyna.actor, 0.0f)) {
 | 
				
			||||||
 | 
					                if (arg3 && (this->dyna.actor.flags & ACTOR_FLAG_40)) {
 | 
				
			||||||
 | 
					                    func_80A1DA50(globalCtx, this, &spC8, &spB0);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                temp_f0 = Math3D_Vec3fDistSq(&spC8, &spB0);
 | 
				
			||||||
 | 
					                if (temp_f0 < temp_f20) {
 | 
				
			||||||
 | 
					                    temp_f20 = temp_f0;
 | 
				
			||||||
 | 
					                    sp98 = true;
 | 
				
			||||||
 | 
					                    Math_Vec3f_Diff(&spB0, &spBC, arg2);
 | 
				
			||||||
 | 
					                    ptr->unk_F0 = temp_s1;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return sp98;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					s32 func_80A1E074(ObjSpinyroll* this, GlobalContext* globalCtx, Vec3f* arg2, s32 arg3);
 | 
				
			||||||
 | 
					#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1E074.s")
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern ColliderTrisElementInit D_80A1F040[6];
 | 
					s32 func_80A1E2D8(ObjSpinyroll* this, GlobalContext* globalCtx, s32 arg2) {
 | 
				
			||||||
extern ColliderTrisInit D_80A1F1A8;
 | 
					    Vec3f sp1C;
 | 
				
			||||||
extern InitChainEntry D_80A1F204[];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern UNK_TYPE D_06000460;
 | 
					    if (func_80A1E074(this, globalCtx, &sp1C, arg2)) {
 | 
				
			||||||
extern UNK_TYPE D_06000E68;
 | 
					        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_Spinyroll/func_80A1DA50.s")
 | 
					s32 func_80A1E334(CollisionContext* colCtx, f32* arg1, CollisionPoly** polyOut, s32* bgId, Vec3f* arg4,
 | 
				
			||||||
 | 
					                  ObjSpinyroll* this) {
 | 
				
			||||||
 | 
					    f32 temp_f0 = BgCheck_EntityRaycastFloor5(colCtx, polyOut, bgId, &this->dyna.actor, arg4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1DAAC.s")
 | 
					    *arg1 = temp_f0;
 | 
				
			||||||
 | 
					    return *arg1 > (BGCHECK_Y_MIN + 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1DB2C.s")
 | 
					s32 func_80A1E394(CollisionContext* colCtx, f32* arg1, CollisionPoly** polyOut, s32* bgId, Vec3f* arg4,
 | 
				
			||||||
 | 
					                  ObjSpinyroll* this) {
 | 
				
			||||||
 | 
					    return BgCheck_EntityCheckCeiling(colCtx, arg1, arg4, 24.0f, polyOut, bgId, &this->dyna.actor);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1DC5C.s")
 | 
					#ifdef NON_MATCHING
 | 
				
			||||||
 | 
					s32 func_80A1E3D8(ObjSpinyroll* this, GlobalContext* globalCtx, f32* arg2, s32 arg3) {
 | 
				
			||||||
 | 
					    f32 temp_f20;
 | 
				
			||||||
 | 
					    ObjSpinyrollStruct2* spC8;
 | 
				
			||||||
 | 
					    f32 phi_f22;
 | 
				
			||||||
 | 
					    ObjSpinyrollColFunc spC0;
 | 
				
			||||||
 | 
					    s32 i;
 | 
				
			||||||
 | 
					    s32 j;
 | 
				
			||||||
 | 
					    Vec3f spAC;
 | 
				
			||||||
 | 
					    Vec3f spA0;
 | 
				
			||||||
 | 
					    Vec3f sp94;
 | 
				
			||||||
 | 
					    ObjSpinyrollStruct* temp_s0;
 | 
				
			||||||
 | 
					    f32 phi_f26;
 | 
				
			||||||
 | 
					    s32 sp84;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1DCCC.s")
 | 
					    spC8 = &this->unk_3A4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1DD18.s")
 | 
					    if (this->unk_4C4.y > 0.0f) {
 | 
				
			||||||
 | 
					        spC0 = func_80A1E394;
 | 
				
			||||||
 | 
					        phi_f26 = this->dyna.actor.world.pos.y + 48.0f;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        spC0 = func_80A1E334;
 | 
				
			||||||
 | 
					        phi_f26 = this->dyna.actor.world.pos.y;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1DE10.s")
 | 
					    sp84 = false;
 | 
				
			||||||
 | 
					    sp94.y = this->dyna.actor.world.pos.y + 24.0f;
 | 
				
			||||||
 | 
					    phi_f22 = FLT_MAX;
 | 
				
			||||||
 | 
					    spC8->unk_F0 = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1DE58.s")
 | 
					    for (i = 0; i < ARRAY_COUNT(this->unk_3A4.unk_00); i++) {
 | 
				
			||||||
 | 
					        sp94.z = D_80A1F1FC[i];
 | 
				
			||||||
 | 
					        temp_s0 = &spC8->unk_00[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1DE84.s")
 | 
					        for (j = 0; j < spC8->unk_F4; j++) {
 | 
				
			||||||
 | 
					            sp94.x = temp_s0->unk_00[j].unk_00;
 | 
				
			||||||
 | 
					            func_80A1DAAC(&spAC, &sp94, this->dyna.actor.world.rot.y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1DEB8.s")
 | 
					            spAC.x += this->dyna.actor.world.pos.x;
 | 
				
			||||||
 | 
					            spAC.z += this->dyna.actor.world.pos.z;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1DFA0.s")
 | 
					            if (spC0(&globalCtx->colCtx, &spA0.y, &temp_s0->unk_00[j].unk_04, &temp_s0->unk_00[j].bgId, &spAC, this)) {
 | 
				
			||||||
 | 
					                temp_f20 = fabsf(spA0.y - spAC.y);
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1E074.s")
 | 
					                if (temp_f20 <= 24.0f) {
 | 
				
			||||||
 | 
					                    if (arg3 && (this->dyna.actor.flags & ACTOR_FLAG_40)) {
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1E2D8.s")
 | 
					                        spA0.x = spAC.x;
 | 
				
			||||||
 | 
					                        spA0.z = spAC.z;
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1E334.s")
 | 
					                        func_80A1DA50(globalCtx, this, &spAC, &spA0);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1E394.s")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (temp_f20 < phi_f22) {
 | 
				
			||||||
 | 
					                        sp84 = true;
 | 
				
			||||||
 | 
					                        *arg2 = spA0.y - phi_f26;
 | 
				
			||||||
 | 
					                        phi_f22 = temp_f20;
 | 
				
			||||||
 | 
					                        spC8->unk_F0 = temp_s0;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return sp84;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					s32 func_80A1E3D8(ObjSpinyroll* this, GlobalContext* globalCtx, f32* arg2, s32 arg3);
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1E3D8.s")
 | 
					#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1E3D8.s")
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1E648.s")
 | 
					s32 func_80A1E648(ObjSpinyroll* this, GlobalContext* globalCtx, s32 arg2) {
 | 
				
			||||||
 | 
					    f32 sp1C;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1E694.s")
 | 
					    if (func_80A1E3D8(this, globalCtx, &sp1C, arg2)) {
 | 
				
			||||||
 | 
					        this->dyna.actor.world.pos.y += sp1C;
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1E6D4.s")
 | 
					DynaPolyActor* func_80A1E694(ObjSpinyroll* this, GlobalContext* globalCtx) {
 | 
				
			||||||
 | 
					    if (this->unk_3A4.unk_F0 != NULL) {
 | 
				
			||||||
 | 
					        return DynaPoly_GetActor(&globalCtx->colCtx, this->unk_3A4.unk_F0->unk_00[0].bgId);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/ObjSpinyroll_Init.s")
 | 
					s32 func_80A1E6D4(ObjSpinyroll* this, GlobalContext* globalCtx) {
 | 
				
			||||||
 | 
					    DynaPolyActor* temp_v0 = func_80A1E694(this, globalCtx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/ObjSpinyroll_Destroy.s")
 | 
					    if ((temp_v0 != NULL) && (Math3D_Vec3fDistSq(&temp_v0->actor.world.pos, &temp_v0->actor.prevPos) > SQ(0.01f))) {
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1E9C4.s")
 | 
					void ObjSpinyroll_Init(Actor* thisx, GlobalContext* globalCtx) {
 | 
				
			||||||
 | 
					    s32 pad;
 | 
				
			||||||
 | 
					    ObjSpinyroll* this = THIS;
 | 
				
			||||||
 | 
					    f32 sp44;
 | 
				
			||||||
 | 
					    Path* path;
 | 
				
			||||||
 | 
					    s32 pad2;
 | 
				
			||||||
 | 
					    Vec3s* points;
 | 
				
			||||||
 | 
					    Vec3s* sp34;
 | 
				
			||||||
 | 
					    Vec3s* sp30;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1E9E0.s")
 | 
					    sp44 = D_80A1F1B8[OBJSPINYROLL_GET_C000(&this->dyna.actor)];
 | 
				
			||||||
 | 
					    Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
 | 
				
			||||||
 | 
					    this->dyna.actor.world.rot.x = 0;
 | 
				
			||||||
 | 
					    this->dyna.actor.world.rot.z = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1EA10.s")
 | 
					    this->dyna.actor.shape.rot.x = 0;
 | 
				
			||||||
 | 
					    this->dyna.actor.shape.rot.z = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1EA4C.s")
 | 
					    this->dyna.actor.scale.x = 0.1f * sp44;
 | 
				
			||||||
 | 
					    this->dyna.actor.scale.y = 0.1f;
 | 
				
			||||||
 | 
					    this->dyna.actor.scale.z = 0.1f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1EAAC.s")
 | 
					    this->dyna.actor.uncullZoneScale = 250.0f * sp44;
 | 
				
			||||||
 | 
					    DynaPolyActor_Init(&this->dyna, 0);
 | 
				
			||||||
 | 
					    DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &object_spinyroll_Colheader_000E68);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1EAE0.s")
 | 
					    Collider_InitTris(globalCtx, &this->collider);
 | 
				
			||||||
 | 
					    Collider_SetTris(globalCtx, &this->collider, &this->dyna.actor, &sTrisInit, this->colliderElements);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1EB40.s")
 | 
					    if (OBJSPINYROLL_GET_7F(&this->dyna.actor) == OBJSPINYROLL_GET_7F_7F) {
 | 
				
			||||||
 | 
					        func_80A1E9C4(this);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1EB54.s")
 | 
					    this->dyna.actor.world.rot.y = 0;
 | 
				
			||||||
 | 
					    func_80A1DFA0(this);
 | 
				
			||||||
 | 
					    this->unk_4A4 = D_80A1F1C4[OBJSPINYROLL_GET_380(thisx)];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1EC24.s")
 | 
					    path = &globalCtx->setupPathList[OBJSPINYROLL_GET_7F(&this->dyna.actor)];
 | 
				
			||||||
 | 
					    points = Lib_SegmentedToVirtual(path->points);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1EC38.s")
 | 
					    sp34 = &points[0];
 | 
				
			||||||
 | 
					    sp30 = &points[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1ECC0.s")
 | 
					    Math_Vec3s_ToVec3f(&this->unk_4AC[0], sp34);
 | 
				
			||||||
 | 
					    Math_Vec3s_ToVec3f(&this->unk_4AC[1], sp30);
 | 
				
			||||||
 | 
					    Math_Vec3f_Copy(&this->dyna.actor.world.pos, &this->unk_4AC[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/func_80A1ECD4.s")
 | 
					    if ((sp34->x == sp30->x) && (sp34->y != sp30->y) && (sp34->z == sp30->z)) {
 | 
				
			||||||
 | 
					        this->unk_49C = true;
 | 
				
			||||||
 | 
					    } else if (((sp34->x != sp30->x) && (sp34->y == sp30->y) && (sp34->z == sp30->z)) ||
 | 
				
			||||||
 | 
					               ((sp34->x == sp30->x) && (sp34->y == sp30->y) && (sp34->z != sp30->z))) {
 | 
				
			||||||
 | 
					        this->unk_49C = false;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        Actor_MarkForDeath(&this->dyna.actor);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/ObjSpinyroll_Update.s")
 | 
					    func_80A1DE58(this);
 | 
				
			||||||
 | 
					    this->dyna.actor.shape.rot.y = this->dyna.actor.world.rot.y;
 | 
				
			||||||
 | 
					    func_80A1EAAC(this);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Spinyroll/ObjSpinyroll_Draw.s")
 | 
					void ObjSpinyroll_Destroy(Actor* thisx, GlobalContext* globalCtx) {
 | 
				
			||||||
 | 
					    ObjSpinyroll* this = THIS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DynaPoly_DeleteBgActor(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
 | 
				
			||||||
 | 
					    Collider_DestroyTris(globalCtx, &this->collider);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1E9C4(ObjSpinyroll* this) {
 | 
				
			||||||
 | 
					    this->dyna.actor.speedXZ = 0.0f;
 | 
				
			||||||
 | 
					    this->actionFunc = func_80A1E9E0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1E9E0(ObjSpinyroll* this, GlobalContext* globalCtx) {
 | 
				
			||||||
 | 
					    this->unk_4DA += 0x6E;
 | 
				
			||||||
 | 
					    if (this->unk_4DA > 0xFA0) {
 | 
				
			||||||
 | 
					        this->unk_4DA = 0xFA0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1EA10(ObjSpinyroll* this) {
 | 
				
			||||||
 | 
					    this->actionFunc = func_80A1EA4C;
 | 
				
			||||||
 | 
					    this->unk_4E2 = D_80A1F1E4[OBJSPINYROLL_GET_1C00(&this->dyna.actor)];
 | 
				
			||||||
 | 
					    this->dyna.actor.speedXZ = 0.0f;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1EA4C(ObjSpinyroll* this, GlobalContext* globalCtx) {
 | 
				
			||||||
 | 
					    if (Math_ScaledStepToS(&this->unk_4DA, 0, this->unk_4DE)) {
 | 
				
			||||||
 | 
					        if (this->unk_4E2 > 0) {
 | 
				
			||||||
 | 
					            this->unk_4E2--;
 | 
				
			||||||
 | 
					            if (this->unk_4E2 <= 0) {
 | 
				
			||||||
 | 
					                func_80A1EAAC(this);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1EAAC(ObjSpinyroll* this) {
 | 
				
			||||||
 | 
					    this->actionFunc = func_80A1EAE0;
 | 
				
			||||||
 | 
					    this->unk_4DC = D_80A1F20C[this->unk_4A8];
 | 
				
			||||||
 | 
					    this->dyna.actor.speedXZ = 0.0f;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1EAE0(ObjSpinyroll* this, GlobalContext* globalCtx) {
 | 
				
			||||||
 | 
					    if (Math_ScaledStepToS(&this->unk_4DA, this->unk_4DC, 0x6E)) {
 | 
				
			||||||
 | 
					        if (!this->unk_49C) {
 | 
				
			||||||
 | 
					            func_80A1EB40(this);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            func_80A1ECC0(this);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1EB40(ObjSpinyroll* this) {
 | 
				
			||||||
 | 
					    this->actionFunc = func_80A1EB54;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1EB54(ObjSpinyroll* this, GlobalContext* globalCtx) {
 | 
				
			||||||
 | 
					    s32 sp24 = func_80A1DEB8(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (func_80A1E2D8(this, globalCtx, 1)) {
 | 
				
			||||||
 | 
					        if (func_80A1E694(this, globalCtx) != NULL) {
 | 
				
			||||||
 | 
					            func_80A1DCCC(this);
 | 
				
			||||||
 | 
					            this->unk_4DE = 0x7D0;
 | 
				
			||||||
 | 
					            func_80A1EC24(this);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            func_80A1DE84(this);
 | 
				
			||||||
 | 
					            func_80A1DCCC(this);
 | 
				
			||||||
 | 
					            this->unk_4DE = 0x7D0;
 | 
				
			||||||
 | 
					            func_80A1EA10(this);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (sp24 != 0) {
 | 
				
			||||||
 | 
					        func_80A1DE84(this);
 | 
				
			||||||
 | 
					        func_80A1DCCC(this);
 | 
				
			||||||
 | 
					        this->unk_4DE = 0x78;
 | 
				
			||||||
 | 
					        func_80A1EA10(this);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1EC24(ObjSpinyroll* this) {
 | 
				
			||||||
 | 
					    this->actionFunc = func_80A1EC38;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1EC38(ObjSpinyroll* this, GlobalContext* globalCtx) {
 | 
				
			||||||
 | 
					    s32 sp24 = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Math_ScaledStepToS(&this->unk_4DA, 0, this->unk_4DE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (func_80A1E2D8(this, globalCtx, 0) && func_80A1E6D4(this, globalCtx)) {
 | 
				
			||||||
 | 
					        sp24 = false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (sp24) {
 | 
				
			||||||
 | 
					        func_80A1DE84(this);
 | 
				
			||||||
 | 
					        func_80A1EA10(this);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1ECC0(ObjSpinyroll* this) {
 | 
				
			||||||
 | 
					    this->actionFunc = func_80A1ECD4;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void func_80A1ECD4(ObjSpinyroll* this, GlobalContext* globalCtx) {
 | 
				
			||||||
 | 
					    s32 sp24 = func_80A1DEB8(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (func_80A1E648(this, globalCtx, 1)) {
 | 
				
			||||||
 | 
					        func_80A1DE84(this);
 | 
				
			||||||
 | 
					        func_80A1DCCC(this);
 | 
				
			||||||
 | 
					        this->unk_4DE = 0x7D0;
 | 
				
			||||||
 | 
					        func_80A1EA10(this);
 | 
				
			||||||
 | 
					    } else if (sp24) {
 | 
				
			||||||
 | 
					        func_80A1DE84(this);
 | 
				
			||||||
 | 
					        func_80A1DCCC(this);
 | 
				
			||||||
 | 
					        this->unk_4DE = 0x78;
 | 
				
			||||||
 | 
					        func_80A1EA10(this);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ObjSpinyroll_Update(Actor* thisx, GlobalContext* globalCtx2) {
 | 
				
			||||||
 | 
					    GlobalContext* globalCtx = globalCtx2;
 | 
				
			||||||
 | 
					    ObjSpinyroll* this = THIS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (this->collider.base.atFlags & AT_HIT) {
 | 
				
			||||||
 | 
					        this->collider.base.atFlags &= ~AT_HIT;
 | 
				
			||||||
 | 
					        func_80A1DCCC(this);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this->actionFunc(this, globalCtx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this->unk_4E0 += this->unk_4DA;
 | 
				
			||||||
 | 
					    func_80A1DC5C(this);
 | 
				
			||||||
 | 
					    func_80A1DB2C(thisx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    CollisionCheck_SetAT(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
 | 
				
			||||||
 | 
					    CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ObjSpinyroll_Draw(Actor* thisx, GlobalContext* globalCtx) {
 | 
				
			||||||
 | 
					    ObjSpinyroll* this = THIS;
 | 
				
			||||||
 | 
					    f32 temp_f26;
 | 
				
			||||||
 | 
					    f32 temp_f28;
 | 
				
			||||||
 | 
					    s32 temp_s1 = OBJSPINYROLL_GET_C000(&this->dyna.actor);
 | 
				
			||||||
 | 
					    s32 phi_s4;
 | 
				
			||||||
 | 
					    f32 phi_f22;
 | 
				
			||||||
 | 
					    f32 phi_f24;
 | 
				
			||||||
 | 
					    s32 i;
 | 
				
			||||||
 | 
					    f32 temp_f30;
 | 
				
			||||||
 | 
					    Vec3s sp84;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    OPEN_DISPS(globalCtx->state.gfxCtx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    func_8012C28C(globalCtx->state.gfxCtx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    temp_f26 = Math_CosS(this->dyna.actor.shape.rot.y) * 120.0f;
 | 
				
			||||||
 | 
					    temp_f28 = Math_SinS(this->dyna.actor.shape.rot.y) * -120.0f;
 | 
				
			||||||
 | 
					    temp_f30 = this->dyna.actor.world.pos.y + this->unk_4D0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (temp_s1 == OBJSPINYROLL_GET_C000_0) {
 | 
				
			||||||
 | 
					        phi_s4 = 1;
 | 
				
			||||||
 | 
					        phi_f22 = this->dyna.actor.world.pos.x;
 | 
				
			||||||
 | 
					        phi_f24 = this->dyna.actor.world.pos.z;
 | 
				
			||||||
 | 
					    } else if (temp_s1 == OBJSPINYROLL_GET_C000_1) {
 | 
				
			||||||
 | 
					        phi_s4 = 2;
 | 
				
			||||||
 | 
					        phi_f22 = this->dyna.actor.world.pos.x - (temp_f26 * 0.5f);
 | 
				
			||||||
 | 
					        phi_f24 = this->dyna.actor.world.pos.z - (temp_f28 * 0.5f);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        phi_s4 = 4;
 | 
				
			||||||
 | 
					        phi_f22 = this->dyna.actor.world.pos.x - (temp_f26 * 1.5f);
 | 
				
			||||||
 | 
					        phi_f24 = this->dyna.actor.world.pos.z - (temp_f28 * 1.5f);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sp84.x = this->dyna.actor.shape.rot.x + this->unk_4E0;
 | 
				
			||||||
 | 
					    sp84.y = this->dyna.actor.shape.rot.y;
 | 
				
			||||||
 | 
					    sp84.z = this->dyna.actor.shape.rot.z;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < phi_s4; i++) {
 | 
				
			||||||
 | 
					        Matrix_SetStateRotationAndTranslation(phi_f22, temp_f30, phi_f24, &sp84);
 | 
				
			||||||
 | 
					        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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        phi_f22 += temp_f26;
 | 
				
			||||||
 | 
					        phi_f24 += temp_f28;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    CLOSE_DISPS(globalCtx->state.gfxCtx);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,12 +6,54 @@
 | 
				
			||||||
struct ObjSpinyroll;
 | 
					struct ObjSpinyroll;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef void (*ObjSpinyrollActionFunc)(struct ObjSpinyroll*, GlobalContext*);
 | 
					typedef void (*ObjSpinyrollActionFunc)(struct ObjSpinyroll*, GlobalContext*);
 | 
				
			||||||
 | 
					typedef s32 (*ObjSpinyrollColFunc)(CollisionContext*, f32*, CollisionPoly**, s32*, Vec3f*, struct ObjSpinyroll*);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define OBJSPINYROLL_GET_7F(thisx) ((thisx)->params & 0x7F)
 | 
				
			||||||
 | 
					#define OBJSPINYROLL_GET_380(thisx) (((thisx)->params >> 7) & 7)
 | 
				
			||||||
 | 
					#define OBJSPINYROLL_GET_1C00(thisx) (((thisx)->params >> 0xA) & 7)
 | 
				
			||||||
 | 
					#define OBJSPINYROLL_GET_C000(thisx) (((thisx)->params >> 0xE) & 3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define OBJSPINYROLL_GET_7F_7F 0x7F
 | 
				
			||||||
 | 
					#define OBJSPINYROLL_GET_C000_0 0
 | 
				
			||||||
 | 
					#define OBJSPINYROLL_GET_C000_1 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					    /* 0x00 */ f32 unk_00;
 | 
				
			||||||
 | 
					    /* 0x04 */ CollisionPoly* unk_04;
 | 
				
			||||||
 | 
					    /* 0x08 */ s32 bgId;
 | 
				
			||||||
 | 
					} ObjSpinyrollSubStruct; // size = 0xC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					    /* 0x00 */ ObjSpinyrollSubStruct unk_00[10];
 | 
				
			||||||
 | 
					} ObjSpinyrollStruct; // size = 0x78
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					    /* 0x00 */ ObjSpinyrollStruct unk_00[2];
 | 
				
			||||||
 | 
					    /* 0xF0 */ ObjSpinyrollStruct* unk_F0;
 | 
				
			||||||
 | 
					    /* 0xF4 */ s32 unk_F4;
 | 
				
			||||||
 | 
					} ObjSpinyrollStruct2; // size = 0xF8?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct ObjSpinyroll {
 | 
					typedef struct ObjSpinyroll {
 | 
				
			||||||
    /* 0x0000 */ Actor actor;
 | 
					    /* 0x0000 */ DynaPolyActor dyna;
 | 
				
			||||||
    /* 0x0144 */ char unk_144[0x35C];
 | 
					    /* 0x015C */ ColliderTris collider;
 | 
				
			||||||
 | 
					    /* 0x017C */ ColliderTrisElement colliderElements[6];
 | 
				
			||||||
 | 
					    /* 0x03A4 */ ObjSpinyrollStruct2 unk_3A4;
 | 
				
			||||||
 | 
					    ///* 0x0494 */ ObjSpinyrollStruct* unk_494; // alternative testing
 | 
				
			||||||
 | 
					    ///* 0x0498 */ s32 unk_498;
 | 
				
			||||||
 | 
					    /* 0x049C */ s32 unk_49C;
 | 
				
			||||||
    /* 0x04A0 */ ObjSpinyrollActionFunc actionFunc;
 | 
					    /* 0x04A0 */ ObjSpinyrollActionFunc actionFunc;
 | 
				
			||||||
    /* 0x04A4 */ char unk_4A4[0x40];
 | 
					    /* 0x04A4 */ f32 unk_4A4;
 | 
				
			||||||
 | 
					    /* 0x04A8 */ s32 unk_4A8;
 | 
				
			||||||
 | 
					    /* 0x04AC */ Vec3f unk_4AC[2];
 | 
				
			||||||
 | 
					    /* 0x04C4 */ Vec3f unk_4C4;
 | 
				
			||||||
 | 
					    /* 0x04D0 */ f32 unk_4D0;
 | 
				
			||||||
 | 
					    /* 0x04D4 */ f32 unk_4D4;
 | 
				
			||||||
 | 
					    /* 0x04D8 */ s16 unk_4D8;
 | 
				
			||||||
 | 
					    /* 0x04DA */ s16 unk_4DA;
 | 
				
			||||||
 | 
					    /* 0x04DC */ s16 unk_4DC;
 | 
				
			||||||
 | 
					    /* 0x04DE */ s16 unk_4DE;
 | 
				
			||||||
 | 
					    /* 0x04E0 */ s16 unk_4E0;
 | 
				
			||||||
 | 
					    /* 0x04E2 */ s16 unk_4E2;
 | 
				
			||||||
} ObjSpinyroll; // size = 0x4E4
 | 
					} ObjSpinyroll; // size = 0x4E4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern const ActorInit Obj_Spinyroll_InitVars;
 | 
					extern const ActorInit Obj_Spinyroll_InitVars;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1974,11 +1974,6 @@ D_060011E0 = 0x060011E0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
D_06001C00 = 0x06001C00;
 | 
					D_06001C00 = 0x06001C00;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ovl_Obj_Spinyroll
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
D_06000460 = 0x06000460;
 | 
					 | 
				
			||||||
D_06000E68 = 0x06000E68;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ovl_Obj_Takaraya_Wall
 | 
					// ovl_Obj_Takaraya_Wall
 | 
				
			||||||
 | 
					
 | 
				
			||||||
D_06000B70 = 0x06000B70;
 | 
					D_06000B70 = 0x06000B70;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue