Merge pull request #401 from hatal175/pullablemushroom

This commit is contained in:
notyourav
2022-02-22 11:34:52 -08:00
committed by GitHub
4 changed files with 155 additions and 288 deletions
@@ -1,75 +0,0 @@
.syntax unified
push {r4, lr}
adds r4, r0, #0
adds r0, #0x58
ldrb r0, [r0]
cmp r0, #0
beq _0808AD00
adds r0, r4, #0
movs r1, #0
bl InitializeAnimation
_0808AD00:
adds r0, r4, #0
adds r0, #0x41
ldrb r1, [r0]
movs r0, #0x7f
ands r0, r1
subs r0, #4
cmp r0, #0x12
bhi _0808AD92
lsls r0, r0, #2
ldr r1, _0808AD1C @ =_0808AD20
adds r0, r0, r1
ldr r0, [r0]
mov pc, r0
.align 2, 0
_0808AD1C: .4byte _0808AD20
_0808AD20: @ jump table
.4byte _0808AD6C @ case 0
.4byte _0808AD6C @ case 1
.4byte _0808AD6C @ case 2
.4byte _0808AD92 @ case 3
.4byte _0808AD6C @ case 4
.4byte _0808AD6C @ case 5
.4byte _0808AD6C @ case 6
.4byte _0808AD6C @ case 7
.4byte _0808AD6C @ case 8
.4byte _0808AD6C @ case 9
.4byte _0808AD92 @ case 10
.4byte _0808AD92 @ case 11
.4byte _0808AD6C @ case 12
.4byte _0808AD6C @ case 13
.4byte _0808AD6C @ case 14
.4byte _0808AD88 @ case 15
.4byte _0808AD6C @ case 16
.4byte _0808AD92 @ case 17
.4byte _0808AD6C @ case 18
_0808AD6C:
ldrb r1, [r4, #0x10]
movs r0, #0x7f
ands r0, r1
strb r0, [r4, #0x10]
adds r0, r4, #0
adds r0, #0x3e
ldrb r0, [r0]
bl sub_0806F5A4
strb r0, [r4, #0x14]
movs r0, #2
strb r0, [r4, #0xd]
strb r0, [r4, #0xe]
b _0808AD9E
_0808AD88:
movs r1, #0
movs r0, #3
strb r0, [r4, #0xc]
strb r1, [r4, #0xd]
b _0808AD9E
_0808AD92:
movs r0, #0
strb r0, [r4, #0xf]
strb r0, [r4, #0xe]
adds r0, r4, #0
bl sub_08078930
_0808AD9E:
pop {r4, pc}
.syntax divided
@@ -1,85 +0,0 @@
.syntax unified
push {r4, r5, r6, r7, lr}
sub sp, #0x88
adds r5, r0, #0
ldr r1, [r5, #0x50]
bl sub_0808B1F0
adds r7, r0, #0
ldrb r0, [r5, #0xa]
cmp r0, #0
beq _0808B0D6
cmp r0, #1
beq _0808B0DE
b _0808B162
_0808B0D6:
adds r0, r5, #0
bl GetNextFrame
b _0808B162
_0808B0DE:
ldr r6, _0808B148 @ =gPlayerEntity
ldrb r0, [r6, #0x14]
movs r1, #0xe
ands r1, r0
ldr r0, _0808B14C @ =gUnk_08126EE4
adds r1, r1, r0
mov r2, sp
movs r0, #0
ldrsb r0, [r1, r0]
ldrh r3, [r6, #0x2e]
adds r0, r0, r3
strh r0, [r2, #0x2e]
movs r0, #1
ldrsb r0, [r1, r0]
ldrh r1, [r6, #0x32]
adds r0, r0, r1
strh r0, [r2, #0x32]
mov r0, sp
adds r1, r5, #0
movs r2, #7
movs r3, #7
bl sub_0800419C
cmp r0, #0
beq _0808B154
ldrb r0, [r6, #0xc]
cmp r0, #1
bne _0808B162
ldr r4, _0808B150 @ =gPlayerState
adds r0, r4, #0
adds r0, #0x26
ldrb r0, [r0]
cmp r0, #0
bne _0808B162
movs r0, #0x1b
strb r0, [r4, #0xc]
adds r0, r4, #0
adds r0, #0x38
strb r7, [r0]
ldrb r0, [r5, #0x15]
movs r1, #0x10
eors r0, r1
adds r1, r4, #0
adds r1, #0x39
strb r0, [r1]
ldr r0, [r5, #0x50]
adds r1, r6, #0
bl sub_0808B1F0
adds r1, r4, #0
adds r1, #0x3a
strb r0, [r1]
b _0808B162
.align 2, 0
_0808B148: .4byte gPlayerEntity
_0808B14C: .4byte gUnk_08126EE4
_0808B150: .4byte gPlayerState
_0808B154:
movs r0, #0x40
strh r0, [r5, #0x24]
cmp r7, #0x3f
bhi _0808B162
adds r0, r5, #0
bl LinearMoveUpdate
_0808B162:
add sp, #0x88
pop {r4, r5, r6, r7, pc}
.align 2, 0
.syntax divided
@@ -1,68 +0,0 @@
.syntax unified
push {r4, r5, lr}
adds r3, r0, #0
cmp r1, #0
beq _0808B188
ldrb r0, [r3, #0x14]
movs r1, #2
eors r1, r0
lsls r1, r1, #1
ldr r0, _0808B184 @ =gUnk_081211F4
adds r2, r1, r0
adds r1, r2, #1
ldr r4, [r3, #0x50]
adds r5, r4, #0
b _0808B1CE
.align 2, 0
_0808B184: .4byte gUnk_081211F4
_0808B188:
ldrb r1, [r3, #0x14]
movs r0, #1
ands r0, r1
cmp r0, #0
beq _0808B1B8
ldr r5, _0808B1AC @ =gPlayerEntity
ldr r4, [r3, #0x50]
ldrb r1, [r3, #0x14]
lsls r2, r1, #1
ldr r0, _0808B1B0 @ =gUnk_081211FC
adds r2, r2, r0
movs r0, #2
eors r1, r0
lsls r1, r1, #1
ldr r0, _0808B1B4 @ =gUnk_081211F5
adds r1, r1, r0
b _0808B1CE
.align 2, 0
_0808B1AC: .4byte gPlayerEntity
_0808B1B0: .4byte gUnk_081211FC
_0808B1B4: .4byte gUnk_081211F4+1
_0808B1B8:
ldr r5, [r3, #0x50]
ldr r4, _0808B1E4 @ =gPlayerEntity
movs r0, #2
eors r0, r1
lsls r0, r0, #1
ldr r1, _0808B1E8 @ =gUnk_081211F4
adds r2, r0, r1
ldrb r0, [r3, #0x14]
lsls r0, r0, #1
ldr r1, _0808B1EC @ =gUnk_081211FD
adds r1, r0, r1
_0808B1CE:
movs r0, #0
ldrsb r0, [r2, r0]
ldrh r5, [r5, #0x2e]
adds r0, r0, r5
strh r0, [r3, #0x2e]
movs r0, #0
ldrsb r0, [r1, r0]
ldrh r4, [r4, #0x32]
adds r0, r0, r4
strh r0, [r3, #0x32]
pop {r4, r5, pc}
.align 2, 0
_0808B1E4: .4byte gPlayerEntity
_0808B1E8: .4byte gUnk_081211F4
_0808B1EC: .4byte gUnk_081211FC+1
.syntax divided
+155 -60
View File
@@ -23,27 +23,36 @@ typedef struct {
extern const Hitbox gUnk_080FD224;
extern const u8 gUnk_08126EE4[];
extern void (*const gUnk_081211A4[])(PullableMushroomEntity*);
extern void (*const gUnk_081211B4[])(PullableMushroomEntity*);
extern void (*const gUnk_081211C0[])(PullableMushroomEntity*);
extern const u16 gUnk_081211CC[];
extern void (*const gUnk_081211DC[])(PullableMushroomEntity*);
extern const u16 gUnk_081211E4[];
extern void (*const gUnk_081211EC[])(PullableMushroomEntity*);
extern const u8 gUnk_081211F4[];
extern const u8 gUnk_081211FC[];
void sub_0808AB68(PullableMushroomEntity*);
void PullableMushroom_Init(PullableMushroomEntity*);
void PullableMushroom_Action1(PullableMushroomEntity*);
void PullableMushroom_Action2(PullableMushroomEntity*);
void PullableMushroom_Action3(PullableMushroomEntity*);
void PullableMushroom_Action1_Type0(PullableMushroomEntity*);
void PullableMushroom_Action1_Type1(PullableMushroomEntity*);
void sub_0808ABC4(PullableMushroomEntity*);
void sub_0808ACEC(PullableMushroomEntity*);
void sub_0808ADA0(PullableMushroomEntity*);
void sub_0808ADF0(PullableMushroomEntity*);
void sub_0808AEB0(PullableMushroomEntity*);
void sub_0808AFD4(PullableMushroomEntity*);
void sub_0808B05C(PullableMushroomEntity*);
void sub_0808B0BC(PullableMushroomEntity*);
void sub_0808B168(PullableMushroomEntity*, u32);
u32 sub_0808B1F0(PullableMushroomEntity*, Entity*);
bool32 sub_0808B21C(PullableMushroomEntity*, u32);
void PullableMushroom(PullableMushroomEntity* this) {
gUnk_081211A4[super->action](this);
static void (*const PullableMushroom_Actions[])(PullableMushroomEntity*) = {
PullableMushroom_Init,
PullableMushroom_Action1,
PullableMushroom_Action2,
PullableMushroom_Action3,
};
PullableMushroom_Actions[super->action](this);
super->bitfield = 0;
}
void sub_0808AA1C(PullableMushroomEntity* this) {
void PullableMushroom_Init(PullableMushroomEntity* this) {
super->action = 1;
if (AreaIsDungeon() == 0) {
ChangeObjPalette(super, 0);
@@ -88,18 +97,28 @@ void sub_0808AA1C(PullableMushroomEntity* this) {
}
break;
}
sub_0808AB68(this);
PullableMushroom_Action1(this);
}
void sub_0808AB68(PullableMushroomEntity* this) {
gUnk_081211B4[super->type](this);
void PullableMushroom_Action1(PullableMushroomEntity* this) {
static void (*const funcs[])(PullableMushroomEntity*) = {
PullableMushroom_Action1_Type0,
PullableMushroom_Action1_Type1,
sub_0808ABC4,
};
funcs[super->type](this);
}
void sub_0808AB80(PullableMushroomEntity* this) {
gUnk_081211C0[super->subAction](this);
void PullableMushroom_Action1_Type0(PullableMushroomEntity* this) {
static void (*const funcs[])(PullableMushroomEntity*) = {
sub_0808ACEC,
sub_0808ADA0,
sub_0808ADF0,
};
funcs[super->subAction](this);
}
void sub_0808AB98(PullableMushroomEntity* this) {
void PullableMushroom_Action1_Type1(PullableMushroomEntity* this) {
if (*(u16*)&super->parent->action == 0x201) {
super->parent->child = NULL;
DeleteThisEntity();
@@ -108,9 +127,45 @@ void sub_0808AB98(PullableMushroomEntity* this) {
}
}
const u16 gUnk_081211CC[] = { 32768, 64000, 0, 64517, 0, 0, 32768, 64763 };
ASM_FUNC("asm/non_matching/pullableMushroom/sub_0808ABC4.inc", void sub_0808ABC4(PullableMushroomEntity* this))
ASM_FUNC("asm/non_matching/pullableMushroom/sub_0808ACEC.inc", void sub_0808ACEC(PullableMushroomEntity* this))
void sub_0808ACEC(PullableMushroomEntity* this) {
if (super->animIndex != 0) {
InitializeAnimation(super, 0);
}
switch (super->bitfield & 0x7f) {
case 0x4:
case 0x5:
case 0x6:
case 0x8:
case 0x9:
case 0xa:
case 0xb:
case 0xc:
case 0xd:
case 0x10:
case 0x11:
case 0x12:
case 0x14:
case 0x16:
COLLISION_OFF(super);
super->animationState = sub_0806F5A4(super->knockbackDirection);
super->subAction = 2;
super->actionDelay = 2;
break;
case 0x13:
super->action = 3;
super->subAction = 0;
break;
default:
super->field_0xf = 0;
super->actionDelay = 0;
sub_08078930(super);
break;
}
}
void sub_0808ADA0(PullableMushroomEntity* this) {
if ((sub_0808B1F0(this, super->child) < 8) || (super->child == NULL)) {
@@ -151,14 +206,19 @@ void sub_0808ADF0(PullableMushroomEntity* this) {
}
}
void sub_0808AE84(PullableMushroomEntity* this) {
void PullableMushroom_Action2(PullableMushroomEntity* this) {
static void (*const funcs[])(PullableMushroomEntity*) = {
sub_0808AEB0,
sub_0808AFD4,
};
if (gPlayerState.heldObject == 0) {
super->subAction = 6;
}
gUnk_081211DC[super->subAction - 5](this);
funcs[super->subAction - 5](this);
}
void sub_0808AEB0(PullableMushroomEntity* this) {
static const u16 gUnk_081211E4[] = { 1024, 256, 2048, 512 };
u32 uVar1;
if (super->actionDelay != 0) {
uVar1 = sub_0808B1F0(this, super->child);
@@ -208,8 +268,13 @@ void sub_0808AFD4(PullableMushroomEntity* this) {
SoundReq(SFX_130);
}
void sub_0808AFF0(PullableMushroomEntity* this) {
gUnk_081211EC[super->subAction](this);
void PullableMushroom_Action3(PullableMushroomEntity* this) {
static void (*const funcs[])(PullableMushroomEntity*) = {
sub_0808B05C,
sub_0808B0BC,
};
funcs[super->subAction](this);
if ((((gPlayerState.field_0x1c & 0xf) != 1) || ((super->bitfield & 0x7f) != 0x13)) && (super->type == 1)) {
(super->parent)->action = 1;
(super->parent)->subAction = 1;
@@ -235,10 +300,73 @@ void sub_0808B05C(PullableMushroomEntity* this) {
super->subAction++;
}
ASM_FUNC("asm/non_matching/pullableMushroom/sub_0808B0BC.inc", void sub_0808B0BC(PullableMushroomEntity* this))
void sub_0808B0BC(PullableMushroomEntity* this) {
u32 uVar2;
const s8* ptr;
GenericEntity ent;
ASM_FUNC("asm/non_matching/pullableMushroom/sub_0808B168.inc",
void sub_0808B168(PullableMushroomEntity* this, u32 param_2))
uVar2 = sub_0808B1F0(this, super->parent);
switch (super->type) {
case 0:
GetNextFrame(super);
break;
case 1:
ptr = &gUnk_08126EE4[gPlayerEntity.animationState & 0xe];
ent.base.x.HALF.HI = ptr[0] + gPlayerEntity.x.HALF.HI;
ent.base.y.HALF.HI = ptr[1] + gPlayerEntity.y.HALF.HI;
if (sub_0800419C(&ent.base, super, 7, 7)) {
if ((gPlayerEntity.action != 1) || (gPlayerState.swim_state != 0))
return;
gPlayerState.queued_action = 0x1b;
gPlayerState.field_0x38 = uVar2;
gPlayerState.field_0x39 = super->direction ^ 0x10;
gPlayerState.field_0x3a = sub_0808B1F0((PullableMushroomEntity*)super->parent, &gPlayerEntity);
} else {
super->speed = 0x40;
if (uVar2 < 0x40) {
LinearMoveUpdate(super);
}
}
break;
}
}
void sub_0808B168(PullableMushroomEntity* this, u32 param_2) {
static const s8 gUnk_081211F4[] = {
0, 8, -8, -4, 0, -8, 8, -4,
};
static const s8 gUnk_081211FC[] = {
0, 3, -8, -4, 0, -12, 8, -4,
};
s32 iVar2;
const s8* pcVar3;
u32 uVar4;
const s8* pcVar5;
Entity* pEVar5;
Entity* pEVar6;
if (param_2 != 0) {
iVar2 = (super->animationState ^ 2) * 2;
pcVar5 = (gUnk_081211F4 + iVar2);
pcVar3 = pcVar5 + 1;
pEVar5 = super->parent;
pEVar6 = pEVar5;
} else {
if ((super->animationState & 1) != 0) {
pEVar6 = &gPlayerEntity;
pEVar5 = super->parent;
pcVar5 = (gUnk_081211FC + super->animationState * 2);
pcVar3 = (gUnk_081211F4 + 1 + (super->animationState ^ 2) * 2);
} else {
pEVar6 = super->parent;
pEVar5 = &gPlayerEntity;
pcVar5 = (gUnk_081211F4 + (super->animationState ^ 2) * 2);
pcVar3 = (gUnk_081211FC + 1 + super->animationState * 2);
}
}
super->x.HALF.HI = *pcVar5 + pEVar6->x.HALF.HI;
super->y.HALF.HI = *pcVar3 + pEVar5->y.HALF.HI;
}
u32 sub_0808B1F0(PullableMushroomEntity* this, Entity* other) {
s32 sVar1;
@@ -281,36 +409,3 @@ bool32 sub_0808B21C(PullableMushroomEntity* this, u32 param_2) {
}
return FALSE;
}
void (*const gUnk_081211A4[])(PullableMushroomEntity*) = {
sub_0808AA1C,
sub_0808AB68,
sub_0808AE84,
sub_0808AFF0,
};
void (*const gUnk_081211B4[])(PullableMushroomEntity*) = {
sub_0808AB80,
sub_0808AB98,
sub_0808ABC4,
};
void (*const gUnk_081211C0[])(PullableMushroomEntity*) = {
sub_0808ACEC,
sub_0808ADA0,
sub_0808ADF0,
};
const u16 gUnk_081211CC[] = { 32768, 64000, 0, 64517, 0, 0, 32768, 64763 };
void (*const gUnk_081211DC[])(PullableMushroomEntity*) = {
sub_0808AEB0,
sub_0808AFD4,
};
const u16 gUnk_081211E4[] = { 1024, 256, 2048, 512 };
void (*const gUnk_081211EC[])(PullableMushroomEntity*) = {
sub_0808B05C,
sub_0808B0BC,
};
const u8 gUnk_081211F4[] = {
0, 8, 248, 252, 0, 248, 8, 252,
};
const u8 gUnk_081211FC[] = {
0, 3, 248, 252, 0, 244, 8, 252,
};