diff options
-rw-r--r-- | asm/script_movement.s | 602 | ||||
-rw-r--r-- | include/script_movement.h | 2 | ||||
-rw-r--r-- | include/task.h | 19 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/battle_anim_sound_tasks.c | 4 | ||||
-rw-r--r-- | src/battle_transition.c | 6 | ||||
-rw-r--r-- | src/event_object_lock.c | 4 | ||||
-rw-r--r-- | src/list_menu.c | 8 | ||||
-rw-r--r-- | src/palette.c | 2 | ||||
-rw-r--r-- | src/rock.c | 2 | ||||
-rw-r--r-- | src/scrcmd.c | 4 | ||||
-rw-r--r-- | src/script_movement.c | 226 | ||||
-rw-r--r-- | sym_ewram.txt | 5 |
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 |