mirror of
https://github.com/zeldaret/tmc
synced 2026-06-11 13:10:35 -04:00
Merge pull request #401 from hatal175/pullablemushroom
This commit is contained in:
@@ -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
@@ -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,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user