sa1: match sub_802486C more player.c alignment

This commit is contained in:
Oliver Bell committed 2026-04-19 14:41:49 +01:00
1 parent 3f2aec0dd2
commit 86d6835d63
3 files changed
+294 -506

No files matched your search

@@ -1,402 +0,0 @@
.include "constants/constants.inc"
.syntax unified
.text
push {r4, r5, r6, r7, lr}
mov r7, sb
mov r6, r8
push {r6, r7}
adds r4, r0, #0 @ r4 = p
adds r6, r1, #0 @ r6 = p2
adds r5, r6, #0
adds r5, #0xc @ r5 = s
ldr r0, [r4, #0x10]
movs r1, #0x20
ands r0, r1
cmp r0, #0 @ p->moveState & MOVESTATE_20
beq _08046034
adds r1, r4, #0
adds r1, #0x3e
movs r0, #0
strb r0, [r1]
adds r1, #1
strb r0, [r1]
adds r1, #1
movs r0, #0xe
strb r0, [r1]
_08046034:
ldr r7, _080460C4 @ =sCharStateAnimInfo
adds r1, r4, #0
adds r1, #0x40
movs r0, #0
ldrsb r0, [r1, r0]
lsls r0, r0, #2
adds r0, r0, r7
ldrh r3, [r0]
adds r0, r4, #0
adds r0, #0x42
strh r3, [r0]
movs r2, #0
ldrsb r2, [r1, r2]
mov sb, r1
mov r8, r0
cmp r2, #0x2a
bgt _0804606C
ldr r0, _080460C8 @ =gPlayerCharacterIdleAnims
adds r1, #0x19
ldrb r1, [r1]
lsls r1, r1, #0x18
asrs r1, r1, #0x18
lsls r1, r1, #1
adds r1, r1, r0
ldrh r0, [r1]
adds r0, r3, r0
mov r1, r8
strh r0, [r1]
_0804606C:
mov r2, sb
movs r0, #0
ldrsb r0, [r2, r0]
lsls r0, r0, #2
adds r1, r7, #2
adds r0, r0, r1
ldrh r0, [r0]
adds r2, r4, #0
adds r2, #0x44
strh r0, [r2]
adds r1, r6, #0
adds r1, #0x2e
movs r0, #0x10
strb r0, [r1]
movs r3, #0xc
ldrsh r0, [r4, r3]
adds r6, r2, #0
cmp r0, #0
bne _0804609C
ldrh r1, [r4, #0x38]
movs r0, #0xf3
ands r0, r1
cmp r0, #0
beq _080460A6
_0804609C:
adds r1, r4, #0
adds r1, #0x46
movs r0, #0xb4
lsls r0, r0, #1
strh r0, [r1]
_080460A6:
mov r7, sb
movs r0, #0
ldrsb r0, [r7, r0]
cmp r0, #0x10
bne _080460B2
b _08046204_case_16
_080460B2:
cmp r0, #0x10
bgt _080460D2
cmp r0, #4
beq _0804611C_case_4
cmp r0, #4
bgt _080460CC
cmp r0, #0
beq _080460E6_case_0
b _08046236_post_switch
.align 2, 0
_080460C4: .4byte sCharStateAnimInfo
_080460C8: .4byte gPlayerCharacterIdleAnims
_080460CC:
cmp r0, #9
beq _08046198_case_9
b _08046236_post_switch
_080460D2:
cmp r0, #0x1a
bgt _080460E0
cmp r0, #0x18
bge _0804615C
cmp r0, #0x15
beq _08046180_cases_21_85
b _08046236_post_switch
_080460E0:
cmp r0, #0x55
beq _08046180_cases_21_85
b _08046236_post_switch
_080460E6_case_0:
adds r1, r4, #0
adds r1, #0x46
ldrh r0, [r1]
movs r3, #0
ldrsh r2, [r1, r3]
cmp r2, #0
beq _080460FA
subs r0, #1
strh r0, [r1]
b _08046236_post_switch
_080460FA:
ldr r0, _08046118 @ =gPlayerCharacterIdleAnims
adds r1, r4, #0
adds r1, #0x59
ldrb r1, [r1]
lsls r1, r1, #0x18
asrs r1, r1, #0x18
lsls r1, r1, #1
adds r1, r1, r0
ldrh r0, [r1]
adds r0, #1
mov r7, r8
strh r0, [r7]
strh r2, [r6]
b _08046236_post_switch
.align 2, 0
_08046118: .4byte gPlayerCharacterIdleAnims
_0804611C_case_4:
movs r1, #0xc
ldrsh r0, [r4, r1]
adds r1, r0, #0
cmp r0, #0
bge _08046128
rsbs r1, r0, #0
_08046128:
ldr r0, _08046154 @ =0x0000047F
cmp r1, r0
ble _0804615C
ldr r1, _08046158 @ =gPlayerCharacterIdleAnims
adds r0, r4, #0
adds r0, #0x59
ldrb r0, [r0]
lsls r0, r0, #0x18
asrs r0, r0, #0x18
lsls r0, r0, #1
adds r0, r0, r1
ldrh r0, [r0]
adds r0, #5
movs r1, #0
mov r2, r8
strh r0, [r2]
strh r1, [r6]
adds r1, r5, #0
adds r1, #0x22
movs r0, #0x10
strb r0, [r1]
b _08046236_post_switch
.align 2, 0
_08046154: .4byte 0x0000047F
_08046158: .4byte gPlayerCharacterIdleAnims
_0804615C:
movs r3, #0xc
ldrsh r0, [r4, r3]
adds r1, r0, #0
cmp r0, #0
bge _08046168
rsbs r1, r0, #0
_08046168:
asrs r0, r1, #4
cmp r0, #7
ble _08046176
cmp r0, #0x10
ble _08046178
movs r0, #0x10
b _08046178
_08046176:
movs r0, #8
_08046178:
adds r1, r5, #0
adds r1, #0x22
strb r0, [r1]
b _08046236_post_switch
_08046180_cases_21_85:
movs r7, #0xa
ldrsh r1, [r4, r7]
ldr r0, _08046194 @ =0xFFFFFE80
cmp r1, r0
blt _08046236_post_switch
movs r0, #0x12
mov r1, sb
strb r0, [r1]
b _08046236_post_switch
.align 2, 0
_08046194: .4byte 0xFFFFFE80
_08046198_case_9:
movs r2, #0xc
ldrsh r1, [r4, r2]
cmp r1, #0
bge _080461A2
rsbs r1, r1, #0
_080461A2:
ldr r0, _080461F4 @ =0x0000017F
cmp r1, r0
bgt _080461C4
ldr r1, _080461F8 @ =gPlayerCharacterIdleAnims
adds r0, r4, #0
adds r0, #0x59
ldrb r0, [r0]
lsls r0, r0, #0x18
asrs r0, r0, #0x18
lsls r0, r0, #1
adds r0, r0, r1
ldrh r0, [r0]
adds r0, #7
movs r1, #0
mov r3, r8
strh r0, [r3]
strh r1, [r6]
_080461C4:
ldr r0, _080461FC @ =gStageTime
ldr r0, [r0]
movs r1, #3
ands r0, r1
cmp r0, #0
bne _08046236_post_switch
movs r2, #0xf
ldrsb r2, [r4, r2]
ldr r0, _08046200 @ =gStageFlags
ldrh r1, [r0]
movs r0, #0x80
ands r0, r1
cmp r0, #0
beq _080461E2
rsbs r2, r2, #0
_080461E2:
ldr r0, [r4]
asrs r0, r0, #8
ldr r1, [r4, #4]
asrs r1, r1, #8
adds r1, r1, r2
bl CreateBrakingDustEffect
b _08046236_post_switch
.align 2, 0
_080461F4: .4byte 0x0000017F
_080461F8: .4byte gPlayerCharacterIdleAnims
_080461FC: .4byte gStageTime
_08046200: .4byte gStageFlags
_08046204_case_16:
ldrb r0, [r4, #0x14]
adds r0, #0x20
movs r1, #0xc0
ands r0, r1
cmp r0, #0
beq _08046236_post_switch
ldr r1, _08046260 @ =gPlayerCharacterIdleAnims
adds r0, r4, #0
adds r0, #0x59
ldrb r0, [r0]
lsls r0, r0, #0x18
asrs r0, r0, #0x18
lsls r0, r0, #1
adds r0, r0, r1
ldrh r0, [r0]
adds r0, #0x2c
mov r7, r8
strh r0, [r7]
movs r0, #1
strh r0, [r6]
ldr r0, [r4, #0x10]
movs r1, #2
rsbs r1, r1, #0
ands r0, r1
str r0, [r4, #0x10]
_08046236_post_switch:
ldr r2, [r4, #0x10]
movs r0, #0x40
ands r0, r2
cmp r0, #0
beq _0804624C
adds r3, r5, #0
adds r3, #0x22
ldrb r0, [r3]
lsrs r1, r0, #1
subs r0, r0, r1
strb r0, [r3]
_0804624C:
movs r0, #1
ands r2, r0
cmp r2, #0
bne _08046264
ldr r0, [r5, #0x10]
movs r1, #0x80
lsls r1, r1, #3
orrs r0, r1
b _0804626A
.align 2, 0
_08046260: .4byte gPlayerCharacterIdleAnims
_08046264:
ldr r0, [r5, #0x10]
ldr r1, _08046284 @ =0xFFFFFBFF
ands r0, r1
_0804626A:
str r0, [r5, #0x10]
ldr r0, _08046288 @ =gStageFlags
ldrh r1, [r0]
movs r0, #0x80
ands r0, r1
cmp r0, #0
beq _0804628C
ldr r0, [r5, #0x10]
movs r1, #0x80
lsls r1, r1, #4
orrs r0, r1
b _08046292
.align 2, 0
_08046284: .4byte 0xFFFFFBFF
_08046288: .4byte gStageFlags
_0804628C:
ldr r0, [r5, #0x10]
ldr r1, _080462F4 @ =0xFFFFF7FF
ands r0, r1
_08046292:
str r0, [r5, #0x10]
ldr r3, _080462F8 @ =gGameMode
ldrb r0, [r3]
cmp r0, #1
bls _080462A4
adds r1, r4, #0
adds r1, #0x6c
movs r0, #0
strb r0, [r1]
_080462A4:
mov r0, r8
ldrh r2, [r0]
ldrh r0, [r5, #0xa]
adds r1, r5, #0
adds r1, #0x20
cmp r0, r2
bne _080462BA
ldrb r0, [r1]
ldrh r7, [r6]
cmp r0, r7
beq _080462DE
_080462BA:
strh r2, [r5, #0xa]
ldrh r0, [r6]
strb r0, [r1]
adds r1, r5, #0
adds r1, #0x21
movs r0, #0xff
strb r0, [r1]
movs r0, #1
rsbs r0, r0, #0
str r0, [r5, #0x28]
str r0, [r5, #0x30]
ldrb r0, [r3]
cmp r0, #1
bls _080462DE
adds r1, r4, #0
adds r1, #0x6c
movs r0, #1
strb r0, [r1]
_080462DE:
mov r0, sb
ldrb r1, [r0]
adds r0, r4, #0
adds r0, #0x41
strb r1, [r0]
pop {r3, r4}
mov r8, r3
mov sb, r4
pop {r4, r5, r6, r7}
pop {r0}
bx r0
.align 2, 0
_080462F4: .4byte 0xFFFFF7FF
_080462F8: .4byte gGameMode
.syntax divided
+124 -21
View File
@@ -5583,21 +5583,20 @@ void CallPlayerTransition(Player *p)
}
#endif
// ALIGNED UP TO HERE
// Confusion state related
void Player_HandleInputs(Player *p)
{
u8 r0;
u8 r1;
u8 r2;
u16 r6;
u8 r0, r1, r2;
u16 input;
if (IS_MULTI_PLAYER && (SIO_MULTI_CNT->id != gCamera.spectatorTarget)) {
p->heldInput = 0;
r6 = 0;
input = 0;
#if (GAME == GAME_SA1)
sub_804D13C(0);
#endif
} else {
r6 = p->heldInput;
input = p->heldInput;
if (!(p->moveState & MOVESTATE_IGNORE_INPUT)) {
p->heldInput = gInput;
@@ -5614,22 +5613,26 @@ void Player_HandleInputs(Player *p)
r0 = ((r2 >> 4) | r2);
r2 = r0 << 4;
p->heldInput = (p->heldInput & 0xFF0F) | r2;
p->heldInput = (p->heldInput & ~DPAD_ANY) | r2;
if (--p->timerConfusion == 0) {
p->itemEffect &= ~PLAYER_ITEM_EFFECT__CONFUSION;
}
}
#if (GAME == GAME_SA1)
sub_804D13C(p->heldInput);
} else {
#endif
}
#if (GAME == GAME_SA1)
else {
sub_804D13C(0);
}
#endif
}
r6 ^= p->heldInput;
r6 &= p->heldInput;
p->frameInput = r6;
input ^= p->heldInput;
input &= p->heldInput;
p->frameInput = input;
#if (GAME == GAME_SA1)
if (p->heldInput & DPAD_SIDEWAYS) {
p->heldInput &= ~DPAD_VERTICAL;
}
@@ -5637,8 +5640,10 @@ void Player_HandleInputs(Player *p)
if (p->frameInput & DPAD_SIDEWAYS) {
p->frameInput &= ~DPAD_VERTICAL;
}
#endif
}
#if (GAME == GAME_SA1)
// TODO: Remove gotos
void sub_8045DF0(Player *p)
{
@@ -5750,10 +5755,107 @@ void sub_8045DF0(Player *p)
p->heldInput = r4;
p->frameInput = r5;
}
#endif
// This function is in SA2, but looks very different in many aspects
// (99.16%) https://decomp.me/scratch/7kBSw
NONMATCH("asm/non_matching/game/sa1/stage/Player__sa2__sub_802486C.inc", void SA2_LABEL(sub_802486C)(Player *p, PlayerSpriteInfo *psi))
#if (GAME == GAME_SA2)
void sub_80246DC(Player *p)
{
Sprite *s = &p->spriteInfoBody->s;
u16 charState = p->charState;
#ifndef COLLECT_RINGS_ROM
u32 anim = p->anim;
#else
u16 anim = p->anim;
#endif
u32 variant = p->variant;
u32 sl = variant;
#ifndef COLLECT_RINGS_ROM
AnimId baseAnim = gPlayerCharacterIdleAnims[p->character];
#else
AnimId baseAnim = gPlayerCharacterIdleAnims[0];
#endif
anim = (u16)(anim - baseAnim);
if ((charState == CHARSTATE_JUMP_1) || (charState == CHARSTATE_JUMP_2)) {
if (p->variant == 0 && (s->frameFlags & SPRITE_FLAG_MASK_ANIM_OVER) && (((u16)anim - 10) == 0 || ((u16)anim - 10) == 1)) {
p->variant = 1;
p->moveState |= MOVESTATE_SPIN_ATTACK;
PLAYERFN_CHANGE_SHIFT_OFFSETS(p, 6, 9);
} else {
if ((p->qSpeedAirY > 0) && (p->variant == 1) && ((((u16)anim - 10) == 0) || (((u16)anim - 10) == 1))) {
s32 newY = sub_801E6D4(I(p->qWorldY) + p->spriteOffsetY, I(p->qWorldX), p->layer, 8, NULL, SA2_LABEL(sub_801EE64));
if (gGameMode != GAME_MODE_MULTI_PLAYER_COLLECT_RINGS) {
if (newY <= 32) {
p->variant = 2;
}
}
}
}
} else {
if (charState == CHARSTATE_SPRING_B) {
if (anim == SA2_CHAR_ANIM_52) {
if (variant == 0) {
if (p->qSpeedAirY > 0) {
p->variant = 1;
}
} else if (p->variant == 1) {
if (s->frameFlags & SPRITE_FLAG_MASK_ANIM_OVER) {
p->variant = 2;
}
}
}
}
else if (charState == CHARSTATE_SPRING_C) {
if (anim == SA2_CHAR_ANIM_53) {
if (sl == 0) {
if (s->frameFlags & SPRITE_FLAG_MASK_ANIM_OVER) {
#ifndef COLLECT_RINGS_ROM
p->anim = (gPlayerCharacterIdleAnims[p->character] + SA2_CHAR_ANIM_52);
#else
p->anim = (gPlayerCharacterIdleAnims[0] + SA2_CHAR_ANIM_52);
#endif
p->variant = 2;
}
}
}
}
#ifndef COLLECT_RINGS_ROM
else if (charState == CHARSTATE_SPRING_MUSIC_PLANT) {
if (anim == SA2_CHAR_ANIM_SPRING_MUSIC_PLANT) {
if (variant == 0) {
if (p->qSpeedAirY > 0) {
p->variant = 1;
}
} else if (variant == 1) {
if (s->frameFlags & SPRITE_FLAG_MASK_ANIM_OVER) {
p->variant = 2;
}
}
}
} else if (charState == CHARSTATE_NOTE_BLOCK) {
if (anim == SA2_CHAR_ANIM_NOTE_BLOCK) {
if (variant == 0) {
if (p->qSpeedAirY > 0) {
p->variant = 1;
}
} else if (sl == 1) {
if (s->frameFlags & SPRITE_FLAG_MASK_ANIM_OVER) {
p->variant = 2;
}
}
}
}
#endif
}
}
#endif
// ALIGNED UP TO HERE
void SA2_LABEL(sub_802486C)(Player *p, PlayerSpriteInfo *psi)
{
s32 speed;
Sprite *s = &psi->s;
@@ -5789,7 +5891,8 @@ NONMATCH("asm/non_matching/game/sa1/stage/Player__sa2__sub_802486C.inc", void SA
} break;
case 4: {
if (ABS(p->qSpeedGround) >= Q(4.5)) {
speed = p->qSpeedGround;
if (ABS(speed) >= Q(4.5)) {
p->anim = gPlayerCharacterIdleAnims[p->character] + 5;
p->variant = 0;
s->animSpeed = SPRITE_ANIM_SPEED(1.0);
@@ -5800,8 +5903,9 @@ NONMATCH("asm/non_matching/game/sa1/stage/Player__sa2__sub_802486C.inc", void SA
case 24:
case 25:
case 26: {
s32 v = ABS(p->qSpeedGround) >> 4;
s->animSpeed = CLAMP_32(v, SPRITE_ANIM_SPEED(0.5), SPRITE_ANIM_SPEED(1.0));
speed = p->qSpeedGround;
speed = ABS(speed) >> 4;
s->animSpeed = CLAMP_32(speed, SPRITE_ANIM_SPEED(0.5), SPRITE_ANIM_SPEED(1.0));
} break;
case 21:
@@ -5881,7 +5985,6 @@ NONMATCH("asm/non_matching/game/sa1/stage/Player__sa2__sub_802486C.inc", void SA
p->prevCharState = p->charState;
}
END_NONMATCH
void SA2_LABEL(sub_8024B10)(Player *p, PlayerSpriteInfo *inPsi)
{
+170 -83
View File
@@ -208,24 +208,6 @@
#else
#define PLAYERFN_UPDATE_AIR_FALL_SPEED(player) player->qSpeedAirY += Q(PLAYER_GRAVITY);
#endif
#define PLAYERFN_SET_ANIM_SPEED(_p, _s) \
{ \
s32 speed = _p->qSpeedGround; \
speed = (speed >> 5) + (speed >> 6); \
\
/* TODO: Try ABS macro */ \
speed = ABS(speed); \
\
if (speed >= SPRITE_ANIM_SPEED(0.5)) { \
if (speed > SPRITE_ANIM_SPEED(8.0)) { \
speed = SPRITE_ANIM_SPEED(8.0); \
} \
} else { \
speed = SPRITE_ANIM_SPEED(0.5); \
} \
_s->animSpeed = speed; \
}
#endif
#ifndef COLLECT_RINGS_ROM
@@ -5583,16 +5565,18 @@ void CallPlayerTransition(Player *p)
}
#endif
// ALIGNED UP TO HERE
// Confusion state related
void Player_HandleInputs(Player *p)
{
u32 input;
u16 input2;
u8 r0, r1, r2;
u16 input;
if (IS_MULTI_PLAYER && (SIO_MULTI_CNT->id != gCamera.spectatorTarget)) {
p->heldInput = 0;
input = 0;
#if (GAME == GAME_SA1)
sub_804D13C(0);
#endif
} else {
input = p->heldInput;
@@ -5600,37 +5584,162 @@ void Player_HandleInputs(Player *p)
p->heldInput = gInput;
if (IS_MULTI_PLAYER && (p->itemEffect & PLAYER_ITEM_EFFECT__CONFUSION)) {
u8 dpad = (p->heldInput & DPAD_ANY) >> 4;
u32 r1 = gStageTime;
r2 = ((p->heldInput & DPAD_ANY) >> 4);
r1 = ((gStageTime + p->timerConfusion) & 0x3);
r1 = ((p->timerConfusion + r1) & 0x3);
if (!r1) {
if (r1 == 0) {
r1 = 1;
}
dpad <<= r1;
dpad = (dpad >> 4) | dpad;
dpad = (u8)(dpad << 4);
p->heldInput = (p->heldInput & ~DPAD_ANY) | dpad;
r2 <<= r1;
r0 = ((r2 >> 4) | r2);
r2 = r0 << 4;
p->heldInput = (p->heldInput & ~DPAD_ANY) | r2;
if (--p->timerConfusion == 0) {
p->itemEffect &= ~PLAYER_ITEM_EFFECT__CONFUSION;
}
}
#if (GAME == GAME_SA1)
sub_804D13C(p->heldInput);
#endif
}
#if (GAME == GAME_SA1)
else {
sub_804D13C(0);
}
#endif
}
input2 = p->heldInput;
input ^= input2;
#ifdef NON_MATCHING
input &= input2;
#else
asm("and %0, %2" : "=r"(input) : "r"(input), "r"(input2));
#endif
input ^= p->heldInput;
input &= p->heldInput;
p->frameInput = input;
#if (GAME == GAME_SA1)
if (p->heldInput & DPAD_SIDEWAYS) {
p->heldInput &= ~DPAD_VERTICAL;
}
if (p->frameInput & DPAD_SIDEWAYS) {
p->frameInput &= ~DPAD_VERTICAL;
}
#endif
}
#if (GAME == GAME_SA1)
// TODO: Remove gotos
void sub_8045DF0(Player *p)
{
u16 r4 = p->heldInput;
u16 r6 = r4;
u32 r5;
if (!(p->moveState & MOVESTATE_IGNORE_INPUT)) {
r4 = gUnknown_030060F0[20];
if (((p->rotation + Q(0.125)) & 0xC0) == 0) {
if ((p->qWorldX + Q(16)) < gPlayer.qWorldX) {
if (!(r4 & DPAD_DOWN)) {
r4 |= DPAD_RIGHT;
r4 &= ~DPAD_LEFT;
}
} else if ((p->qWorldX - Q(16)) > gPlayer.qWorldX) {
// _08045E48 + 0x8
if (!(r4 & DPAD_DOWN)) {
r4 |= DPAD_LEFT;
r4 &= ~DPAD_RIGHT;
}
} else {
r4 &= ~(DPAD_LEFT | DPAD_RIGHT);
}
// _08045E74
if (!(r4 & DPAD_SIDEWAYS) && (p->qSpeedGround == Q(0)) && !(p->moveState & MOVESTATE_IN_AIR) && (p->SA2_LABEL(unk62) == 0)
&& ((p->charState == 4) || (p->charState == 0))
&& !(p->moveState & (MOVESTATE_800000 | MOVESTATE_8000 | MOVESTATE_SPINDASH | MOVESTATE_200 | MOVESTATE_STOOD_ON_OBJ))) {
if (gPlayer.moveState & MOVESTATE_FACING_LEFT) {
if (!(p->moveState & MOVESTATE_FACING_LEFT)) {
p->moveState |= MOVESTATE_FACING_LEFT;
p->charState = CHARSTATE_8;
}
} else {
if (p->moveState & MOVESTATE_FACING_LEFT) {
p->moveState &= ~MOVESTATE_FACING_LEFT;
p->charState = CHARSTATE_8;
}
}
}
}
}
// _08045EEE
r5 = r4;
r5 &= ~r6;
if (!(p->moveState & MOVESTATE_IGNORE_INPUT)) {
switch (p->moveState & MOVESTATE_IN_AIR) {
case 0: {
if (!GRAVITY_IS_INVERTED) {
if (p->qWorldY - Q(80) > gPlayer.qWorldY) {
goto _08045FC6;
}
} else {
// _08045F38
if (p->qWorldY + Q(80) < gPlayer.qWorldY) {
r5 |= gPlayerControls.jump;
}
}
} break;
case MOVESTATE_IN_AIR: {
if (!GRAVITY_IS_INVERTED) {
if (p->qWorldY > gPlayer.qWorldY - Q(16)) {
goto _08045F90;
}
} else {
// _08045F7C
if (p->qWorldY < gPlayer.qWorldY + Q(16)) {
_08045F90:
if ((p->SA2_LABEL(unk61) != 0) || (p->qSpeedAirY > Q(0))) {
// _08045FA8
if (!GRAVITY_IS_INVERTED) {
if (p->qWorldY > gPlayer.qWorldY) {
goto _08045FC6;
}
} else {
// _08045FC0
if (p->qWorldY < gPlayer.qWorldY) {
_08045FC6:
r5 |= gPlayerControls.jump;
}
}
} else {
r4 |= gPlayerControls.jump;
}
}
}
} break;
}
}
// _08045FDA
if (r4 & DPAD_SIDEWAYS) {
r4 &= ~DPAD_VERTICAL;
}
// _08045FE8
if (r5 & DPAD_SIDEWAYS) {
u16 mask = ~DPAD_VERTICAL;
r5 &= mask;
}
// _08045FF4
p->heldInput = r4;
p->frameInput = r5;
}
#endif
#if (GAME == GAME_SA2)
void sub_80246DC(Player *p)
{
Sprite *s = &p->spriteInfoBody->s;
@@ -5725,13 +5834,12 @@ void sub_80246DC(Player *p)
#endif
}
}
#endif
// ALIGNED UP TO HERE
void SA2_LABEL(sub_802486C)(Player *p, PlayerSpriteInfo *p2)
{
#ifndef NON_MATCHING
s32 speed;
register s32 r0 asm("r0");
#endif
Sprite *s = &p2->s;
if ((p->charState != CHARSTATE_INVALID) && (p->charState != p->prevCharState)) {
@@ -5747,12 +5855,8 @@ void SA2_LABEL(sub_802486C)(Player *p, PlayerSpriteInfo *p2)
p->variant = sCharStateAnimInfo[p->charState][1];
p2->s.animSpeed = SPRITE_ANIM_SPEED(1.0);
}
#if !defined(NON_MATCHING) && !defined(COLLECT_RINGS_ROM)
switch (((u16)(p->charState - 9) << 16) >> 16) {
#else
switch (p->charState - 9) {
#endif
case CHARSTATE_WALK_A - 9: {
switch (p->charState) {
case CHARSTATE_WALK_A: {
#ifndef COLLECT_RINGS_ROM
p->anim = gPlayerCharacterIdleAnims[p->character] + SA2_CHAR_ANIM_WALK;
#else
@@ -5761,58 +5865,41 @@ void SA2_LABEL(sub_802486C)(Player *p, PlayerSpriteInfo *p2)
p->variant = p->walkAnim;
} // FALLTHROUGH!!!
#ifndef COLLECT_RINGS_ROM
case CHARSTATE_WALLRUN_INIT - 9:
case CHARSTATE_WALLRUN_TO_WALL - 9:
case CHARSTATE_WALLRUN_ON_WALL
- 9:
case CHARSTATE_WALLRUN_INIT:
case CHARSTATE_WALLRUN_TO_WALL:
case CHARSTATE_WALLRUN_ON_WALL:
#endif
{
PLAYERFN_SET_ANIM_SPEED(p, s);
speed = p->qSpeedGround;
speed = (speed >> 5) + (speed >> 6);
speed = ABS(speed);
s->animSpeed = CLAMP_32(speed, SPRITE_ANIM_SPEED(0.5), SPRITE_ANIM_SPEED(8.0));
} break;
#ifndef COLLECT_RINGS_ROM
case CHARSTATE_AIR_ATTACK - 9: {
case CHARSTATE_AIR_ATTACK: {
if (p->character != CHARACTER_CREAM) {
break;
}
#ifndef NON_MATCHING
speed = p->qSpeedGround;
speed = (speed >> 5) + (speed >> 6);
speed = ABS(speed);
if (speed >= SPRITE_ANIM_SPEED(0.5)) {
if (speed > SPRITE_ANIM_SPEED(8.0)) {
speed = SPRITE_ANIM_SPEED(8.0);
}
} else {
speed = SPRITE_ANIM_SPEED(0.5);
}
s->animSpeed = speed;
#else
PLAYERFN_SET_ANIM_SPEED(p, s);
#endif
s->animSpeed = CLAMP_32(speed, SPRITE_ANIM_SPEED(0.5), SPRITE_ANIM_SPEED(8.0));
} break;
case CHARSTATE_WINDUP_STICK_UPWARDS - 9:
case CHARSTATE_WINDUP_STICK_DOWNWARDS - 9: {
#ifndef NON_MATCHING
r0 = p->qSpeedAirY;
goto lab;
#else
s->animSpeed = I(ABS(p->qSpeedAirY)) * 3 + 8;
#endif
case CHARSTATE_WINDUP_STICK_UPWARDS:
case CHARSTATE_WINDUP_STICK_DOWNWARDS: {
speed = p->qSpeedAirY;
speed = ABS(speed);
speed = I(speed) * 3 + 8;
s->animSpeed = speed;
} break;
case CHARSTATE_WINDUP_STICK_SINGLE_TURN_UP - 9:
case CHARSTATE_WINDUP_STICK_SINGLE_TURN_DOWN - 9: {
#ifndef NON_MATCHING
r0 = p->qSpeedGround;
lab:
speed = I(ABS(r0)) * 3 + 8;
case CHARSTATE_WINDUP_STICK_SINGLE_TURN_UP:
case CHARSTATE_WINDUP_STICK_SINGLE_TURN_DOWN: {
speed = p->qSpeedGround;
speed = ABS(speed);
speed = I(speed) * 3 + 8;
s->animSpeed = speed;
#else
s->animSpeed = I(ABS(p->qSpeedGround)) * 3 + 8;
#endif
} break;
#endif
}