mirror of
https://github.com/SAT-R/sa2.git
synced 2026-10-28 09:43:38 +00:00
sa1: match sub_802486C more player.c alignment
This commit is contained in:
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
|
||||
@@ -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
@@ -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
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user