summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-02-24 15:31:40 -0500
committerPikalaxALT <pikalaxalt@gmail.com>2020-02-24 15:32:19 -0500
commit3666a47d1cf9ee654f198bf79f632187b608afa1 (patch)
tree5858e6933a00ccb2ec24385fc080e6115c9a4eb6
parenta0fa06a066dd2261dfdfb87ea5fd8a4ecb3fa634 (diff)
Port script_movement
-rw-r--r--asm/script_movement.s602
-rw-r--r--include/script_movement.h2
-rw-r--r--include/task.h19
-rw-r--r--ld_script.txt2
-rw-r--r--src/battle_anim_sound_tasks.c4
-rw-r--r--src/battle_transition.c6
-rw-r--r--src/event_object_lock.c4
-rw-r--r--src/list_menu.c8
-rw-r--r--src/palette.c2
-rw-r--r--src/rock.c2
-rw-r--r--src/scrcmd.c4
-rw-r--r--src/script_movement.c226
-rw-r--r--sym_ewram.txt5
13 files changed, 257 insertions, 629 deletions
diff --git a/asm/script_movement.s b/asm/script_movement.s
deleted file mode 100644
index 7b3a70a25..000000000
--- a/asm/script_movement.s
+++ /dev/null
@@ -1,602 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start ScriptMovement_StartObjectMovementScript
-ScriptMovement_StartObjectMovementScript: @ 8097434
- push {r4,lr}
- sub sp, 0x4
- adds r4, r3, 0
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r1, 24
- lsls r2, 24
- lsrs r2, 24
- mov r3, sp
- bl TryGetObjectEventIdByLocalIdAndMap
- lsls r0, 24
- cmp r0, 0
- beq _08097456
- movs r0, 0x1
- b _0809747E
-_08097456:
- ldr r0, _08097488 @ =Task_80A244C
- bl FuncIsActiveTask
- lsls r0, 24
- cmp r0, 0
- bne _08097468
- movs r0, 0x32
- bl sub_80974F8
-_08097468:
- bl sub_8097540
- lsls r0, 24
- lsrs r0, 24
- mov r1, sp
- ldrb r1, [r1]
- adds r2, r4, 0
- bl sub_8097554
- lsls r0, 24
- lsrs r0, 24
-_0809747E:
- add sp, 0x4
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_08097488: .4byte Task_80A244C
- thumb_func_end ScriptMovement_StartObjectMovementScript
-
- thumb_func_start ScriptMovement_IsObjectMovementFinished
-ScriptMovement_IsObjectMovementFinished: @ 809748C
- push {r4,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r1, 24
- lsls r2, 24
- lsrs r2, 24
- mov r3, sp
- bl TryGetObjectEventIdByLocalIdAndMap
- lsls r0, 24
- cmp r0, 0
- bne _080974CE
- bl sub_8097540
- lsls r0, 24
- lsrs r4, r0, 24
- mov r0, sp
- ldrb r1, [r0]
- adds r0, r4, 0
- bl sub_80975C0
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0x10
- beq _080974CE
- adds r0, r4, 0
- bl sub_80976D0
- lsls r0, 24
- lsrs r0, 24
- b _080974D0
-_080974CE:
- movs r0, 0x1
-_080974D0:
- add sp, 0x4
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end ScriptMovement_IsObjectMovementFinished
-
- thumb_func_start sub_80974D8
-sub_80974D8: @ 80974D8
- push {r4,lr}
- bl sub_8097540
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0xFF
- beq _080974F2
- adds r0, r4, 0
- bl UnfreezeObjects
- adds r0, r4, 0
- bl DestroyTask
-_080974F2:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_80974D8
-
- thumb_func_start sub_80974F8
-sub_80974F8: @ 80974F8
- push {r4,r5,lr}
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- ldr r0, _08097534 @ =Task_80A244C
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- movs r2, 0x1
- lsls r1, r0, 2
- adds r1, r0
- lsls r3, r1, 3
- ldr r5, _08097538 @ =gTasks+0x8
- ldr r0, _0809753C @ =0x0000ffff
- adds r4, r0, 0
-_08097518:
- lsls r0, r2, 1
- adds r0, r3
- adds r0, r5
- ldrh r1, [r0]
- orrs r1, r4
- strh r1, [r0]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0xF
- bls _08097518
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08097534: .4byte Task_80A244C
-_08097538: .4byte gTasks+0x8
-_0809753C: .4byte 0x0000ffff
- thumb_func_end sub_80974F8
-
- thumb_func_start sub_8097540
-sub_8097540: @ 8097540
- push {lr}
- ldr r0, _08097550 @ =Task_80A244C
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- pop {r1}
- bx r1
- .align 2, 0
-_08097550: .4byte Task_80A244C
- thumb_func_end sub_8097540
-
- thumb_func_start sub_8097554
-sub_8097554: @ 8097554
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- mov r9, r2
- lsls r0, 24
- lsrs r5, r0, 24
- adds r7, r5, 0
- lsls r1, 24
- lsrs r6, r1, 24
- mov r8, r6
- adds r0, r5, 0
- adds r1, r6, 0
- bl sub_80975C0
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x10
- beq _08097590
- adds r0, r5, 0
- adds r1, r4, 0
- bl sub_80976D0
- lsls r0, 24
- cmp r0, 0
- beq _080975B0
- adds r0, r5, 0
- adds r1, r4, 0
- adds r2, r6, 0
- b _080975A6
-_08097590:
- adds r0, r7, 0
- movs r1, 0xFF
- bl sub_80975C0
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x10
- beq _080975B0
- adds r0, r7, 0
- adds r1, r4, 0
- mov r2, r8
-_080975A6:
- mov r3, r9
- bl sub_8097728
- movs r0, 0
- b _080975B2
-_080975B0:
- movs r0, 0x1
-_080975B2:
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_8097554
-
- thumb_func_start sub_80975C0
-sub_80975C0: @ 80975C0
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r3, r1, 24
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- ldr r0, _080975E4 @ =gTasks+0x8
- adds r1, r0
- adds r1, 0x2
- movs r2, 0
-_080975D8:
- ldrb r0, [r1]
- cmp r0, r3
- bne _080975E8
- adds r0, r2, 0
- b _080975F6
- .align 2, 0
-_080975E4: .4byte gTasks+0x8
-_080975E8:
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- adds r1, 0x1
- cmp r2, 0xF
- bls _080975D8
- movs r0, 0x10
-_080975F6:
- pop {r1}
- bx r1
- thumb_func_end sub_80975C0
-
- thumb_func_start sub_80975FC
-sub_80975FC: @ 80975FC
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r3, r1, 24
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- ldr r0, _0809762C @ =gTasks+0x8
- adds r1, r0
- adds r1, 0x2
- str r1, [r2]
- movs r0, 0
- cmp r0, r3
- bcs _08097628
-_0809761A:
- adds r0, 0x1
- lsls r0, 24
- lsrs r0, 24
- adds r1, 0x1
- cmp r0, r3
- bcc _0809761A
- str r1, [r2]
-_08097628:
- pop {r0}
- bx r0
- .align 2, 0
-_0809762C: .4byte gTasks+0x8
- thumb_func_end sub_80975FC
-
- thumb_func_start sub_8097630
-sub_8097630: @ 8097630
- push {r4,lr}
- sub sp, 0x4
- adds r4, r2, 0
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r1, 24
- lsls r4, 24
- lsrs r4, 24
- mov r2, sp
- bl sub_80975FC
- ldr r0, [sp]
- strb r4, [r0]
- add sp, 0x4
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_8097630
-
- thumb_func_start sub_8097654
-sub_8097654: @ 8097654
- push {r4,lr}
- sub sp, 0x4
- adds r4, r2, 0
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r1, 24
- mov r2, sp
- bl sub_80975FC
- ldr r0, [sp]
- ldrb r0, [r0]
- strb r0, [r4]
- add sp, 0x4
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_8097654
-
- thumb_func_start sub_8097678
-sub_8097678: @ 8097678
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- ldr r2, _080976A0 @ =gBitTable
- lsrs r1, 22
- adds r1, r2
- ldr r2, [r1]
- mvns r2, r2
- lsls r2, 16
- lsrs r2, 16
- ldr r3, _080976A4 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r3
- ldrh r0, [r1, 0x8]
- ands r2, r0
- strh r2, [r1, 0x8]
- bx lr
- .align 2, 0
-_080976A0: .4byte gBitTable
-_080976A4: .4byte gTasks
- thumb_func_end sub_8097678
-
- thumb_func_start sub_80976A8
-sub_80976A8: @ 80976A8
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- ldr r3, _080976C8 @ =gTasks
- lsls r2, r0, 2
- adds r2, r0
- lsls r2, 3
- adds r2, r3
- ldr r0, _080976CC @ =gBitTable
- lsrs r1, 22
- adds r1, r0
- ldr r0, [r1]
- ldrh r1, [r2, 0x8]
- orrs r0, r1
- strh r0, [r2, 0x8]
- bx lr
- .align 2, 0
-_080976C8: .4byte gTasks
-_080976CC: .4byte gBitTable
- thumb_func_end sub_80976A8
-
- thumb_func_start sub_80976D0
-sub_80976D0: @ 80976D0
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- ldr r3, _080976F8 @ =gTasks
- lsls r2, r0, 2
- adds r2, r0
- lsls r2, 3
- adds r2, r3
- ldr r0, _080976FC @ =gBitTable
- lsrs r1, 22
- adds r1, r0
- ldr r0, [r1]
- ldrh r1, [r2, 0x8]
- ands r0, r1
- cmp r0, 0
- bne _08097700
- movs r0, 0
- b _08097702
- .align 2, 0
-_080976F8: .4byte gTasks
-_080976FC: .4byte gBitTable
-_08097700:
- movs r0, 0x1
-_08097702:
- pop {r1}
- bx r1
- thumb_func_end sub_80976D0
-
- thumb_func_start npc_obj_offscreen_culling_and_flag_update
-npc_obj_offscreen_culling_and_flag_update: @ 8097708
- lsls r0, 24
- ldr r2, _08097714 @ =gUnknown_2039830
- lsrs r0, 22
- adds r0, r2
- str r1, [r0]
- bx lr
- .align 2, 0
-_08097714: .4byte gUnknown_2039830
- thumb_func_end npc_obj_offscreen_culling_and_flag_update
-
- thumb_func_start sub_8097718
-sub_8097718: @ 8097718
- lsls r0, 24
- ldr r1, _08097724 @ =gUnknown_2039830
- lsrs r0, 22
- adds r0, r1
- ldr r0, [r0]
- bx lr
- .align 2, 0
-_08097724: .4byte gUnknown_2039830
- thumb_func_end sub_8097718
-
- thumb_func_start sub_8097728
-sub_8097728: @ 8097728
- push {r4-r6,lr}
- mov r6, r8
- push {r6}
- adds r5, r0, 0
- adds r4, r1, 0
- adds r6, r2, 0
- mov r8, r3
- lsls r5, 24
- lsrs r5, 24
- lsls r4, 24
- lsrs r4, 24
- lsls r6, 24
- lsrs r6, 24
- adds r0, r5, 0
- adds r1, r4, 0
- bl sub_8097678
- adds r0, r4, 0
- mov r1, r8
- bl npc_obj_offscreen_culling_and_flag_update
- adds r0, r5, 0
- adds r1, r4, 0
- adds r2, r6, 0
- bl sub_8097630
- pop {r3}
- mov r8, r3
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end sub_8097728
-
- thumb_func_start UnfreezeObjects
-UnfreezeObjects: @ 8097768
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- ldr r0, _080977A4 @ =gTasks+0x8
- adds r1, r0
- adds r4, r1, 0x2
- movs r5, 0
-_0809777C:
- ldrb r0, [r4]
- cmp r0, 0xFF
- beq _08097792
- adds r1, r0, 0
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _080977A8 @ =gObjectEvents
- adds r0, r1
- bl UnfreezeObjectEvent
-_08097792:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- adds r4, 0x1
- cmp r5, 0xF
- bls _0809777C
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080977A4: .4byte gTasks+0x8
-_080977A8: .4byte gObjectEvents
- thumb_func_end UnfreezeObjects
-
- thumb_func_start Task_80A244C
-Task_80A244C: @ 80977AC
- push {r4-r7,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r7, r0, 24
- movs r5, 0
- mov r6, sp
-_080977B8:
- adds r0, r7, 0
- adds r1, r5, 0
- mov r2, sp
- bl sub_8097654
- ldrb r0, [r6]
- cmp r0, 0xFF
- beq _080977DC
- adds r4, r0, 0
- adds r0, r5, 0
- bl sub_8097718
- adds r3, r0, 0
- adds r0, r7, 0
- adds r1, r5, 0
- adds r2, r4, 0
- bl sub_80977F0
-_080977DC:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0xF
- bls _080977B8
- add sp, 0x4
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end Task_80A244C
-
- thumb_func_start sub_80977F0
-sub_80977F0: @ 80977F0
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- adds r6, r3, 0
- lsls r0, 24
- lsrs r0, 24
- adds r7, r0, 0
- lsls r1, 24
- lsrs r5, r1, 24
- mov r8, r5
- lsls r2, 24
- lsrs r4, r2, 24
- adds r1, r5, 0
- bl sub_80976D0
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _0809786A
- lsls r0, r4, 3
- adds r0, r4
- lsls r0, 2
- ldr r1, _08097850 @ =gObjectEvents
- adds r4, r0, r1
- adds r0, r4, 0
- bl ObjectEventIsSpecialAnimActive
- lsls r0, 24
- cmp r0, 0
- beq _08097838
- adds r0, r4, 0
- bl ObjectEventClearHeldMovementIfFinished
- lsls r0, 24
- cmp r0, 0
- beq _0809786A
-_08097838:
- ldrb r1, [r6]
- cmp r1, 0xFE
- bne _08097854
- adds r0, r7, 0
- adds r1, r5, 0
- bl sub_80976A8
- adds r0, r4, 0
- bl FreezeObjectEvent
- b _0809786A
- .align 2, 0
-_08097850: .4byte gObjectEvents
-_08097854:
- adds r0, r4, 0
- bl ObjectEventSetHeldMovement
- lsls r0, 24
- cmp r0, 0
- bne _0809786A
- adds r6, 0x1
- mov r0, r8
- adds r1, r6, 0
- bl npc_obj_offscreen_culling_and_flag_update
-_0809786A:
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_80977F0
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/include/script_movement.h b/include/script_movement.h
index 2a6dbd2a7..a6f3e7c3c 100644
--- a/include/script_movement.h
+++ b/include/script_movement.h
@@ -5,6 +5,6 @@
bool8 ScriptMovement_StartObjectMovementScript(u8, u8, u8, const u8 *);
bool8 ScriptMovement_IsObjectMovementFinished(u8, u8, u8);
-void sub_80974D8(void);
+void ScriptMovement_UnfreezeObjectEvents(void);
#endif // GUARD_SCRIPT_MOVEMENT_H
diff --git a/include/task.h b/include/task.h
index 7a7a2ff22..0d605b04d 100644
--- a/include/task.h
+++ b/include/task.h
@@ -3,20 +3,23 @@
#include "global.h"
+#define HEAD_SENTINEL 0xFE
+#define TAIL_SENTINEL 0xFF
+
#define NUM_TASKS 16
-#define TASK_NONE 0xFF
+#define NUM_TASK_DATA 16
typedef void (*TaskFunc)(u8 taskId);
struct Task
{
- /*0x00*/ TaskFunc func;
- /*0x04*/ bool8 isActive;
- /*0x05*/ u8 prev;
- /*0x06*/ u8 next;
- /*0x07*/ u8 priority;
- /*0x08*/ s16 data[16];
-}; /*size = 0x28*/
+ TaskFunc func;
+ bool8 isActive;
+ u8 prev;
+ u8 next;
+ u8 priority;
+ s16 data[NUM_TASK_DATA];
+};
extern struct Task gTasks[];
diff --git a/ld_script.txt b/ld_script.txt
index eb6f285e5..74607f92e 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -130,7 +130,7 @@ SECTIONS {
src/trainer_card.o(.text);
asm/pokemon_storage_system.o(.text);
src/pokemon_icon.o(.text);
- asm/script_movement.o(.text);
+ src/script_movement.o(.text);
asm/fldeff_cut.o(.text);
src/mail_data.o(.text);
src/map_name_popup.o(.text);
diff --git a/src/battle_anim_sound_tasks.c b/src/battle_anim_sound_tasks.c
index d74b743e8..f2740a1a5 100644
--- a/src/battle_anim_sound_tasks.c
+++ b/src/battle_anim_sound_tasks.c
@@ -178,7 +178,7 @@ void sub_80DD148(u8 taskId)
gTasks[taskId].data[2] = pan;
if (species != SPECIES_NONE)
{
- if (gBattleAnimArgs[1] == TASK_NONE)
+ if (gBattleAnimArgs[1] == TAIL_SENTINEL)
PlayCry3(species, pan, 9);
else
PlayCry3(species, pan, 7);
@@ -199,7 +199,7 @@ static void sub_80DD270(u8 taskId)
{
++gTasks[taskId].data[9];
}
- else if (gTasks[taskId].data[0] == TASK_NONE)
+ else if (gTasks[taskId].data[0] == TAIL_SENTINEL)
{
if (!IsCryPlaying())
{
diff --git a/src/battle_transition.c b/src/battle_transition.c
index 463a3d930..b33d72f15 100644
--- a/src/battle_transition.c
+++ b/src/battle_transition.c
@@ -644,7 +644,7 @@ static bool8 BT_Phase1Blink(struct Task *task)
static bool8 BT_WaitForPhase1(struct Task *task)
{
- if (FindTaskIdByFunc(sBT_Phase1Tasks[task->tTransitionId]) == TASK_NONE)
+ if (FindTaskIdByFunc(sBT_Phase1Tasks[task->tTransitionId]) == TAIL_SENTINEL)
{
++task->tState;
return TRUE;
@@ -665,7 +665,7 @@ static bool8 BT_Phase2LaunchAnimTask(struct Task *task)
static bool8 BT_WaitForPhase2(struct Task *task)
{
task->tTransitionDone = FALSE;
- if (FindTaskIdByFunc(sBT_Phase2Tasks[task->tTransitionId]) == TASK_NONE)
+ if (FindTaskIdByFunc(sBT_Phase2Tasks[task->tTransitionId]) == TAIL_SENTINEL)
task->tTransitionDone = TRUE;
return FALSE;
}
@@ -3432,7 +3432,7 @@ static void BT_CreatePhase1SubTask(s16 fadeOutDelay, s16 fadeInDelay, s16 blinkT
static bool8 BT_IsPhase1Done(void)
{
- if (FindTaskIdByFunc(BT_Phase1SubTask) == TASK_NONE)
+ if (FindTaskIdByFunc(BT_Phase1SubTask) == TAIL_SENTINEL)
return TRUE;
else
return FALSE;
diff --git a/src/event_object_lock.c b/src/event_object_lock.c
index 2bb9736aa..02f0557f2 100644
--- a/src/event_object_lock.c
+++ b/src/event_object_lock.c
@@ -87,7 +87,7 @@ void sub_80696C0(void)
{
u8 objectEventId = GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0);
ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objectEventId]);
- sub_80974D8();
+ ScriptMovement_UnfreezeObjectEvents();
UnfreezeObjectEvents();
}
@@ -98,7 +98,7 @@ void UnionRoom_UnlockPlayerAndChatPartner(void)
ObjectEventClearHeldMovementIfFinished(&gObjectEvents[gSelectedObjectEvent]);
objectEventId = GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0);
ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objectEventId]);
- sub_80974D8();
+ ScriptMovement_UnfreezeObjectEvents();
UnfreezeObjectEvents();
}
diff --git a/src/list_menu.c b/src/list_menu.c
index bd1d2699e..21ef40fbe 100644
--- a/src/list_menu.c
+++ b/src/list_menu.c
@@ -256,7 +256,7 @@ void DestroyListMenuTask(u8 listTaskId, u16 *cursorPos, u16 *itemsAbove)
if (itemsAbove != NULL)
*itemsAbove = list->itemsAbove;
- if (list->taskId != TASK_NONE)
+ if (list->taskId != TAIL_SENTINEL)
ListMenuRemoveCursorObject(list->taskId, list->template.cursorKind - 2);
DestroyTask(listTaskId);
@@ -346,7 +346,7 @@ static u8 ListMenuInitInternal(const struct ListMenuTemplate *listMenuTemplate,
list->itemsAbove = itemsAbove;
list->unk_1C = 0;
list->unk_1D = 0;
- list->taskId = TASK_NONE;
+ list->taskId = TAIL_SENTINEL;
list->unk_1F = 0;
gListMenuOverride.cursorPal = list->template.cursorPal;
gListMenuOverride.fillValue = list->template.fillValue;
@@ -418,12 +418,12 @@ static void ListMenuDrawCursor(struct ListMenu *list)
case 1:
break;
case 2:
- if (list->taskId == TASK_NONE)
+ if (list->taskId == TAIL_SENTINEL)
list->taskId = ListMenuAddCursorObject(list, 0);
ListMenuUpdateCursorObject(list->taskId, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 - 1, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y - 1, 0);
break;
case 3:
- if (list->taskId == TASK_NONE)
+ if (list->taskId == TAIL_SENTINEL)
list->taskId = ListMenuAddCursorObject(list, 1);
ListMenuUpdateCursorObject(list->taskId, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 + x, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y, 1);
break;
diff --git a/src/palette.c b/src/palette.c
index 6609c9baa..04638f6d1 100644
--- a/src/palette.c
+++ b/src/palette.c
@@ -948,7 +948,7 @@ void sub_8071898(void)
while (TRUE)
{
taskId = FindTaskIdByFunc(sub_80718B8);
- if (taskId == TASK_NONE)
+ if (taskId == TAIL_SENTINEL)
break;
DestroyTask(taskId);
}
diff --git a/src/rock.c b/src/rock.c
index 082f3b655..3ec9cec04 100644
--- a/src/rock.c
+++ b/src/rock.c
@@ -704,7 +704,7 @@ static void sub_80B4F78(struct Sprite *sprite)
{
u8 taskId = FindTaskIdByFunc(sub_80B4D00);
- if (taskId != TASK_NONE)
+ if (taskId != TAIL_SENTINEL)
--gTasks[taskId].data[11];
DestroySprite(sprite);
}
diff --git a/src/scrcmd.c b/src/scrcmd.c
index 389bf0cc2..77b87aaa8 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -1238,7 +1238,7 @@ bool8 ScrCmd_releaseall(struct ScriptContext *ctx)
HideFieldMessageBox();
playerObjectId = GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0);
ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]);
- sub_80974D8();
+ ScriptMovement_UnfreezeObjectEvents();
UnfreezeObjectEvents();
return FALSE;
}
@@ -1252,7 +1252,7 @@ bool8 ScrCmd_release(struct ScriptContext *ctx)
ObjectEventClearHeldMovementIfFinished(&gObjectEvents[gSelectedObjectEvent]);
playerObjectId = GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0);
ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]);
- sub_80974D8();
+ ScriptMovement_UnfreezeObjectEvents();
UnfreezeObjectEvents();
return FALSE;
}
diff --git a/src/script_movement.c b/src/script_movement.c
new file mode 100644
index 000000000..7503e8f44
--- /dev/null
+++ b/src/script_movement.c
@@ -0,0 +1,226 @@
+#include "global.h"
+#include "task.h"
+#include "util.h"
+#include "event_object_movement.h"
+#include "constants/event_objects.h"
+#include "constants/event_object_movement.h"
+
+static EWRAM_DATA const u8 (*sMovementScripts[OBJECT_EVENTS_COUNT]) = {};
+
+static void ScriptMovement_StartMoveObjects(u8 priority);
+static u8 GetMoveObjectsTaskId(void);
+static u8 ScriptMovement_TryAddNewMovement(u8 taskId, u8 objEventId, const u8 *movementScript);
+static u8 GetMovementScriptIdFromObjectEventId(u8 taskId, u8 objEventId);
+static bool8 IsMovementScriptFinished(u8 taskId, u8 moveScrId);
+static void ScriptMovement_MoveObjects(u8 taskId);
+static void ScriptMovement_AddNewMovement(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript);
+static void ScriptMovement_UnfreezeActiveObjects(u8 taskId);
+static void ScriptMovement_TakeStep(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript);
+
+bool8 ScriptMovement_StartObjectMovementScript(u8 localId, u8 mapNum, u8 mapGroup, const u8 *movementScript)
+{
+ u8 objEventId;
+ if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objEventId))
+ return TRUE;
+
+ if (!FuncIsActiveTask(ScriptMovement_MoveObjects))
+ ScriptMovement_StartMoveObjects(50);
+ return ScriptMovement_TryAddNewMovement(GetMoveObjectsTaskId(), objEventId, movementScript);
+}
+
+bool8 ScriptMovement_IsObjectMovementFinished(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 objEventId;
+ u8 taskId;
+ u8 moveScrId;
+ if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objEventId))
+ return TRUE;
+ taskId = GetMoveObjectsTaskId();
+ moveScrId = GetMovementScriptIdFromObjectEventId(taskId, objEventId);
+ if (moveScrId == OBJECT_EVENTS_COUNT)
+ return TRUE;
+ return IsMovementScriptFinished(taskId, moveScrId);
+}
+
+void ScriptMovement_UnfreezeObjectEvents(void)
+{
+ u8 taskId = GetMoveObjectsTaskId();
+ if (taskId != TAIL_SENTINEL)
+ {
+ ScriptMovement_UnfreezeActiveObjects(taskId);
+ DestroyTask(taskId);
+ }
+}
+
+void ScriptMovement_StartMoveObjects(u8 priority)
+{
+ u8 i;
+ u8 taskId = CreateTask(ScriptMovement_MoveObjects, priority);
+ for (i = 1; i < NUM_TASK_DATA; i++)
+ {
+ gTasks[taskId].data[i] = -1;
+ }
+}
+
+u8 GetMoveObjectsTaskId(void)
+{
+ return FindTaskIdByFunc(ScriptMovement_MoveObjects);
+}
+
+bool8 ScriptMovement_TryAddNewMovement(u8 taskId, u8 objEventId, const u8 *movementScript)
+{
+ u8 moveScrId;
+
+ moveScrId = GetMovementScriptIdFromObjectEventId(taskId, objEventId);
+ if (moveScrId != OBJECT_EVENTS_COUNT)
+ {
+ if (IsMovementScriptFinished(taskId, moveScrId) == FALSE)
+ {
+ return TRUE;
+ }
+ else
+ {
+ ScriptMovement_AddNewMovement(taskId, moveScrId, objEventId, movementScript);
+ return FALSE;
+ }
+ }
+ moveScrId = GetMovementScriptIdFromObjectEventId(taskId, OBJ_EVENT_ID_PLAYER);
+ if (moveScrId == OBJECT_EVENTS_COUNT)
+ {
+ return TRUE;
+ }
+ else
+ {
+ ScriptMovement_AddNewMovement(taskId, moveScrId, objEventId, movementScript);
+ return FALSE;
+ }
+}
+
+u8 GetMovementScriptIdFromObjectEventId(u8 taskId, u8 objEventId)
+{
+ u8 i;
+ u8 *moveScriptId = (u8 *)&gTasks[taskId].data[1];
+ for (i = 0; i < OBJECT_EVENTS_COUNT; i++, moveScriptId++)
+ {
+ if (*moveScriptId == objEventId)
+ return i;
+ }
+ return OBJECT_EVENTS_COUNT;
+}
+
+void LoadObjectEventIdPtrFromMovementScript(u8 taskId, u8 moveScrId, u8 **pObjEventId)
+{
+ u8 i;
+
+ *pObjEventId = (u8 *)&gTasks[taskId].data[1];
+ for (i = 0; i < moveScrId; i++, (*pObjEventId)++)
+ ;
+}
+
+void SetObjectEventIdAtMovementScript(u8 taskId, u8 moveScrId, u8 objEventId)
+{
+ u8 *ptr;
+
+ LoadObjectEventIdPtrFromMovementScript(taskId, moveScrId, &ptr);
+ *ptr = objEventId;
+}
+
+void LoadObjectEventIdFromMovementScript(u8 taskId, u8 moveScrId, u8 *objEventId)
+{
+ u8 *ptr;
+
+ LoadObjectEventIdPtrFromMovementScript(taskId, moveScrId, &ptr);
+ *objEventId = *ptr;
+}
+
+
+static void ClearMovementScriptFinished(u8 taskId, u8 moveScrId)
+{
+ u16 mask = ~gBitTable[moveScrId];
+
+ gTasks[taskId].data[0] &= mask;
+}
+
+static void SetMovementScriptFinished(u8 taskId, u8 moveScrId)
+{
+ gTasks[taskId].data[0] |= gBitTable[moveScrId];
+}
+
+static bool8 IsMovementScriptFinished(u8 taskId, u8 moveScrId)
+{
+ u16 moveScriptFinished = (u16)gTasks[taskId].data[0] & gBitTable[moveScrId];
+
+ if (moveScriptFinished != 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void SetMovementScript(u8 moveScrId, const u8 *movementScript)
+{
+ sMovementScripts[moveScrId] = movementScript;
+}
+
+static const u8 *GetMovementScript(u8 moveScrId)
+{
+ return sMovementScripts[moveScrId];
+}
+
+static void ScriptMovement_AddNewMovement(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript)
+{
+ ClearMovementScriptFinished(taskId, moveScrId);
+ SetMovementScript(moveScrId, movementScript);
+ SetObjectEventIdAtMovementScript(taskId, moveScrId, objEventId);
+}
+
+static void ScriptMovement_UnfreezeActiveObjects(u8 taskId)
+{
+ u8 *pObjEventId;
+ u8 i;
+
+ pObjEventId = (u8 *)&gTasks[taskId].data[1];
+ for (i = 0; i < OBJECT_EVENTS_COUNT; i++, pObjEventId++)
+ {
+ if (*pObjEventId != 0xFF)
+ UnfreezeObjectEvent(&gObjectEvents[*pObjEventId]);
+ }
+}
+
+static void ScriptMovement_MoveObjects(u8 taskId)
+{
+ u8 i;
+ u8 objEventId;
+
+ for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
+ {
+ LoadObjectEventIdFromMovementScript(taskId, i, &objEventId);
+ if (objEventId != 0xFF)
+ ScriptMovement_TakeStep(taskId, i, objEventId, GetMovementScript(i));
+ }
+}
+
+static void ScriptMovement_TakeStep(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript)
+{
+ u8 nextMoveActionId;
+
+ if (IsMovementScriptFinished(taskId, moveScrId) == TRUE)
+ return;
+ if (ObjectEventIsSpecialAnimActive(&gObjectEvents[objEventId])
+ && !ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objEventId]))
+ return;
+
+ nextMoveActionId = *movementScript;
+ if (nextMoveActionId == MOVEMENT_ACTION_STEP_END)
+ {
+ SetMovementScriptFinished(taskId, moveScrId);
+ FreezeObjectEvent(&gObjectEvents[objEventId]);
+ }
+ else
+ {
+ if (!ObjectEventSetHeldMovement(&gObjectEvents[objEventId], nextMoveActionId))
+ {
+ movementScript++;
+ SetMovementScript(moveScrId, movementScript);
+ }
+ }
+}
diff --git a/sym_ewram.txt b/sym_ewram.txt
index 877a870c5..d358929eb 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -216,9 +216,10 @@ gUnknown_2039828: @ 2039828
gUnknown_203982C: @ 203982C
.space 0x4
-gUnknown_2039830: @ 2039830
- .space 0x40
+ .align 2
+ .include "src/script_movement.o"
+ .align 2
gUnknown_2039870: @ 2039870
.space 0x4