Match minecart/sub_080919AC

This commit is contained in:
Marcus Huderle 2020-08-08 10:06:40 -05:00
parent 2c0b39832e
commit 57acabe4c2
2 changed files with 89 additions and 385 deletions

View File

@ -1,287 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
.syntax unified
push {r4, r5, r6, r7, lr}
mov r7, r8
push {r7}
adds r5, r0, #0
ldr r1, _080919D4 @ =gRoomControls
movs r0, #0
mov r8, r0
movs r0, #7
strb r0, [r1, #0xe]
ldr r0, _080919D8 @ =gLinkState
ldr r0, [r0, #0x30]
movs r1, #0x80
lsls r1, r1, #5
ands r0, r1
cmp r0, #0
bne _080919DC
movs r0, #1
strb r0, [r5, #0xc]
b _08091C04
.align 2, 0
_080919D4: .4byte gRoomControls
_080919D8: .4byte gLinkState
_080919DC:
ldr r4, _08091A14 @ =gLinkEntity
adds r6, r4, #0
adds r6, #0x5a
ldrb r1, [r6]
movs r7, #0xf
adds r0, r7, #0
ands r0, r1
cmp r0, #0
bne _08091A22
ldrb r1, [r5, #0x10]
movs r0, #0x7f
ands r0, r1
strb r0, [r5, #0x10]
adds r0, r5, #0
adds r1, r4, #0
bl CopyPosition
ldrb r1, [r6]
movs r0, #0xf0
ands r0, r1
cmp r0, #0x10
bne _08091A18
adds r1, r5, #0
adds r1, #0x63
movs r0, #1
strb r0, [r1]
b _08091C04
.align 2, 0
_08091A14: .4byte gLinkEntity
_08091A18:
adds r0, r5, #0
adds r0, #0x63
mov r1, r8
strb r1, [r0]
b _08091C04
_08091A22:
ldrb r0, [r5, #0x10]
movs r1, #0x80
orrs r0, r1
strb r0, [r5, #0x10]
mov r0, r8
strh r0, [r4, #0x24]
adds r0, r5, #0
bl sub_0806F69C
adds r0, r5, #0
adds r1, r4, #0
bl CopyPosition
adds r0, r5, #0
adds r0, #0x29
ldrb r1, [r0]
lsls r1, r1, #0x1d
lsrs r1, r1, #0x1d
subs r1, #1
adds r3, r4, #0
adds r3, #0x29
movs r0, #7
ands r1, r0
ldrb r2, [r3]
movs r0, #8
rsbs r0, r0, #0
ands r0, r2
orrs r0, r1
strb r0, [r3]
adds r0, r5, #0
bl sub_08091DDC
cmp r0, #0
beq _08091A68
b _08091C04
_08091A68:
ldr r0, _08091AD8 @ =gScreenTransition
ldr r0, [r0]
ands r0, r7
cmp r0, #0
bne _08091A7A
movs r0, #0x9c
lsls r0, r0, #1
bl PlaySFX
_08091A7A:
ldrb r0, [r5, #0xf]
subs r0, #1
strb r0, [r5, #0xf]
lsls r0, r0, #0x18
lsrs r0, r0, #0x18
cmp r0, #0xff
bne _08091A92
movs r0, #0x7b
bl PlaySFX
movs r0, #0x3c
strb r0, [r5, #0xf]
_08091A92:
ldr r2, _08091ADC @ =gUnk_081223C8
ldrb r0, [r5, #0x14]
lsls r0, r0, #1
adds r1, r0, r2
ldrb r1, [r1]
lsls r1, r1, #0x18
asrs r1, r1, #0x18
adds r0, #1
adds r0, r0, r2
movs r2, #0
ldrsb r2, [r0, r2]
adds r0, r5, #0
bl sub_080002B4
adds r4, r0, #0
ldr r1, _08091AE0 @ =gUnk_081223D8
ldrb r0, [r5, #0x14]
lsls r0, r0, #2
adds r0, r0, r1
ldr r1, [r0]
adds r0, r4, #0
bl sub_08007DD6
cmp r0, #0
bne _08091AE4
ldrb r0, [r5, #0x15]
movs r1, #0x10
eors r0, r1
strb r0, [r5, #0x15]
ldrb r0, [r5, #0x14]
movs r1, #2
eors r0, r1
strb r0, [r5, #0x14]
b _08091BD8
.align 2, 0
_08091AD8: .4byte gScreenTransition
_08091ADC: .4byte gUnk_081223C8
_08091AE0: .4byte gUnk_081223D8
_08091AE4:
adds r0, r4, #0
subs r0, #0x64
cmp r0, #0xb
bhi _08091BD8
lsls r0, r0, #2
ldr r1, _08091AF8 @ =_08091AFC
adds r0, r0, r1
ldr r0, [r0]
mov pc, r0
.align 2, 0
_08091AF8: .4byte _08091AFC
_08091AFC: @ jump table
.4byte _08091B2C @ case 0
.4byte _08091BD8 @ case 1
.4byte _08091BD8 @ case 2
.4byte _08091BB8 @ case 3
.4byte _08091BB8 @ case 4
.4byte _08091BB8 @ case 5
.4byte _08091BB8 @ case 6
.4byte _08091BD8 @ case 7
.4byte _08091BB8 @ case 8
.4byte _08091BB8 @ case 9
.4byte _08091BB8 @ case 10
.4byte _08091BB8 @ case 11
_08091B2C:
ldrb r1, [r5, #0x10]
movs r0, #0xdf
ands r0, r1
strb r0, [r5, #0x10]
adds r1, r5, #0
adds r1, #0x3f
movs r0, #1
strb r0, [r1]
subs r1, #3
movs r0, #0x47
strb r0, [r1]
adds r1, #4
movs r0, #0x44
strb r0, [r1]
subs r1, #5
movs r4, #0x80
movs r0, #0x80
strb r0, [r1]
movs r0, #6
strb r0, [r5, #0xc]
adds r0, r5, #0
bl sub_08017744
ldr r2, _08091BAC @ =gLinkState
movs r0, #0x41
strb r0, [r2, #2]
ldr r0, [r2, #0x30]
movs r1, #0x80
lsls r1, r1, #5
eors r0, r1
movs r1, #0x80
lsls r1, r1, #0x13
orrs r0, r1
str r0, [r2, #0x30]
ldr r1, _08091BB0 @ =gLinkEntity
movs r0, #0x80
lsls r0, r0, #0xa
str r0, [r1, #0x20]
movs r0, #0x80
lsls r0, r0, #2
strh r0, [r1, #0x24]
ldrb r0, [r5, #0x14]
lsls r0, r0, #1
strb r0, [r1, #0x14]
ldrb r0, [r5, #0x15]
strb r0, [r1, #0x15]
ldrb r0, [r1, #0x10]
orrs r4, r0
strb r4, [r1, #0x10]
adds r0, r5, #0
bl sub_08004168
ldrb r1, [r5, #0x14]
adds r1, #0xc
adds r0, r5, #0
bl InitAnimationForceUpdate
movs r0, #0x78
bl PlaySFX
ldr r0, _08091BB4 @ =0x00000139
bl PlaySFX
b _08091C04
.align 2, 0
_08091BAC: .4byte gLinkState
_08091BB0: .4byte gLinkEntity
_08091BB4: .4byte 0x00000139
_08091BB8:
adds r0, r5, #0
bl sub_080002B8
cmp r4, r0
bne _08091BD8
adds r0, r5, #0
bl sub_08091C0C
ldr r1, _08091BD4 @ =gLinkEntity
ldrb r0, [r5, #0x14]
lsls r0, r0, #1
strb r0, [r1, #0x14]
b _08091C04
.align 2, 0
_08091BD4: .4byte gLinkEntity
_08091BD8:
ldr r2, _08091BF8 @ =gLinkEntity
ldrb r0, [r5, #0x14]
lsls r1, r0, #1
strb r1, [r2, #0x14]
adds r1, r5, #0
adds r1, #0x58
ldrb r1, [r1]
lsls r0, r0, #0x18
lsrs r0, r0, #0x18
cmp r1, r0
bne _08091BFC
adds r0, r5, #0
bl UpdateAnimationSingleFrame
b _08091C04
.align 2, 0
_08091BF8: .4byte gLinkEntity
_08091BFC:
ldrb r1, [r5, #0x14]
adds r0, r5, #0
bl InitAnimationForceUpdate
_08091C04:
pop {r3}
mov r8, r3
pop {r4, r5, r6, r7, pc}
.align 2, 0
.syntax divided

View File

@ -3,6 +3,13 @@
#include "functions.h"
#include "room.h"
extern u32 sub_08091DDC(Entity*);
extern u32 sub_080002B4(Entity*, u32, u32);
extern u32 sub_08007DD6(u32, u32);
extern void sub_08017744(Entity*);
extern u32 sub_080002B8(Entity*);
extern void sub_08091C0C(Entity*);
typedef struct {
u16 field_0x0;
u16 field_0x2;
@ -17,6 +24,9 @@ extern void (*const gUnk_081223A8[])(Entity*);
extern struct_030010EC gUnk_030010EC[];
extern BoundingBox gUnk_080FD310;
extern const s8 gUnk_081223C8[];
extern const u32 gUnk_081223D8[];
void Minecart(Entity* this) {
gUnk_081223A8[this->action](this);
this->bitfield = 0;
@ -115,111 +125,92 @@ void sub_080918A4(Entity *this)
}
}
#if 0
typedef struct {
u8 field_0x0;
u8 field_0x1;
} struct_081223C8;
extern struct_081223C8 gUnk_081223C8[];
extern u32 gUnk_081223D8[];
void sub_080919AC(Entity *this)
{
u32 iVar2;
u32 uVar3;
u32 uVar4;
struct_081223C8* temp;
u32 iVar2;
u32 uVar3;
gRoomControls.unk5 = 7;
if ((gLinkState.flags.all & 0x1000) == 0) {
this->action = 1;
}
else {
if ((gLinkEntity.frames.all & 0xf) == 0) {
this->flags = this->flags & 0x7f;
CopyPosition(this,&gLinkEntity);
if ((gLinkEntity.frames.all & 0xf0) == 0x10) {
this->spriteOffsetY = 1;
}
else {
this->spriteOffsetY = 0;
}
gRoomControls.unk5 = 7;
if ((gLinkState.flags.all & 0x1000) == 0) {
this->action = 1;
return;
}
else {
this->flags = this->flags | 0x80;
gLinkEntity.nonPlanarMovement = 0;
sub_0806F69C(this);
CopyPosition(this,&gLinkEntity);
gLinkEntity.spritePriority.b0 = this->spritePriority.b0 - 1;
if (!sub_08091DDC(this)) {
if ((gScreenTransition.field_0x0 & 0xf) == 0) {
PlaySFX(0x138);
}
if (--this->field_0xf == 0xff) {
PlaySFX(0x7b);
this->field_0xf = 0x3c;
if ((gLinkEntity.frames.all & 0xf) == 0) {
this->flags = this->flags & 0x7f;
CopyPosition(this,&gLinkEntity);
if ((gLinkEntity.frames.all & 0xf0) == 0x10) {
this->spriteOffsetY = 1;
} else {
this->spriteOffsetY = 0;
}
uVar3 = sub_03005800(this, gUnk_081223C8[this->animationState].field_0x0, gUnk_081223C8[this->animationState].field_0x1);
iVar2 = sub_08007DD6(uVar3, gUnk_081223D8[this->animationState]);
if (iVar2 == 0) {
this->direction = this->direction ^ 0x10;
this->animationState = this->animationState ^ 2;
}
else {
switch(uVar3) {
case 100:
this->flags = this->flags & 0xdf;
this->damageType = 1;
this->field_0x3c = 0x47;
this->field_0x40 = 0x44;
this->flags2 = 0x80;
this->action = 6;
sub_08017744(this);
gLinkState.jumpStatus = 0x41;
gLinkState.flags.all = (gLinkState.flags.all ^ 0x1000) | 0x4000000;
gLinkEntity.field_0x20 = 0x20000;
gLinkEntity.nonPlanarMovement = 0x200;
gLinkEntity.animationState = this->animationState << 1;
gLinkEntity.direction = this->direction;
gLinkEntity.flags |= 0x80;
sub_08004168(this);
InitAnimationForceUpdate(this, this->animationState + 0xc);
PlaySFX(0x78);
PlaySFX(0x139);
return;
case 0x67:
case 0x68:
case 0x69:
case 0x6a:
case 0x6c:
case 0x6d:
case 0x6e:
case 0x6f:
if (uVar3 == sub_080002B8()) {
sub_08091C0C(this);
gLinkEntity.animationState *= 2;
return;
}
} else {
this->flags = this->flags | 0x80;
gLinkEntity.nonPlanarMovement = 0;
sub_0806F69C(this);
CopyPosition(this,&gLinkEntity);
gLinkEntity.spritePriority.b0 = this->spritePriority.b0 - 1;
if (!sub_08091DDC(this)) {
if ((gScreenTransition.frameCount & 0xf) == 0) {
PlaySFX(0x138);
}
if (--this->field_0xf == 0xff) {
PlaySFX(0x7b);
this->field_0xf = 0x3c;
}
uVar3 = sub_080002B4(this, gUnk_081223C8[this->animationState * 2], gUnk_081223C8[this->animationState * 2 + 1]);
iVar2 = sub_08007DD6(uVar3, gUnk_081223D8[this->animationState]);
if (iVar2 == 0) {
this->direction = this->direction ^ 0x10;
this->animationState = this->animationState ^ 2;
} else {
switch (uVar3) {
case 0x64:
this->flags = this->flags & 0xdf;
this->damageType = 1;
this->field_0x3c = 0x47;
this->field_0x40 = 0x44;
this->flags2 = 0x80;
this->action = 6;
sub_08017744(this);
gLinkState.jumpStatus = 0x41;
gLinkState.flags.all = (gLinkState.flags.all ^ 0x1000) | 0x4000000;
gLinkEntity.field_0x20 = 0x20000;
gLinkEntity.nonPlanarMovement = 0x200;
gLinkEntity.animationState = this->animationState << 1;
gLinkEntity.direction = this->direction;
gLinkEntity.flags |= 0x80;
sub_08004168(this);
InitAnimationForceUpdate(this, this->animationState + 0xc);
PlaySFX(0x78);
PlaySFX(0x139);
return;
case 0x67:
case 0x68:
case 0x69:
case 0x6a:
case 0x6c:
case 0x6d:
case 0x6e:
case 0x6f:
if (uVar3 == sub_080002B8(this)) {
sub_08091C0C(this);
gLinkEntity.animationState = this->animationState << 1;
return;
}
break;
}
}
gLinkEntity.animationState = this->animationState << 1;
if (this->animIndex == this->animationState) {
UpdateAnimationSingleFrame(this);
}
else {
InitAnimationForceUpdate(this, this->animationState);
}
}
gLinkEntity.animationState *= 2;
if (this->animIndex == this->animationState) {
UpdateAnimationSingleFrame(this);
}
else {
InitAnimationForceUpdate(this, this->animationState);
}
}
}
}
}
#else
NAKED
void sub_080919AC(Entity *this) {
asm(".include \"asm/non_matching/minecart/sub_080919AC.inc\"");
}
#endif