more ground object decomp

This commit is contained in:
Seth Barberee
2025-06-22 11:20:37 -07:00
parent 698ea72f6c
commit 30ec2de7b2
2 changed files with 271 additions and 384 deletions

View File

@@ -5,301 +5,6 @@
.text
thumb_func_start CallbackObjectGetPosHeightAndUnk
CallbackObjectGetPosHeightAndUnk:
push {r4,lr}
adds r3, r0, 0
movs r4, 0x9A
lsls r4, 1
adds r0, r3, r4
ldr r0, [r0]
str r0, [r1]
movs r1, 0x9C
lsls r1, 1
adds r0, r3, r1
ldr r0, [r0]
str r0, [r2]
pop {r4}
pop {r0}
bx r0
thumb_func_end CallbackObjectGetPosHeightAndUnk
thumb_func_start CallbackObjectSetPosHeight
CallbackObjectSetPosHeight:
movs r2, 0x9A
lsls r2, 1
adds r0, r2
str r1, [r0]
bx lr
thumb_func_end CallbackObjectSetPosHeight
thumb_func_start CallbackObjectGetDirection
CallbackObjectGetDirection:
movs r2, 0x90
lsls r2, 1
adds r0, r2
ldrb r0, [r0]
strb r0, [r1]
bx lr
thumb_func_end CallbackObjectGetDirection
thumb_func_start CallbackObjectSetDirection
CallbackObjectSetDirection:
push {lr}
adds r2, r0, 0
lsls r1, 24
asrs r1, 24
movs r0, 0x1
negs r0, r0
cmp r1, r0
beq _080AC934
movs r3, 0x90
lsls r3, 1
adds r0, r2, r3
strb r1, [r0]
_080AC934:
pop {r0}
bx r0
thumb_func_end CallbackObjectSetDirection
thumb_func_start CallbackObjectSetEventIndex
CallbackObjectSetEventIndex:
push {r4,r5,lr}
lsls r1, 16
adds r3, r0, 0
movs r0, 0xFF
lsls r0, 16
ands r0, r1
lsrs r0, 16
cmp r0, 0
beq _080AC958
ldr r1, _080AC954
lsls r0, 1
adds r0, r1
b _080AC95E
.align 2, 0
_080AC954: .4byte gUnknown_81183A0
_080AC958:
movs r5, 0x9F
lsls r5, 1
adds r0, r3, r5
_080AC95E:
movs r1, 0
ldrsh r2, [r0, r1]
movs r5, 0x9F
lsls r5, 1
adds r1, r3, r5
ldrh r4, [r1]
movs r5, 0
ldrsh r0, [r1, r5]
cmp r0, r2
beq _080AC97C
strh r2, [r1]
movs r0, 0x9E
lsls r0, 1
adds r1, r3, r0
b _080AC98C
_080AC97C:
movs r0, 0x80
lsls r0, 5
ands r0, r4
cmp r0, 0
beq _080AC990
movs r5, 0x9E
lsls r5, 1
adds r1, r3, r5
_080AC98C:
movs r0, 0x1
strb r0, [r1]
_080AC990:
pop {r4,r5}
pop {r0}
bx r0
thumb_func_end CallbackObjectSetEventIndex
thumb_func_start CallbackObjectSetUnk_80AC998
CallbackObjectSetUnk_80AC998:
push {lr}
lsls r1, 16
asrs r1, 16
adds r2, r1, 0
cmp r1, 0
bne _080AC9AA
movs r1, 0xE0
lsls r1, 1
adds r2, r1, 0
_080AC9AA:
movs r1, 0xA0
lsls r1, 1
adds r0, r1
strh r2, [r0]
pop {r0}
bx r0
thumb_func_end CallbackObjectSetUnk_80AC998
thumb_func_start CallbackObjectSpriteRelatedCheck_80AC9B8
CallbackObjectSpriteRelatedCheck_80AC9B8:
push {lr}
adds r1, r0, 0
movs r2, 0x9E
lsls r2, 1
adds r0, r1, r2
ldrb r0, [r0]
cmp r0, 0
bne _080AC9D6
adds r2, 0x8
adds r0, r1, r2
bl sub_80A66F8
lsls r0, 24
lsrs r0, 24
b _080AC9D8
_080AC9D6:
movs r0, 0x1
_080AC9D8:
pop {r1}
bx r1
thumb_func_end CallbackObjectSpriteRelatedCheck_80AC9B8
thumb_func_start CallbackObjectSpriteRelated_80AC9DC
CallbackObjectSpriteRelated_80AC9DC:
push {lr}
adds r1, r0, 0
movs r2, 0xA0
lsls r2, 1
adds r0, r1, r2
movs r2, 0
ldrsh r0, [r0, r2]
cmp r0, 0
bne _080AC9FE
movs r2, 0xA2
lsls r2, 1
adds r0, r1, r2
bl sub_80A671C
lsls r0, 24
lsrs r0, 24
b _080ACA00
_080AC9FE:
movs r0, 0x1
_080ACA00:
pop {r1}
bx r1
thumb_func_end CallbackObjectSpriteRelated_80AC9DC
thumb_func_start CallbackObjectGetFlags
CallbackObjectGetFlags:
movs r2, 0x8E
lsls r2, 1
adds r0, r2
ldr r0, [r0]
str r0, [r1]
bx lr
thumb_func_end CallbackObjectGetFlags
thumb_func_start CallbackObjectSetFlags
CallbackObjectSetFlags:
push {lr}
movs r2, 0x4
ldrsh r0, [r0, r2]
bl sub_80AC1B0
pop {r0}
bx r0
thumb_func_end CallbackObjectSetFlags
thumb_func_start CallbackObjectClearFlags
CallbackObjectClearFlags:
push {lr}
movs r2, 0x4
ldrsh r0, [r0, r2]
bl sub_80AC1F4
pop {r0}
bx r0
thumb_func_end CallbackObjectClearFlags
thumb_func_start CallbackObjectMoveRelative
CallbackObjectMoveRelative:
push {lr}
bl TryMoveRelative_80AC720
pop {r1}
bx r1
thumb_func_end CallbackObjectMoveRelative
thumb_func_start GroundObject_Action
GroundObject_Action:
push {r4-r7,lr}
mov r7, r8
push {r7}
ldr r0, _080ACA7C
ldr r5, [r0]
movs r7, 0
movs r0, 0x1
negs r0, r0
mov r8, r0
movs r1, 0x9E
lsls r1, 1
adds r6, r5, r1
_080ACA54:
movs r3, 0x6
ldrsh r0, [r5, r3]
cmp r0, r8
beq _080ACAB2
adds r4, r5, 0
adds r4, 0x38
adds r0, r4, 0
ldr r1, _080ACA80
bl HandleAction
lsls r0, 16
asrs r0, 16
cmp r0, 0
beq _080ACA84
cmp r0, 0x4
bne _080ACA90
adds r0, r7, 0
bl GroundObject_Delete
b _080ACAB2
.align 2, 0
_080ACA7C: .4byte gGroundObjects
_080ACA80: .4byte gUnknown_8118524
_080ACA84:
adds r0, r4, 0
movs r1, 0
movs r2, 0x1
ldr r3, _080ACAD0
bl ExecutePredefinedScript
_080ACA90:
ldrb r0, [r6]
cmp r0, 0
beq _080ACAB2
movs r0, 0
strb r0, [r6]
movs r1, 0xA2
lsls r1, 1
adds r0, r5, r1
ldrh r2, [r6, 0x2]
movs r3, 0xF8
lsls r3, 5
adds r1, r3, 0
ands r1, r2
lsls r2, 24
asrs r2, 24
bl sub_80A6EFC
_080ACAB2:
adds r0, r7, 0x1
lsls r0, 16
asrs r7, r0, 16
movs r0, 0xE2
lsls r0, 1
adds r6, r0
adds r5, r0
cmp r7, 0xF
ble _080ACA54
pop {r3}
mov r8, r3
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_080ACAD0: .4byte gUnknown_8118530
thumb_func_end GroundObject_Action
thumb_func_start sub_80ACAD4
sub_80ACAD4:

