summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@gmail.com>2020-03-25 18:00:26 -0400
committerPikalaxALT <PikalaxALT@gmail.com>2020-03-25 18:00:26 -0400
commit302c6bfe6b13a329cb2aa36913b07b86abcc3694 (patch)
tree216b6ae25b975e82cb4657f4cdb4a149001386af
parentc032dc02319139771d8fed40c14297ee81b18b34 (diff)
finish field_player_avatar
-rw-r--r--asm/field_player_avatar.s472
-rw-r--r--data/field_player_avatar.s8
-rw-r--r--include/bike.h1
-rw-r--r--include/field_player_avatar.h1
-rw-r--r--ld_script.txt2
-rw-r--r--src/field_player_avatar.c163
6 files changed, 162 insertions, 485 deletions
diff --git a/asm/field_player_avatar.s b/asm/field_player_avatar.s
deleted file mode 100644
index f1bcf4e39..000000000
--- a/asm/field_player_avatar.s
+++ /dev/null
@@ -1,472 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_805DAB0
-sub_805DAB0: @ 805DAB0
- push {r4,lr}
- ldr r4, _0805DACC @ =sub_805DB04
- adds r0, r4, 0
- movs r1, 0
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- bl _call_via_r4
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0805DACC: .4byte sub_805DB04
- thumb_func_end sub_805DAB0
-
- thumb_func_start sub_805DAD0
-sub_805DAD0: @ 805DAD0
- push {lr}
- ldr r0, _0805DAE0 @ =sub_805DB04
- bl FuncIsActiveTask
- lsls r0, 24
- lsrs r0, 24
- pop {r1}
- bx r1
- .align 2, 0
-_0805DAE0: .4byte sub_805DB04
- thumb_func_end sub_805DAD0
-
- thumb_func_start sub_805DAE4
-sub_805DAE4: @ 805DAE4
- ldr r1, _0805DAEC @ =gUnknown_2036E34
- strb r0, [r1]
- bx lr
- .align 2, 0
-_0805DAEC: .4byte gUnknown_2036E34
- thumb_func_end sub_805DAE4
-
- thumb_func_start sub_805DAF0
-sub_805DAF0: @ 805DAF0
- push {lr}
- ldr r1, _0805DB00 @ =gUnknown_2036E34
- ldrb r0, [r1]
- cmp r0, 0
- bne _0805DAFC
- movs r0, 0x1
-_0805DAFC:
- pop {r1}
- bx r1
- .align 2, 0
-_0805DB00: .4byte gUnknown_2036E34
- thumb_func_end sub_805DAF0
-
- thumb_func_start sub_805DB04
-sub_805DB04: @ 805DB04
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- lsls r0, 24
- lsrs r0, 24
- adds r2, r0, 0
- ldr r0, _0805DB48 @ =gPlayerAvatar
- ldrb r1, [r0, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _0805DB4C @ =gObjectEvents
- adds r4, r0, r1
- ldrb r1, [r4, 0x4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r1, _0805DB50 @ =gSprites
- adds r7, r0, r1
- lsls r0, r2, 2
- adds r0, r2
- lsls r0, 3
- ldr r1, _0805DB54 @ =gTasks+0x8
- adds r5, r0, r1
- movs r0, 0
- ldrsh r6, [r5, r0]
- cmp r6, 0x1
- beq _0805DBBA
- cmp r6, 0x1
- bgt _0805DB58
- cmp r6, 0
- beq _0805DB5E
- b _0805DBFA
- .align 2, 0
-_0805DB48: .4byte gPlayerAvatar
-_0805DB4C: .4byte gObjectEvents
-_0805DB50: .4byte gSprites
-_0805DB54: .4byte gTasks+0x8
-_0805DB58:
- cmp r6, 0x2
- beq _0805DBF4
- b _0805DBFA
-_0805DB5E:
- adds r0, r4, 0
- bl ObjectEventClearHeldMovementIfFinished
- lsls r0, 24
- cmp r0, 0
- beq _0805DBFA
- ldrb r0, [r4, 0x18]
- lsls r0, 28
- lsrs r0, 28
- bl sub_805DAE4
- movs r1, 0
- mov r8, r1
- strh r6, [r5, 0x2]
- movs r0, 0x1
- strh r0, [r5, 0x4]
- ldrh r0, [r7, 0x26]
- ldrh r2, [r7, 0x22]
- adds r0, r2
- lsls r0, 4
- strh r0, [r5, 0x6]
- strh r6, [r7, 0x26]
- bl CameraObjectReset2
- ldrb r0, [r4, 0x3]
- movs r1, 0x4
- orrs r0, r1
- strb r0, [r4, 0x3]
- ldrb r1, [r7, 0x5]
- movs r0, 0xD
- negs r0, r0
- ands r0, r1
- strb r0, [r7, 0x5]
- adds r0, r7, 0
- adds r0, 0x43
- mov r1, r8
- strb r1, [r0]
- adds r2, r7, 0
- adds r2, 0x42
- ldrb r1, [r2]
- movs r0, 0x3F
- ands r0, r1
- strb r0, [r2]
- ldrh r0, [r5]
- adds r0, 0x1
- strh r0, [r5]
-_0805DBBA:
- adds r1, r5, 0x2
- adds r0, r4, 0
- bl sub_805DDC8
- ldrh r0, [r5, 0x6]
- ldrh r1, [r5, 0x4]
- subs r0, r1
- strh r0, [r5, 0x6]
- adds r1, 0x3
- strh r1, [r5, 0x4]
- lsls r0, 16
- asrs r0, 20
- strh r0, [r7, 0x22]
- movs r2, 0x22
- ldrsh r1, [r7, r2]
- ldr r0, _0805DBF0 @ =gTotalCameraPixelOffsetY
- movs r2, 0
- ldrsh r0, [r0, r2]
- adds r1, r0
- movs r0, 0x20
- negs r0, r0
- cmp r1, r0
- bge _0805DBFA
- ldrh r0, [r5]
- adds r0, 0x1
- strh r0, [r5]
- b _0805DBFA
- .align 2, 0
-_0805DBF0: .4byte gTotalCameraPixelOffsetY
-_0805DBF4:
- adds r0, r2, 0
- bl DestroyTask
-_0805DBFA:
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_805DB04
-
- thumb_func_start sub_805DC04
-sub_805DC04: @ 805DC04
- push {r4,lr}
- ldr r4, _0805DC20 @ =sub_805DC38
- adds r0, r4, 0
- movs r1, 0
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- bl _call_via_r4
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0805DC20: .4byte sub_805DC38
- thumb_func_end sub_805DC04
-
- thumb_func_start sub_805DC24
-sub_805DC24: @ 805DC24
- push {lr}
- ldr r0, _0805DC34 @ =sub_805DC38
- bl FuncIsActiveTask
- lsls r0, 24
- lsrs r0, 24
- pop {r1}
- bx r1
- .align 2, 0
-_0805DC34: .4byte sub_805DC38
- thumb_func_end sub_805DC24
-
- thumb_func_start sub_805DC38
-sub_805DC38: @ 805DC38
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- lsls r0, 24
- lsrs r0, 24
- mov r8, r0
- ldr r0, _0805DC80 @ =gPlayerAvatar
- ldrb r1, [r0, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _0805DC84 @ =gObjectEvents
- adds r4, r0, r1
- ldrb r1, [r4, 0x4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r1, _0805DC88 @ =gSprites
- adds r7, r0, r1
- mov r1, r8
- lsls r0, r1, 2
- add r0, r8
- lsls r0, 3
- ldr r1, _0805DC8C @ =gTasks+0x8
- adds r5, r0, r1
- movs r2, 0
- ldrsh r6, [r5, r2]
- cmp r6, 0x1
- beq _0805DD1A
- cmp r6, 0x1
- bgt _0805DC90
- cmp r6, 0
- beq _0805DC9A
- b _0805DDBA
- .align 2, 0
-_0805DC80: .4byte gPlayerAvatar
-_0805DC84: .4byte gObjectEvents
-_0805DC88: .4byte gSprites
-_0805DC8C: .4byte gTasks+0x8
-_0805DC90:
- cmp r6, 0x2
- beq _0805DD58
- cmp r6, 0x3
- beq _0805DD76
- b _0805DDBA
-_0805DC9A:
- bl sub_805DAF0
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r5, 0xA]
- ldr r1, _0805DD54 @ =gUnknown_835B92C
- movs r3, 0xA
- ldrsh r0, [r5, r3]
- adds r0, r1
- ldrb r0, [r0]
- bl GetFaceDirectionMovementAction
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl ObjectEventForceSetHeldMovement
- movs r0, 0
- mov r9, r0
- strh r6, [r5, 0x2]
- movs r0, 0x74
- strh r0, [r5, 0x4]
- ldrh r0, [r7, 0x22]
- strh r0, [r5, 0x8]
- ldrb r0, [r7, 0x5]
- lsls r0, 28
- lsrs r0, 30
- strh r0, [r5, 0xC]
- movs r1, 0x43
- adds r1, r7
- mov r8, r1
- ldrb r0, [r1]
- strh r0, [r5, 0xE]
- ldrh r0, [r7, 0x26]
- adds r0, 0x20
- negs r0, r0
- lsls r0, 4
- strh r0, [r5, 0x6]
- strh r6, [r7, 0x26]
- bl CameraObjectReset2
- ldrb r0, [r4, 0x3]
- movs r2, 0x4
- orrs r0, r2
- strb r0, [r4, 0x3]
- ldrb r1, [r7, 0x5]
- movs r0, 0xD
- negs r0, r0
- ands r0, r1
- orrs r0, r2
- strb r0, [r7, 0x5]
- mov r3, r9
- mov r2, r8
- strb r3, [r2]
- adds r2, r7, 0
- adds r2, 0x42
- ldrb r1, [r2]
- movs r0, 0x3F
- ands r0, r1
- strb r0, [r2]
- ldrh r0, [r5]
- adds r0, 0x1
- strh r0, [r5]
-_0805DD1A:
- adds r1, r5, 0x2
- adds r0, r4, 0
- bl sub_805DDC8
- ldrh r0, [r5, 0x4]
- ldrh r2, [r5, 0x6]
- adds r1, r0, r2
- strh r1, [r5, 0x6]
- subs r0, 0x3
- strh r0, [r5, 0x4]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x3
- bgt _0805DD3A
- movs r0, 0x4
- strh r0, [r5, 0x4]
-_0805DD3A:
- ldrh r0, [r5, 0x6]
- lsls r0, 16
- asrs r0, 20
- strh r0, [r7, 0x22]
- ldrh r2, [r5, 0x8]
- movs r3, 0x8
- ldrsh r1, [r5, r3]
- cmp r0, r1
- blt _0805DDBA
- strh r2, [r7, 0x22]
- movs r0, 0
- strh r0, [r5, 0x10]
- b _0805DD6E
- .align 2, 0
-_0805DD54: .4byte gUnknown_835B92C
-_0805DD58:
- adds r1, r5, 0x2
- adds r0, r4, 0
- bl sub_805DDC8
- ldrh r0, [r5, 0x10]
- adds r0, 0x1
- strh r0, [r5, 0x10]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x8
- ble _0805DDBA
-_0805DD6E:
- ldrh r0, [r5]
- adds r0, 0x1
- strh r0, [r5]
- b _0805DDBA
-_0805DD76:
- movs r0, 0xA
- ldrsh r6, [r5, r0]
- adds r1, r5, 0x2
- adds r0, r4, 0
- bl sub_805DDC8
- lsls r0, 24
- lsrs r0, 24
- cmp r6, r0
- bne _0805DDBA
- ldrb r1, [r4, 0x3]
- movs r0, 0x5
- negs r0, r0
- ands r0, r1
- strb r0, [r4, 0x3]
- movs r0, 0x3
- ldrb r1, [r5, 0xC]
- ands r1, r0
- lsls r1, 2
- ldrb r2, [r7, 0x5]
- movs r0, 0xD
- negs r0, r0
- ands r0, r2
- orrs r0, r1
- strb r0, [r7, 0x5]
- ldrh r1, [r5, 0xE]
- adds r0, r7, 0
- adds r0, 0x43
- strb r1, [r0]
- bl CameraObjectReset1
- mov r0, r8
- bl DestroyTask
-_0805DDBA:
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_805DC38
-
- thumb_func_start sub_805DDC8
-sub_805DDC8: @ 805DDC8
- push {r4-r6,lr}
- adds r5, r0, 0
- adds r6, r1, 0
- ldrh r1, [r6]
- movs r2, 0
- ldrsh r0, [r6, r2]
- cmp r0, 0x7
- bgt _0805DDE4
- adds r0, r1, 0x1
- strh r0, [r6]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x7
- ble _0805DE20
-_0805DDE4:
- adds r0, r5, 0
- bl ObjectEventCheckHeldMovementStatus
- lsls r0, 24
- cmp r0, 0
- beq _0805DE20
- ldr r4, _0805DE1C @ =gUnknown_835B92C
- ldrb r0, [r5, 0x18]
- lsls r0, 28
- lsrs r0, 28
- adds r0, r4
- ldrb r0, [r0]
- bl GetFaceDirectionMovementAction
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r5, 0
- bl ObjectEventForceSetHeldMovement
- movs r0, 0
- strh r0, [r6]
- ldrb r0, [r5, 0x18]
- lsls r0, 28
- lsrs r0, 28
- adds r0, r4
- ldrb r0, [r0]
- b _0805DE26
- .align 2, 0
-_0805DE1C: .4byte gUnknown_835B92C
-_0805DE20:
- ldrb r0, [r5, 0x18]
- lsls r0, 28
- lsrs r0, 28
-_0805DE26:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end sub_805DDC8
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/data/field_player_avatar.s b/data/field_player_avatar.s
deleted file mode 100644
index 74faff36c..000000000
--- a/data/field_player_avatar.s
+++ /dev/null
@@ -1,8 +0,0 @@
-#include "constants/event_objects.h"
- .include "asm/macros.inc"
- .include "constants/constants.inc"
- .section .rodata
- .align 2
-
-gUnknown_835B92C:: @ 835B92C
- .byte 0x01, 0x03, 0x04, 0x02, 0x01
diff --git a/include/bike.h b/include/bike.h
index bdc61ecfe..ad2bd999a 100644
--- a/include/bike.h
+++ b/include/bike.h
@@ -10,5 +10,6 @@ void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys);
bool32 IsRunningDisallowed(u8 metatileBehavior);
void Bike_HandleBumpySlopeJump(void);
void Bike_UpdateBikeCounterSpeed(u8 counter);
+bool8 player_should_look_direction_be_enforced_upon_movement(void);
#endif //GUARD_BIKE_H
diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h
index 51e29c060..6d854b58b 100644
--- a/include/field_player_avatar.h
+++ b/include/field_player_avatar.h
@@ -13,7 +13,6 @@ u8 GetPlayerMovementDirection(void);
u8 PlayerGetCopyableMovement(void);
void MovePlayerNotOnBike(u8 direction, u16 heldKeys);
-void sub_808D074(u8);
void sub_805C270(void);
void sub_805C780(void);
void GetXYCoordsOneStepInFrontOfPlayer(s16 *xPtr, s16 *yPtr);
diff --git a/ld_script.txt b/ld_script.txt
index c28ee1b93..0d30ed43e 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -93,7 +93,6 @@ SECTIONS {
src/field_camera.o(.text);
src/field_door.o(.text);
src/field_player_avatar.o(.text);
- asm/field_player_avatar.o(.text);
src/event_object_movement.o(.text);
src/field_message_box.o(.text);
src/event_object_lock.o(.text);
@@ -435,7 +434,6 @@ SECTIONS {
src/metatile_behavior.o(.rodata);
src/field_door.o(.rodata);
src/field_player_avatar.o(.rodata);
- data/field_player_avatar.o(.rodata);
data/event_object_movement.o(.rodata);
src/event_object_movement.o(.rodata);
src/scrcmd.o(.rodata);
diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c
index 0ee1f2fea..375123577 100644
--- a/src/field_player_avatar.c
+++ b/src/field_player_avatar.c
@@ -4,6 +4,7 @@
#include "event_data.h"
#include "event_object_movement.h"
#include "fieldmap.h"
+#include "field_camera.h"
#include "field_control_avatar.h"
#include "field_effect.h"
#include "field_effect_helpers.h"
@@ -28,7 +29,7 @@
#include "constants/moves.h"
EWRAM_DATA struct ObjectEvent * gUnknown_2036E30 = NULL;
-EWRAM_DATA bool8 gUnknown_2036E34 = FALSE;
+EWRAM_DATA u8 gUnknown_2036E34 = DIR_NONE;
EWRAM_DATA struct ObjectEvent gObjectEvents[OBJECT_EVENTS_COUNT] = {};
EWRAM_DATA struct PlayerAvatar gPlayerAvatar = {};
@@ -131,7 +132,9 @@ bool8 Fishing13(struct Task * task);
bool8 Fishing14(struct Task * task);
bool8 Fishing15(struct Task * task);
bool8 Fishing16(struct Task * task);
-bool8 player_should_look_direction_be_enforced_upon_movement(void);
+void sub_805DB04(u8 taskId);
+void sub_805DC38(u8 taskId);
+u8 sub_805DDC8(struct ObjectEvent * object, s16 *timer);
void MovementType_Player(struct Sprite *sprite)
{
@@ -1989,3 +1992,159 @@ void AlignFishingAnimationFrames(struct Sprite * playerSprite)
if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
sub_80DC4A4(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, 1, playerSprite->pos2.y);
}
+
+void sub_805DAB0(void)
+{
+ u8 taskId = CreateTask(sub_805DB04, 0);
+ sub_805DB04(taskId);
+}
+
+bool32 sub_805DAD0(void)
+{
+ return FuncIsActiveTask(sub_805DB04);
+}
+
+void sub_805DAE4(u8 direction)
+{
+ gUnknown_2036E34 = direction;
+}
+
+u8 sub_805DAF0(void)
+{
+ if (gUnknown_2036E34 == DIR_NONE)
+ return DIR_SOUTH;
+ else
+ return gUnknown_2036E34;
+}
+
+void sub_805DB04(u8 taskId)
+{
+ struct ObjectEvent *object = &gObjectEvents[gPlayerAvatar.objectEventId];
+ struct Sprite *sprite = &gSprites[object->spriteId];
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ if (!ObjectEventClearHeldMovementIfFinished(object))
+ {
+ return;
+ }
+
+ sub_805DAE4(object->facingDirection);
+ data[1] = 0;
+ data[2] = 1;
+ data[3] = (u16)(sprite->pos1.y + sprite->pos2.y) * 16;
+ sprite->pos2.y = 0;
+ CameraObjectReset2();
+ object->fixedPriority = TRUE;
+ sprite->oam.priority = 0;
+ sprite->subpriority = 0;
+ sprite->subspriteMode = SUBSPRITES_OFF;
+ data[0]++;
+ case 1:
+ sub_805DDC8(object, &data[1]);
+ data[3] -= data[2];
+ data[2] += 3;
+ sprite->pos1.y = data[3] >> 4;
+ if (sprite->pos1.y + (s16)gTotalCameraPixelOffsetY < -32)
+ {
+ data[0]++;
+ }
+ break;
+ case 2:
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void sub_805DC04(void)
+{
+ u8 taskId = CreateTask(sub_805DC38, 0);
+ sub_805DC38(taskId);
+}
+
+bool32 sub_805DC24(void)
+{
+ return FuncIsActiveTask(sub_805DC38);
+}
+
+const u8 gUnknown_835B92C[] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH};
+
+void sub_805DC38(u8 taskId)
+{
+ struct ObjectEvent *object = &gObjectEvents[gPlayerAvatar.objectEventId];
+ struct Sprite *sprite = &gSprites[object->spriteId];
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ data[5] = sub_805DAF0();
+ ObjectEventForceSetHeldMovement(object, GetFaceDirectionMovementAction(gUnknown_835B92C[data[5]]));
+ data[1] = 0;
+ data[2] = 116;
+ data[4] = sprite->pos1.y;
+ data[6] = sprite->oam.priority;
+ data[7] = sprite->subpriority;
+ data[3] = -((u16)sprite->pos2.y + 32) * 16;
+ sprite->pos2.y = 0;
+ CameraObjectReset2();
+ object->fixedPriority = TRUE;
+ sprite->oam.priority = 1;
+ sprite->subpriority = 0;
+ sprite->subspriteMode = SUBSPRITES_OFF;
+ data[0]++;
+ case 1:
+ sub_805DDC8(object, &data[1]);
+ data[3] += data[2];
+ data[2] -= 3;
+ if (data[2] < 4)
+ {
+ data[2] = 4;
+ }
+ sprite->pos1.y = data[3] >> 4;
+ if (sprite->pos1.y >= data[4])
+ {
+ sprite->pos1.y = data[4];
+ data[8] = 0;
+ data[0]++;
+ }
+ break;
+ case 2:
+ sub_805DDC8(object, &data[1]);
+ data[8]++;
+ if (data[8] > 8)
+ {
+ data[0]++;
+ }
+ break;
+ case 3:
+ if (data[5] == sub_805DDC8(object, &data[1]))
+ {
+ object->fixedPriority = 0;
+ sprite->oam.priority = data[6];
+ sprite->subpriority = data[7];
+ CameraObjectReset1();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+u8 sub_805DDC8(struct ObjectEvent *object, s16 *a1)
+{
+ if (*a1 < 8 && ++(*a1) < 8)
+ {
+ return object->facingDirection;
+ }
+
+ if (!ObjectEventCheckHeldMovementStatus(object))
+ {
+ return object->facingDirection;
+ }
+
+ ObjectEventForceSetHeldMovement(object, GetFaceDirectionMovementAction(gUnknown_835B92C[object->facingDirection]));
+ *a1 = 0;
+ return gUnknown_835B92C[object->facingDirection];
+}