decompile Sensor BladeTrap

This commit is contained in:
Behemoth 2020-09-20 18:50:37 +02:00
parent 0703d4ad8b
commit e6e690107c
4 changed files with 122 additions and 248 deletions

View File

@ -1,238 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start SensorBladeTrap
SensorBladeTrap: @ 0x0802B9D4
push {lr}
ldr r2, _0802B9E8 @ =gUnk_080CD3C4
ldrb r1, [r0, #0xc]
lsls r1, r1, #2
adds r1, r1, r2
ldr r1, [r1]
bl _call_via_r1
pop {pc}
.align 2, 0
_0802B9E8: .4byte gUnk_080CD3C4
thumb_func_start sub_0802B9EC
sub_0802B9EC: @ 0x0802B9EC
adds r2, r0, #0
movs r0, #1
strb r0, [r2, #0xc]
ldr r1, _0802BA14 @ =gUnk_080CD3D4
ldrb r0, [r2, #0xa]
lsls r0, r0, #1
adds r0, r0, r1
ldrh r1, [r0]
adds r0, r2, #0
adds r0, #0x78
strh r1, [r0]
adds r0, #0xc
ldrh r1, [r0]
subs r0, #8
strh r1, [r0]
adds r0, #0xa
ldrh r1, [r0]
subs r0, #8
strh r1, [r0]
bx lr
.align 2, 0
_0802BA14: .4byte gUnk_080CD3D4
thumb_func_start sub_0802BA18
sub_0802BA18: @ 0x0802BA18
push {r4, r5, lr}
adds r4, r0, #0
movs r1, #1
movs r2, #0xe
bl sub_0804A024
adds r5, r0, #0
cmp r5, #0xff
beq _0802BA88
adds r0, r4, #0
adds r1, r5, #0
bl sub_0802BB2C
cmp r0, #0
bne _0802BA88
movs r0, #2
strb r0, [r4, #0xc]
adds r0, r4, #0
adds r0, #0x78
ldrh r0, [r0]
strh r0, [r4, #0x24]
strb r5, [r4, #0x15]
lsrs r0, r5, #3
cmp r0, #1
beq _0802BA60
cmp r0, #1
blo _0802BA58
cmp r0, #2
beq _0802BA6C
cmp r0, #3
beq _0802BA78
b _0802BA88
_0802BA58:
adds r1, r4, #0
adds r1, #0x7e
ldrh r0, [r4, #0x32]
b _0802BA7E
_0802BA60:
adds r0, r4, #0
adds r0, #0x7c
ldrh r0, [r0]
ldrh r1, [r4, #0x2e]
adds r0, r0, r1
b _0802BA82
_0802BA6C:
adds r0, r4, #0
adds r0, #0x7e
ldrh r0, [r0]
ldrh r1, [r4, #0x32]
adds r0, r0, r1
b _0802BA82
_0802BA78:
adds r1, r4, #0
adds r1, #0x7c
ldrh r0, [r4, #0x2e]
_0802BA7E:
ldrh r1, [r1]
subs r0, r0, r1
_0802BA82:
adds r1, r4, #0
adds r1, #0x7a
strh r0, [r1]
_0802BA88:
pop {r4, r5, pc}
.align 2, 0
thumb_func_start sub_0802BA8C
sub_0802BA8C: @ 0x0802BA8C
push {r4, lr}
adds r4, r0, #0
bl sub_080AF038
cmp r0, #0
beq _0802BADE
ldrb r0, [r4, #0x15]
lsrs r0, r0, #3
cmp r0, #1
beq _0802BAC4
cmp r0, #1
bgt _0802BAAA
cmp r0, #0
beq _0802BAB4
b _0802BAFA
_0802BAAA:
cmp r0, #2
beq _0802BAD0
cmp r0, #3
beq _0802BAE6
b _0802BAFA
_0802BAB4:
adds r0, r4, #0
adds r0, #0x7a
ldrh r1, [r0]
movs r2, #0x32
ldrsh r0, [r4, r2]
cmp r1, r0
blt _0802BAFA
b _0802BADE
_0802BAC4:
adds r0, r4, #0
adds r0, #0x7a
ldrh r1, [r0]
movs r2, #0x2e
ldrsh r0, [r4, r2]
b _0802BADA
_0802BAD0:
adds r0, r4, #0
adds r0, #0x7a
ldrh r1, [r0]
movs r2, #0x32
ldrsh r0, [r4, r2]
_0802BADA:
cmp r1, r0
bgt _0802BAFA
_0802BADE:
adds r0, r4, #0
bl sub_0802BB10
b _0802BAFA
_0802BAE6:
adds r0, r4, #0
adds r0, #0x7a
ldrh r1, [r0]
movs r2, #0x2e
ldrsh r0, [r4, r2]
cmp r1, r0
blt _0802BAFA
adds r0, r4, #0
bl sub_0802BB10
_0802BAFA:
pop {r4, pc}
thumb_func_start sub_0802BAFC
sub_0802BAFC: @ 0x0802BAFC
push {r4, lr}
adds r4, r0, #0
bl sub_080AF038
cmp r0, #0
bne _0802BB0C
movs r0, #1
strb r0, [r4, #0xc]
_0802BB0C:
pop {r4, pc}
.align 2, 0
thumb_func_start sub_0802BB10
sub_0802BB10: @ 0x0802BB10
push {lr}
movs r1, #3
strb r1, [r0, #0xc]
movs r1, #0xc0
strh r1, [r0, #0x24]
ldrb r1, [r0, #0x15]
movs r2, #0x10
eors r1, r2
strb r1, [r0, #0x15]
movs r0, #0x74
bl EnqueueSFX
pop {pc}
.align 2, 0
thumb_func_start sub_0802BB2C
sub_0802BB2C: @ 0x0802BB2C
push {r4, lr}
adds r2, r0, #0
adds r0, #0x38
ldrb r0, [r0]
ldr r4, _0802BB60 @ =gUnk_02027EB4
cmp r0, #2
bne _0802BB3C
ldr r4, _0802BB64 @ =gUnk_0200D654
_0802BB3C:
lsrs r3, r1, #2
ldr r0, _0802BB68 @ =gUnk_080CD3DC
adds r3, r3, r0
movs r0, #0x2e
ldrsh r1, [r2, r0]
movs r0, #0
ldrsb r0, [r3, r0]
adds r1, r1, r0
movs r0, #0x32
ldrsh r2, [r2, r0]
movs r0, #1
ldrsb r0, [r3, r0]
adds r2, r2, r0
adds r0, r4, #0
movs r3, #0
bl sub_080AE4CC
pop {r4, pc}
.align 2, 0
_0802BB60: .4byte gUnk_02027EB4
_0802BB64: .4byte gUnk_0200D654
_0802BB68: .4byte gUnk_080CD3DC

View File

@ -3,15 +3,6 @@
.section .rodata
gUnk_080CD3C4:: @ 080CD3C4
.incbin "baserom.gba", 0x0CD3C4, 0x0000010
gUnk_080CD3D4:: @ 080CD3D4
.incbin "baserom.gba", 0x0CD3D4, 0x0000008
gUnk_080CD3DC:: @ 080CD3DC
.incbin "baserom.gba", 0x0CD3DC, 0x0000008
gUnk_080CD3E4:: @ 080CD3E4
.incbin "baserom.gba", 0x0CD3E4, 0x0000018

View File

@ -356,7 +356,7 @@ SECTIONS {
src/enemy/spark.o(.text);
src/enemy/chaser.o(.text);
src/enemy/spikedBeetle.o(.text);
asm/sensorBladeTrap.o(.text);
src/enemy/sensorBladeTrap.o(.text);
asm/helmasaur.o(.text);
asm/fallingBoulder.o(.text);
asm/bobomb.o(.text);
@ -964,6 +964,7 @@ SECTIONS {
data/animations/chaser.o(.rodata);
src/enemy/spikedBeetle.o(.rodata);
data/animations/spikedBeetle.o(.rodata);
src/enemy/sensorBladeTrap.o(.rodata);
data/data_080CC6FC.o(.rodata);
src/enemy.o(.rodata);
data/data_080D3D94.o(.rodata);

120
src/enemy/sensorBladeTrap.c Normal file
View File

@ -0,0 +1,120 @@
#include "enemy.h"
#include "functions.h"
extern u32 sub_0804A024(Entity*, u32, u32);
extern bool32 sub_080AE4CC(Entity*, u32, u32, u32);
extern bool32 sub_080AF038(Entity*);
extern Entity gUnk_02027EB4;
extern Entity gUnk_0200D654;
void sub_0802BB10(Entity*);
bool32 sub_0802BB2C(Entity*, u32);
extern void (*const gUnk_080CD3C4[])(Entity*);
extern const u16 gUnk_080CD3D4[];
extern const s8 gUnk_080CD3DC[];
void SensorBladeTrap(Entity* this) {
gUnk_080CD3C4[this->action](this);
}
void sub_0802B9EC(Entity* this) {
this->action = 1;
this->field_0x78.HWORD = gUnk_080CD3D4[this->entityType.form];
this->field_0x7c.HALF.LO = this->cutsceneBeh.HWORD;
this->field_0x7c.HALF.HI = this->field_0x86.HWORD;
}
void sub_0802BA18(Entity* this) {
u32 direction = sub_0804A024(this, 1, 0xe);
if (direction == 0xff)
return;
if (sub_0802BB2C(this, direction))
return;
this->action = 2;
this->nonPlanarMovement = this->field_0x78.HWORD;
this->direction = direction;
switch (direction >> 3) {
case 0:
this->field_0x7a.HWORD = this->y.HALF.HI - this->field_0x7c.HALF.HI;
break;
case 1:
this->field_0x7a.HWORD = this->x.HALF.HI + this->field_0x7c.HALF.LO;
break;
case 2:
this->field_0x7a.HWORD = this->y.HALF.HI + this->field_0x7c.HALF.HI;
break;
case 3:
this->field_0x7a.HWORD = this->x.HALF.HI - this->field_0x7c.HALF.LO;
break;
}
}
void sub_0802BA8C(Entity* this) {
if (!sub_080AF038(this)) {
sub_0802BB10(this);
} else {
switch (this->direction >> 3) {
case 0:
if (this->field_0x7a.HWORD >= this->y.HALF.HI)
sub_0802BB10(this);
break;
case 1:
if (this->field_0x7a.HWORD <= this->x.HALF.HI)
sub_0802BB10(this);
break;
case 2:
if (this->field_0x7a.HWORD <= this->y.HALF.HI)
sub_0802BB10(this);
break;
case 3:
if (this->field_0x7a.HWORD >= this->x.HALF.HI)
sub_0802BB10(this);
break;
}
}
}
void sub_0802BAFC(Entity* this) {
if (!sub_080AF038(this)) {
this->action = 1;
}
}
void sub_0802BB10(Entity* this) {
this->action = 3;
this->nonPlanarMovement = 0xc0;
this->direction = this->direction ^ 0x10;
EnqueueSFX(0x74);
}
bool32 sub_0802BB2C(Entity* this, u32 param_2) {
Entity* ent = this->collisionLayer == 2 ? &gUnk_0200D654 : &gUnk_02027EB4;
const s8* ptr = &gUnk_080CD3DC[param_2 >> 2];
return sub_080AE4CC(ent, this->x.HALF.HI + ptr[0], this->y.HALF.HI + ptr[1], 0);
}
// clang-format off
void (*const gUnk_080CD3C4[])(Entity*) = {
sub_0802B9EC,
sub_0802BA18,
sub_0802BA8C,
sub_0802BAFC,
};
const u16 gUnk_080CD3D4[] = {
0x100, 0x180,
0x200, 0x280,
};
const s8 gUnk_080CD3DC[] = {
0, -12,
12, 0,
0, 12,
-12, 0,
};
// clang-format on