View File

@@ -11,7 +11,7 @@
typedef struct GroundObject {
// size: 0x1C4
u8 unk0[4];
s16 unk4;
s16 id;
s16 unk6; // kind
s16 unk8; // scriptID / group
s8 unkA; // sector
@@ -24,13 +24,13 @@ typedef struct GroundObject {
PixelPos unk30;
Action unk38;
u32 flags;
s8 unk120;
s8 direction;
PixelPos unk124;
PixelPos unk12C;
PixelPos unk134;
u8 unk13C;
u16 unk13E;
u16 unk140;
u8 directionRelated;
s16 unk13E;
s16 unk140;
struct UnkGroundSpriteStruct unk144;
} GroundObject;
@@ -67,18 +67,18 @@ static void CallbackObjectSetHitboxPos(void *objectPtr_, PixelPos *posOrNull);
static void CallbackObjectSetPositionBounds(void *objectPtr_, PixelPos *from, PixelPos *to);
static void CallbackObjectGetHitboxCenter(void *objectPtr_, PixelPos *out);
static s32 CallbackObjectMoveReal(void *objectPtr_, PixelPos *pos);
extern void CallbackObjectGetPosHeightAndUnk(void *objectPtr_, u32 *height, u32 *unk);
extern void CallbackObjectSetPosHeight(void *objectPtr_, u32 height);
extern void CallbackObjectGetDirection(void *objectPtr_, s8 *dir);
extern void CallbackObjectSetDirection(void *objectPtr_, s32 dir_);
extern void CallbackObjectSetEventIndex(void *objectPtr_, u16 a1);
extern void CallbackObjectSetUnk_80AC998(void *objectPtr_, s32 a1_, s32 a2);
extern bool8 CallbackObjectSpriteRelatedCheck_80AC9B8(void *objectPtr_);
extern bool8 CallbackObjectSpriteRelated_80AC9DC(void *objectPtr_);
extern void CallbackObjectGetFlags(void *objectPtr_, u32 *flags);
extern void CallbackObjectSetFlags(void *objectPtr_, u32 flags);
extern void CallbackObjectClearFlags(void *objectPtr_, u32 flags);
extern s32 CallbackObjectMoveRelative(void *objectPtr_, PixelPos *pos);
static void CallbackObjectGetPosHeightAndUnk(void *objectPtr_, u32 *height, u32 *unk);
static void CallbackObjectSetPosHeight(void *objectPtr_, u32 height);
static void CallbackObjectGetDirection(void *objectPtr_, s8 *dir);
static void CallbackObjectSetDirection(void *objectPtr_, s32 dir_);
static void CallbackObjectSetEventIndex(void *objectPtr_, u16 a1);
static void CallbackObjectSetUnk_80AC998(void *objectPtr_, s32 a1_, s32 a2);
static bool8 CallbackObjectSpriteRelatedCheck_80AC9B8(void *objectPtr_);
static bool8 CallbackObjectSpriteRelated_80AC9DC(void *objectPtr_);
static void CallbackObjectGetFlags(void *objectPtr_, u32 *flags);
static void CallbackObjectSetFlags(void *objectPtr_, u32 flags);
static void CallbackObjectClearFlags(void *objectPtr_, u32 flags);
static s32 CallbackObjectMoveRelative(void *objectPtr_, PixelPos *pos);
static const CallbackData gGroundObjectCallbacks = {
@@ -153,7 +153,6 @@ const u8 gUnknown_8118334[];
static const struct ScriptCommand gUnknown_81182F4[] = {
@@ -171,8 +170,31 @@ static const struct ScriptCommand gUnknown_8118350[] = {
JUMP_LABEL(0),
};
const u8 gUnknown_81183A0[] = {
0xFF, 0xFF, 0x0, 0x8, 0x1, 0x8, 0x0, 0x10, 0x1, 0x10, 0x2, 0x10, 0x3, 0x10, 0x0, 0x8, 0x1, 0x8, 0x2, 0x8, 0x3, 0x8, 0x4, 0x8, 0x5, 0x8, 0x6, 0x8, 0x7, 0x8, 0x8, 0x8, 0x9, 0x8, 0xA, 0x8, 0xB, 0x8, 0xC, 0x8, 0xD, 0x8, 0xE, 0x8, 0xF, 0x8, 0x0, 0x0};
const s16 gUnknown_81183A0[] = {
0xFFFF,
0x800,
0x801,
0x1000,
0x1001,
0x1002,
0x1003,
0x800,
0x801,
0x802,
0x803,
0x804,
0x805,
0x806,
0x807,
0x808,
0x809,
0x80A,
0x80B,
0x80C,
0x80D,
0x80E,
0x80F,
0};
void AllocGroundObjects(void)
{
@@ -369,7 +391,7 @@ s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 s
parent = &gGroundObjects[id];
Log(0,"GroundObject Add id %3d kind %3d[%3d] type %3d group %3d sector %3d",id,kind,objectData->kind,typeDataPtr->unk0,group,sector);
bVar12 = (parent->unk6 == -1);
parent->unk4 = id;
parent->id = id;
parent->unk6 = kind;
parent->unk8 = group;
parent->unkA = sector;
@@ -436,7 +458,7 @@ s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 s
SetUnkInGroundEvent(&objectData->pos, &parent->unk20);
if (bVar12) {
parent->unk120 = parent->unk1C;
parent->direction = parent->unk1C;
parent->unk124.x = parent->unk20.x - parent->unk14.x;
parent->unk12C.x = parent->unk20.x + parent->unk14.x;
parent->unk124.y = parent->unk20.y - parent->unk14.y;
@@ -446,7 +468,7 @@ s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 s
GetCurrentDungeonBounds(&parent->unk28,&parent->unk30);
if (bVar12) {
parent->unk13E = 0x800;
parent->unk13C = 1;
parent->directionRelated = 1;
parent->unk140 = 0;
sub_80A75CC(&(parent->unk144),id,parent->unk6, parent->flags);
}
@@ -543,7 +565,7 @@ bool8 GroundObject_ExecuteScript(s32 index_, void *a1, ScriptInfoSmall *script)
if(parent->unk6 != -1)
{
GroundScript_ExecutePP(&parent->unk38, (ActionUnkIds *)a1, script, DEBUG_LOC_PTR(gUnknown_8118334, 0x303, "GroundObject_ExecuteScript"));
parent->unk13C = 1;
parent->directionRelated = 1;
return 1;
}
else {
@@ -778,87 +800,87 @@ s32 GetObjectCollision_80AC5F4(GroundObject *param_1, PixelPos *param_2, PixelPo
s32 TryMoveObjectRelative_80AC6AC(GroundObject *param_1,PixelPos *param_2)
{
PixelPos local_1c;
PixelPos local_14;
PixelPos local_1c;
PixelPos local_14;
local_1c.x = param_2->x - (param_1->unk14).x;
local_1c.y = param_2->y - (param_1->unk14).y;
local_14.x = param_2->x + (param_1->unk14).x;
local_14.y = param_2->y + (param_1->unk14).y;
if ((((local_1c.x < param_1->unk28.x) || (local_14.x >= param_1->unk30.x)) ||
(local_1c.y < param_1->unk28.y)) || (local_14.y >= param_1->unk30.y)) {
return 1;
}
else {
s32 ret = GetObjectCollision_80AC5F4(param_1,&local_1c,&local_14);
if (ret == 0) {
(param_1->unk124) = local_1c;
param_1->unk12C = local_14;
return 0;
local_1c.x = param_2->x - (param_1->unk14).x;
local_1c.y = param_2->y - (param_1->unk14).y;
local_14.x = param_2->x + (param_1->unk14).x;
local_14.y = param_2->y + (param_1->unk14).y;
if ((((local_1c.x < param_1->unk28.x) || (local_14.x >= param_1->unk30.x)) ||
(local_1c.y < param_1->unk28.y)) || (local_14.y >= param_1->unk30.y)) {
return 1;
}
else {
s32 ret = GetObjectCollision_80AC5F4(param_1,&local_1c,&local_14);
if (ret == 0) {
(param_1->unk124) = local_1c;
param_1->unk12C = local_14;
return 0;
}
return ret;
}
return ret;
}
}
s32 TryMoveRelative_80AC720(GroundObject *param_1,PixelPos *param_2)
{
s32 ret;
bool8 bVar1;
PixelPos iVar2;
PixelPos uVar4;
iVar2.x = (param_1->unk124).x + param_2->x;
iVar2.y = (param_1->unk124).y + param_2->y;
uVar4.x = param_1->unk12C.x + param_2->x;
uVar4.y = param_1->unk12C.y + param_2->y;
bVar1 = 0;
s32 ret;
bool8 bVar1;
PixelPos iVar2;
PixelPos uVar4;
if (iVar2.x < param_1->unk28.x) {
iVar2.x = param_1->unk28.x;
uVar4.x = param_1->unk28.x + param_1->unkC.x;
bVar1 = 1;
}
else {
if (uVar4.x >= param_1->unk30.x) {
iVar2.x = param_1->unk30.x - param_1->unkC.x;
uVar4.x = param_1->unk30.x;
bVar1 = 1;
}
}
iVar2.x = (param_1->unk124).x + param_2->x;
iVar2.y = (param_1->unk124).y + param_2->y;
uVar4.x = param_1->unk12C.x + param_2->x;
uVar4.y = param_1->unk12C.y + param_2->y;
if (iVar2.y < param_1->unk28.y) {
iVar2.y = param_1->unk28.y;
uVar4.y = param_1->unk28.y + param_1->unkC.y;
bVar1 = 1;
}
else {
if (uVar4.y >= param_1->unk30.y){
iVar2.y = param_1->unk30.y - param_1->unkC.y;
uVar4.y = param_1->unk30.y;
bVar1 = 0;
if (iVar2.x < param_1->unk28.x) {
iVar2.x = param_1->unk28.x;
uVar4.x = param_1->unk28.x + param_1->unkC.x;
bVar1 = 1;
}
}
else {
if (uVar4.x >= param_1->unk30.x) {
iVar2.x = param_1->unk30.x - param_1->unkC.x;
uVar4.x = param_1->unk30.x;
bVar1 = 1;
}
}
ret = GetObjectCollision_80AC5F4(param_1,&iVar2,&uVar4);
if (ret == 0) {
(param_1->unk124) = iVar2;
param_1->unk12C = uVar4;
if (!bVar1) {
return 0;
if (iVar2.y < param_1->unk28.y) {
iVar2.y = param_1->unk28.y;
uVar4.y = param_1->unk28.y + param_1->unkC.y;
bVar1 = 1;
}
else {
return 1;
if (uVar4.y >= param_1->unk30.y){
iVar2.y = param_1->unk30.y - param_1->unkC.y;
uVar4.y = param_1->unk30.y;
bVar1 = 1;
}
}
}
return ret;
ret = GetObjectCollision_80AC5F4(param_1,&iVar2,&uVar4);
if (ret == 0) {
(param_1->unk124) = iVar2;
param_1->unk12C = uVar4;
if (!bVar1) {
return 0;
}
else {
return 1;
}
}
return ret;
}
static s16 CallbackObjectGetIndex(void *ptr)
{
struct GroundObject *groundObject = ptr;
return groundObject->unk4;
return groundObject->id;
}
static void CallbackObjectGetSize(void *objectPtr_, PixelPos *out)
@@ -883,10 +905,10 @@ static void CallbackObjectSetHitboxPos(void *objectPtr_, PixelPos *posOrNull)
objectPtr->unk124.y = objectPtr->unk20.y - objectPtr->unk14.y;
objectPtr->unk12C.y = objectPtr->unk20.y + objectPtr->unk14.y;
objectPtr->unk134.x = objectPtr->unk134.y = 0;
if (objectPtr->unk120 != objectPtr->unk1C) {
objectPtr->unk13C = TRUE;
if (objectPtr->direction != objectPtr->unk1C) {
objectPtr->directionRelated = TRUE;
}
objectPtr->unk120 = objectPtr->unk1C;
objectPtr->direction = objectPtr->unk1C;
}
}
@@ -911,3 +933,163 @@ static s32 CallbackObjectMoveReal(void *objectPtr_, PixelPos *pos)
struct GroundObject *objectPtr = objectPtr_;
return TryMoveObjectRelative_80AC6AC(objectPtr, pos);
}
static void CallbackObjectGetPosHeightAndUnk(void *objectPtr_, u32 *height, u32 *unk)
{
struct GroundObject *objectPtr = objectPtr_;
*height = objectPtr->unk134.x;
*unk= objectPtr->unk134.y;
}
static void CallbackObjectSetPosHeight(void *objectPtr_, u32 height)
{
struct GroundObject *objectPtr = objectPtr_;
objectPtr->unk134.x = height;
}
static void CallbackObjectGetDirection(void *objectPtr_, s8 *dir)
{
struct GroundObject *objectPtr = objectPtr_;
*dir = objectPtr->direction;
}
static void CallbackObjectSetDirection(void *livesPtr_, s32 direction)
{
struct GroundObject *livesPtr = livesPtr_;
s32 dir = (s8) direction;
if (dir != -1) {
livesPtr->direction = dir;
}
}
static void CallbackObjectSetEventIndex(void *livesPtr_, u16 a1) {
struct GroundObject *livesPtr = livesPtr_;
u32 r1;
u16 f1 = a1 & 0xFF;
if (f1 != 0)
{
r1 = gUnknown_81183A0[f1];
}
else
{
r1 = livesPtr->unk13E;
}
if(livesPtr->unk13E != (s16) r1)
{
livesPtr->unk13E = r1;
livesPtr->directionRelated = 1;
}
else if((livesPtr->unk13E & 0x1000))
livesPtr->directionRelated = 1;
}
static void CallbackObjectSetUnk_80AC998(void *objectPtr_, s32 a1_, s32 a2) {
struct GroundObject *livesPtr = objectPtr_;
s32 a1Match = (s16) a1_;
#ifndef NONMATCHING
register s16 a1 asm("r2") = a1Match;
#else
s32 a1 = a1Match;
#endif
if (a1Match == 0) {
a1 = 448;
}
livesPtr->unk140 = a1;
}
extern bool8 sub_80A66F8(struct UnkGroundSpriteStruct *ptr);
extern bool8 sub_80A671C(struct UnkGroundSpriteStruct *ptr);
static bool8 CallbackObjectSpriteRelatedCheck_80AC9B8(void *objectPtr_)
{
struct GroundObject *livesPtr = objectPtr_;
if (livesPtr->directionRelated) {
return TRUE;
}
else {
return sub_80A66F8(&livesPtr->unk144);
}
}
static bool8 CallbackObjectSpriteRelated_80AC9DC(void *objectPtr_)
{
struct GroundObject *livesPtr = objectPtr_;
if (livesPtr->unk140 != 0) {
return TRUE;
}
else {
return sub_80A671C(&livesPtr->unk144);
}
}
static void CallbackObjectGetFlags(void *livesPtr_, u32 *flags)
{
struct GroundObject *livesPtr = livesPtr_;
*flags = livesPtr->flags;
}
static void CallbackObjectSetFlags(void *livesPtr_, u32 flags)
{
struct GroundObject *livesPtr = livesPtr_;
sub_80AC1B0(livesPtr->id, flags);
}
static void CallbackObjectClearFlags(void *livesPtr_, u32 flags)
{
struct GroundObject *livesPtr = livesPtr_;
sub_80AC1F4(livesPtr->id, flags);
}
static s32 CallbackObjectMoveRelative(void *livesPtr_, PixelPos *pos)
{
struct GroundObject *livesPtr = livesPtr_;
return TryMoveRelative_80AC720(livesPtr, pos);
}
extern DebugLocation gUnknown_8118524;
extern DebugLocation gUnknown_8118530;
extern s16 HandleAction(Action *action, DebugLocation *debug);
void GroundObject_Action(void)
{
GroundObject *objectPtr;
s32 i;
for (objectPtr = &gGroundObjects[0], i = 0; i < 0x10; i = (s16)(i + 1), objectPtr++)
{
if (objectPtr->unk6 != -1) {
switch(HandleAction(&objectPtr->unk38, &gUnknown_8118524))
{
case 4:
GroundObject_Delete(i);
continue;
case 0:
ExecutePredefinedScript(&objectPtr->unk38, NULL, 1, &gUnknown_8118530);
break;
}
if (objectPtr->directionRelated) {
objectPtr->directionRelated = FALSE;
sub_80A6EFC(&objectPtr->unk144,objectPtr->unk13E & 0x1f00,(s8)objectPtr->unk13E);
}
}
}
}