Decompile Object21

This commit is contained in:
octorock 2022-02-28 22:45:04 +01:00
parent 6b6f946caf
commit 241c0312d9
6 changed files with 156 additions and 331 deletions

View File

@ -1,288 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start Object21
Object21: @ 0x08087998
push {r4, lr}
adds r4, r0, #0
ldr r0, _080879C0 @ =gUnk_08120A68
ldrb r1, [r4, #0xc]
lsls r1, r1, #2
adds r1, r1, r0
ldr r1, [r1]
adds r0, r4, #0
bl _call_via_r1
adds r0, r4, #0
bl GetNextFrame
ldrb r0, [r4, #0xe]
cmp r0, #0
beq _080879C4
subs r0, #1
strb r0, [r4, #0xe]
b _080879EA
.align 2, 0
_080879C0: .4byte gUnk_08120A68
_080879C4:
adds r0, r4, #0
adds r0, #0x58
ldrb r0, [r0]
cmp r0, #0xa
bne _080879D8
adds r0, r4, #0
movs r1, #0xd
bl InitializeAnimation
b _080879EA
_080879D8:
adds r0, r4, #0
adds r0, #0x5a
ldrb r1, [r0]
movs r0, #0x80
ands r0, r1
cmp r0, #0
beq _080879EA
bl DeleteThisEntity
_080879EA:
movs r1, #0x24
ldrsh r0, [r4, r1]
cmp r0, #0
beq _08087A0C
adds r0, r4, #0
bl LinearMoveUpdate
ldrh r1, [r4, #0x24]
movs r2, #0x24
ldrsh r0, [r4, r2]
cmp r0, #0x10
ble _08087A08
adds r0, r1, #0
subs r0, #0x10
b _08087A0A
_08087A08:
movs r0, #0
_08087A0A:
strh r0, [r4, #0x24]
_08087A0C:
pop {r4, pc}
.align 2, 0
thumb_func_start sub_08087A10
sub_08087A10: @ 0x08087A10
push {r4, lr}
adds r4, r0, #0
movs r0, #1
strb r0, [r4, #0xc]
ldrb r0, [r4, #0xb]
cmp r0, #0
beq _08087A26
adds r0, r4, #0
movs r1, #3
bl ChangeObjPalette
_08087A26:
ldrb r0, [r4, #0xa]
cmp r0, #2
bls _08087A3C
ldr r0, _08087A4C @ =gUnk_08120A78
ldrb r1, [r4, #0xa]
subs r1, #3
adds r1, r1, r0
ldrb r1, [r1]
adds r0, r4, #0
bl ChangeObjPalette
_08087A3C:
ldrb r0, [r4, #0xa]
cmp r0, #4
bhi _08087AF0
lsls r0, r0, #2
ldr r1, _08087A50 @ =_08087A54
adds r0, r0, r1
ldr r0, [r0]
mov pc, r0
.align 2, 0
_08087A4C: .4byte gUnk_08120A78
_08087A50: .4byte _08087A54
_08087A54: @ jump table
.4byte _08087A76 @ case 0
.4byte _08087AF0 @ case 1
.4byte _08087AA0 @ case 2
.4byte _08087A76 @ case 3
.4byte _08087A68 @ case 4
_08087A68:
adds r1, r4, #0
adds r1, #0x38
movs r0, #2
strb r0, [r1]
adds r0, r4, #0
bl UpdateSpriteForCollisionLayer
_08087A76:
ldrb r1, [r4, #0x10]
movs r0, #0x80
movs r2, #0
orrs r0, r1
strb r0, [r4, #0x10]
adds r1, r4, #0
adds r1, #0x45
movs r0, #1
strb r0, [r1]
subs r1, #9
movs r0, #7
strb r0, [r1]
adds r1, #3
movs r0, #0xaa
strb r0, [r1]
subs r1, #4
movs r0, #0xe
strb r0, [r1]
ldr r0, _08087AE4 @ =gUnk_08120A8C
str r0, [r4, #0x48]
strb r2, [r4, #0x1c]
_08087AA0:
bl Random
ldr r2, _08087AE8 @ =gUnk_08120A7A
movs r3, #3
adds r1, r0, #0
ands r1, r3
adds r1, r1, r2
ldrb r1, [r1]
strb r1, [r4, #0xe]
lsrs r2, r0, #8
ands r2, r3
movs r1, #0x10
ands r1, r0
cmp r1, #0
beq _08087AC0
rsbs r2, r2, #0
_08087AC0:
ldrh r0, [r4, #0x2e]
adds r0, r0, r2
strh r0, [r4, #0x2e]
ldrh r0, [r4, #0x32]
adds r0, r0, r2
strh r0, [r4, #0x32]
ldr r0, _08087AEC @ =gPlayerEntity
adds r0, #0x38
ldrb r1, [r0]
adds r0, r4, #0
adds r0, #0x38
strb r1, [r0]
adds r0, r4, #0
movs r1, #0xa
bl InitializeAnimation
b _08087AF8
.align 2, 0
_08087AE4: .4byte gUnk_08120A8C
_08087AE8: .4byte gUnk_08120A7A
_08087AEC: .4byte gPlayerEntity
_08087AF0:
adds r0, r4, #0
movs r1, #0x10
bl InitializeAnimation
_08087AF8:
pop {r4, pc}
.align 2, 0
thumb_func_start sub_08087AFC
sub_08087AFC: @ 0x08087AFC
push {r4, lr}
adds r4, r0, #0
adds r0, #0x41
ldrb r1, [r0]
movs r0, #0x80
ands r0, r1
cmp r0, #0
beq _08087B56
movs r0, #0x7f
ands r0, r1
cmp r0, #0x16
beq _08087B3C
cmp r0, #0x16
bgt _08087B1E
cmp r0, #0x13
beq _08087B4E
b _08087B56
_08087B1E:
cmp r0, #0x1c
bgt _08087B56
cmp r0, #0x1b
blt _08087B56
ldr r1, [r4, #0x4c]
adds r0, r1, #0
adds r0, #0x84
ldr r0, [r0]
adds r1, #0x80
ldr r1, [r1]
ldr r2, [r4, #0x2c]
ldr r3, [r4, #0x30]
bl CalculateDirectionTo
b _08087B44
_08087B3C:
ldr r0, [r4, #0x4c]
adds r1, r4, #0
bl GetFacingDirection
_08087B44:
strb r0, [r4, #0x15]
movs r0, #0x80
lsls r0, r0, #1
strh r0, [r4, #0x24]
b _08087B56
_08087B4E:
movs r1, #0
movs r0, #3
strb r0, [r4, #0xc]
strb r1, [r4, #0xd]
_08087B56:
pop {r4, pc}
thumb_func_start sub_08087B58
sub_08087B58: @ 0x08087B58
push {lr}
adds r2, r0, #0
adds r0, #0x41
ldrb r1, [r0]
movs r0, #0x80
ands r0, r1
cmp r0, #0
beq _08087B80
ldr r0, _08087B7C @ =gUnk_08120A80
ldrb r1, [r2, #0xd]
lsls r1, r1, #2
adds r1, r1, r0
ldr r1, [r1]
adds r0, r2, #0
bl _call_via_r1
b _08087B84
.align 2, 0
_08087B7C: .4byte gUnk_08120A80
_08087B80:
movs r0, #1
strb r0, [r2, #0xc]
_08087B84:
pop {pc}
.align 2, 0
thumb_func_start sub_08087B88
sub_08087B88: @ 0x08087B88
adds r2, r0, #0
adds r2, #0x46
movs r1, #0x80
lsls r1, r1, #1
strh r1, [r2]
movs r1, #1
strb r1, [r0, #0xd]
strb r1, [r0, #0x1d]
bx lr
.align 2, 0
thumb_func_start sub_08087B9C
sub_08087B9C: @ 0x08087B9C
push {lr}
bl sub_0806F3E4
cmp r0, #0
beq _08087BAA
bl DeleteThisEntity
_08087BAA:
pop {pc}

View File

@ -42905,21 +42905,6 @@
"start": 1182280,
"size": 12
},
{
"path": "object21/gUnk_08120A78.bin",
"start": 1182328,
"size": 2
},
{
"path": "object21/gUnk_08120A7A.bin",
"start": 1182330,
"size": 6
},
{
"path": "object21/gUnk_08120A8C.bin",
"start": 1182348,
"size": 8
},
{
"path": "animations/gSpriteAnimations_FigurineDevice_0.bin",
"start": 1182440,

View File

@ -1,25 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.section .rodata
.align 2
gUnk_08120A68:: @ 08120A68
.4byte sub_08087A10
.4byte sub_08087AFC
.4byte 00000000
.4byte sub_08087B58
gUnk_08120A78:: @ 08120A78
.incbin "object21/gUnk_08120A78.bin"
gUnk_08120A7A:: @ 08120A7A
.incbin "object21/gUnk_08120A7A.bin"
gUnk_08120A80:: @ 08120A80
.4byte sub_08087B88
.4byte sub_08087B9C
.4byte sub_08087B9C
gUnk_08120A8C:: @ 08120A8C
.incbin "object21/gUnk_08120A8C.bin"

View File

@ -259,7 +259,7 @@ void Object1D(Entity*);
void Object1E(Entity*);
void Object1F(Entity*);
void Object20(Entity*);
void Object21(Entity*);
void Object21();
void FigurineDevice();
void EyeSwitch(Entity*);
void PressurePlate();

View File

@ -653,7 +653,7 @@ SECTIONS {
asm/object/object1E.o(.text);
asm/object/object1F.o(.text);
asm/object/object20.o(.text);
asm/object/object21.o(.text);
src/object/object21.o(.text);
src/object/figurineDevice.o(.text);
src/object/eyeSwitch.o(.text);
src/object/pressurePlate.o(.text);
@ -1375,7 +1375,7 @@ SECTIONS {
data/const/object/object1F.o(.rodata);
data/const/object/object20.o(.rodata);
data/animations/object/object20.o(.rodata);
data/const/object/object21.o(.rodata);
src/object/object21.o(.rodata);
src/object/figurineDevice.o(.rodata);
data/animations/object/figurineDevice.o(.rodata);
src/object/eyeSwitch.o(.rodata);

153
src/object/object21.c Normal file
View File

@ -0,0 +1,153 @@
/**
* @file object21.c
* @ingroup Objects
*
* @brief Object21 object
*/
#define NENT_DEPRECATED
#include "global.h"
#include "object.h"
#include "functions.h"
typedef struct {
/*0x00*/ Entity base;
/*0x68*/ u8 unk_68[0x18];
/*0x80*/ u32 unk_80;
/*0x84*/ u32 unk_84;
} Object21Entity;
void sub_08087A10(Object21Entity*);
void sub_08087AFC(Object21Entity*);
void sub_08087B58(Object21Entity*);
void sub_08087B88(Object21Entity*);
void sub_08087B9C(Object21Entity*);
void sub_08087B9C(Object21Entity*);
void Object21(Object21Entity* this) {
static void (*const gUnk_08120A68[])(Object21Entity*) = {
sub_08087A10,
sub_08087AFC,
NULL,
sub_08087B58,
};
gUnk_08120A68[super->action](this);
GetNextFrame(super);
if (super->actionDelay != 0) {
super->actionDelay--;
} else {
if (super->animIndex == 0xa) {
InitializeAnimation(super, 0xd);
} else if ((super->frame & 0x80) != 0) {
DeleteThisEntity();
}
}
if (super->speed != 0) {
LinearMoveUpdate(super);
if (super->speed > 0x10) {
super->speed -= 0x10;
} else {
super->speed = 0;
}
}
}
extern const Hitbox gUnk_08120A8C;
void sub_08087A10(Object21Entity* this) {
static const u8 gUnk_08120A78[] = {
3,
63,
};
static const u8 gUnk_08120A7A[] = {
15, 24, 30, 35, 0, 0,
};
u32 rand;
u32 tmp;
super->action = 1;
if (super->type2 != 0) {
ChangeObjPalette(super, 3);
}
if (super->type > 2) {
ChangeObjPalette(super, gUnk_08120A78[super->type - 3]);
}
switch (super->type) {
case 4:
super->collisionLayer = 2;
UpdateSpriteForCollisionLayer(super);
case 0:
case 3:
super->flags |= ENT_COLLIDE;
super->health = 1;
super->field_0x3c = 7;
super->hitType = 0xaa;
super->flags2 = 0x0e;
super->hitbox = (Hitbox*)&gUnk_08120A8C;
super->field_0x1c = 0;
case 2:
rand = Random();
super->actionDelay = gUnk_08120A7A[rand & 3];
tmp = (rand >> 8) & 3;
if ((rand & 0x10) != 0) {
tmp = -tmp;
}
super->x.HALF.HI += tmp;
super->y.HALF.HI += tmp;
super->collisionLayer = gPlayerEntity.collisionLayer;
InitializeAnimation(super, 10);
return;
case 1:
break;
}
InitializeAnimation(super, 0x10);
}
void sub_08087AFC(Object21Entity* this) {
Object21Entity* entity;
if ((super->bitfield & 0x80) == 0) {
return;
}
switch (super->bitfield & 0x7f) {
case 0x16:
super->direction = GetFacingDirection(super->field_0x4c, super);
super->speed = 0x100;
break;
case 0x13:
super->action = 3;
super->subAction = 0;
break;
case 0x1b:
case 0x1c:
entity = (Object21Entity*)super->field_0x4c;
super->direction = CalculateDirectionTo(entity->unk_84, entity->unk_80, super->x.WORD, super->y.WORD);
super->speed = 0x100;
break;
}
}
void sub_08087B58(Object21Entity* this) {
static void (*const gUnk_08120A80[])(Object21Entity*) = {
sub_08087B88,
sub_08087B9C,
sub_08087B9C,
};
if ((super->bitfield & 0x80) != 0) {
gUnk_08120A80[super->subAction](this);
} else {
super->action = 1;
}
}
const Hitbox gUnk_08120A8C = { 0, 0, { 6, 3, 3, 6 }, 3, 3 };
void sub_08087B88(Object21Entity* this) {
super->knockbackSpeed = 0x100;
super->subAction = 1;
super->field_0x1d = 1;
}
void sub_08087B9C(Object21Entity* this) {
if (sub_0806F3E4(super)) {
DeleteThisEntity();
}
}