diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2019-05-19 13:02:57 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2019-05-19 13:02:57 -0400 |
commit | 12de501f36841eb22ea41fa1c3c98663a0aa210b (patch) | |
tree | c820f4f3239817887f048409c923bd91e3e34f4f | |
parent | 4661be783654c654ba66c5e5fafa1aa18e7b9213 (diff) |
map_obj_lock
-rw-r--r-- | asm/map_obj_lock.s | 302 | ||||
-rw-r--r-- | include/global.fieldmap.h | 2 | ||||
-rw-r--r-- | include/map_obj_80688E4.h | 1 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/map_obj_lock.c | 116 |
5 files changed, 119 insertions, 304 deletions
diff --git a/asm/map_obj_lock.s b/asm/map_obj_lock.s deleted file mode 100644 index 52c2b342c..000000000 --- a/asm/map_obj_lock.s +++ /dev/null @@ -1,302 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start walkrun_is_standing_still -walkrun_is_standing_still: @ 8069554 - push {lr} - ldr r0, _08069564 @ =gPlayerAvatar - ldrb r0, [r0, 0x3] - cmp r0, 0x1 - beq _08069568 - movs r0, 0x1 - b _0806956A - .align 2, 0 -_08069564: .4byte gPlayerAvatar -_08069568: - movs r0, 0 -_0806956A: - pop {r1} - bx r1 - thumb_func_end walkrun_is_standing_still - - thumb_func_start sub_8069570 -sub_8069570: @ 8069570 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - bl walkrun_is_standing_still - lsls r0, 24 - cmp r0, 0 - beq _0806958A - bl sub_805C270 - adds r0, r4, 0 - bl DestroyTask -_0806958A: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_8069570 - - thumb_func_start sub_8069590 -sub_8069590: @ 8069590 - push {lr} - ldr r0, _080695A8 @ =sub_8069570 - bl FuncIsActiveTask - lsls r0, 24 - cmp r0, 0 - bne _080695AC - bl sub_805C780 - movs r0, 0x1 - b _080695AE - .align 2, 0 -_080695A8: .4byte sub_8069570 -_080695AC: - movs r0, 0 -_080695AE: - pop {r1} - bx r1 - thumb_func_end sub_8069590 - - thumb_func_start ScriptFreezeMapObjects -ScriptFreezeMapObjects: @ 80695B4 - push {lr} - bl player_bitmagic - ldr r0, _080695C8 @ =sub_8069570 - movs r1, 0x50 - bl CreateTask - pop {r0} - bx r0 - .align 2, 0 -_080695C8: .4byte sub_8069570 - thumb_func_end ScriptFreezeMapObjects - - thumb_func_start sub_80695CC -sub_80695CC: @ 80695CC - push {r4-r6,lr} - lsls r0, 24 - lsrs r6, r0, 24 - lsls r0, r6, 2 - adds r0, r6 - lsls r0, 3 - ldr r1, _0806963C @ =gTasks - adds r5, r0, r1 - movs r1, 0x8 - ldrsh r0, [r5, r1] - cmp r0, 0 - bne _080695F6 - bl walkrun_is_standing_still - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x1 - bne _080695F6 - bl sub_805C270 - strh r4, [r5, 0x8] -_080695F6: - movs r1, 0xA - ldrsh r0, [r5, r1] - cmp r0, 0 - bne _0806961E - ldr r2, _08069640 @ =gMapObjects - ldr r0, _08069644 @ =gSelectedEventObject - ldrb r1, [r0] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - adds r1, r0, r2 - ldrb r0, [r1] - lsls r0, 30 - cmp r0, 0 - blt _0806961E - adds r0, r1, 0 - bl FreezeMapObject - movs r0, 0x1 - strh r0, [r5, 0xA] -_0806961E: - movs r1, 0x8 - ldrsh r0, [r5, r1] - cmp r0, 0 - beq _08069634 - movs r1, 0xA - ldrsh r0, [r5, r1] - cmp r0, 0 - beq _08069634 - adds r0, r6, 0 - bl DestroyTask -_08069634: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_0806963C: .4byte gTasks -_08069640: .4byte gMapObjects -_08069644: .4byte gSelectedEventObject - thumb_func_end sub_80695CC - - thumb_func_start sub_8069648 -sub_8069648: @ 8069648 - push {lr} - ldr r0, _08069660 @ =sub_80695CC - bl FuncIsActiveTask - lsls r0, 24 - cmp r0, 0 - bne _08069664 - bl sub_805C780 - movs r0, 0x1 - b _08069666 - .align 2, 0 -_08069660: .4byte sub_80695CC -_08069664: - movs r0, 0 -_08069666: - pop {r1} - bx r1 - thumb_func_end sub_8069648 - - thumb_func_start LockSelectedMapObject -LockSelectedMapObject: @ 806966C - push {r4,r5,lr} - ldr r4, _080696B0 @ =gSelectedEventObject - ldrb r0, [r4] - bl FreezeMapObjectsExceptOne - ldr r0, _080696B4 @ =sub_80695CC - movs r1, 0x50 - bl CreateTask - lsls r0, 24 - lsrs r5, r0, 24 - ldr r2, _080696B8 @ =gMapObjects - ldrb r1, [r4] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - adds r1, r0, r2 - ldrb r0, [r1] - lsls r0, 30 - cmp r0, 0 - blt _080696AA - adds r0, r1, 0 - bl FreezeMapObject - ldr r0, _080696BC @ =gTasks - lsls r1, r5, 2 - adds r1, r5 - lsls r1, 3 - adds r1, r0 - movs r0, 0x1 - strh r0, [r1, 0xA] -_080696AA: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080696B0: .4byte gSelectedEventObject -_080696B4: .4byte sub_80695CC -_080696B8: .4byte gMapObjects -_080696BC: .4byte gTasks - thumb_func_end LockSelectedMapObject - - thumb_func_start sub_80696C0 -sub_80696C0: @ 80696C0 - push {lr} - movs r0, 0xFF - movs r1, 0 - movs r2, 0 - bl GetFieldObjectIdByLocalIdAndMap - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - ldr r1, _080696EC @ =gMapObjects - adds r0, r1 - bl FieldObjectClearAnimIfSpecialAnimFinished - bl sub_80974D8 - bl UnfreezeMapObjects - pop {r0} - bx r0 - .align 2, 0 -_080696EC: .4byte gMapObjects - thumb_func_end sub_80696C0 - - thumb_func_start sub_80696F0 -sub_80696F0: @ 80696F0 - push {r4,lr} - ldr r4, _08069738 @ =gMapObjects - ldr r0, _0806973C @ =gSelectedEventObject - ldrb r1, [r0] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - adds r1, r0, r4 - ldrb r0, [r1] - lsls r0, 31 - cmp r0, 0 - beq _0806970E - adds r0, r1, 0 - bl FieldObjectClearAnimIfSpecialAnimFinished -_0806970E: - movs r0, 0xFF - movs r1, 0 - movs r2, 0 - bl GetFieldObjectIdByLocalIdAndMap - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - bl FieldObjectClearAnimIfSpecialAnimFinished - bl sub_80974D8 - bl UnfreezeMapObjects - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08069738: .4byte gMapObjects -_0806973C: .4byte gSelectedEventObject - thumb_func_end sub_80696F0 - - thumb_func_start sub_8069740 -sub_8069740: @ 8069740 - push {lr} - ldr r0, _0806975C @ =gSelectedEventObject - ldrb r1, [r0] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - ldr r1, _08069760 @ =gMapObjects - adds r0, r1 - ldr r1, _08069764 @ =gSpecialVar_Facing - ldrb r1, [r1] - bl FieldObjectFaceOppositeDirection - pop {r0} - bx r0 - .align 2, 0 -_0806975C: .4byte gSelectedEventObject -_08069760: .4byte gMapObjects -_08069764: .4byte gSpecialVar_Facing - thumb_func_end sub_8069740 - - thumb_func_start sub_8069768 -sub_8069768: @ 8069768 - push {lr} - ldr r0, _08069780 @ =gSelectedEventObject - ldrb r1, [r0] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - ldr r1, _08069784 @ =gMapObjects - adds r0, r1 - bl FieldObjectClearAnimIfSpecialAnimActive - pop {r0} - bx r0 - .align 2, 0 -_08069780: .4byte gSelectedEventObject -_08069784: .4byte gMapObjects - thumb_func_end sub_8069768 - - .align 2, 0 @ Don't pad with nop. diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 801606d50..a14905cc2 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -331,7 +331,7 @@ struct Camera }; extern struct MapObject gMapObjects[NUM_FIELD_OBJECTS]; -extern u8 gSelectedMapObject; +extern u8 gSelectedEventObject; extern struct MapHeader gMapHeader; extern struct PlayerAvatar gPlayerAvatar; extern struct Camera gCamera; diff --git a/include/map_obj_80688E4.h b/include/map_obj_80688E4.h index de871fd64..bfac00378 100644 --- a/include/map_obj_80688E4.h +++ b/include/map_obj_80688E4.h @@ -5,5 +5,6 @@ void player_bitmagic(void); void FreezeMapObject(struct MapObject *); +void FreezeMapObjectsExceptOne(u8 mapObjectId); #endif //GUARD_MAP_OBJ_80688E4_H diff --git a/ld_script.txt b/ld_script.txt index 5ff29f104..159b5d75a 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -99,7 +99,7 @@ SECTIONS { asm/field_ground_effect.o(.text); asm/map_obj_80688E4.o(.text); asm/field_message_box.o(.text); - asm/map_obj_lock.o(.text); + src/map_obj_lock.o(.text); src/text_window_graphics.o(.text); src/script.o(.text); src/scrcmd.o(.text); diff --git a/src/map_obj_lock.c b/src/map_obj_lock.c new file mode 100644 index 000000000..cdd74a5b9 --- /dev/null +++ b/src/map_obj_lock.c @@ -0,0 +1,116 @@ +#include "global.h" +#include "task.h" +#include "field_player_avatar.h" +#include "field_map_obj.h" +#include "field_map_obj_helpers.h" +#include "script_movement.h" +#include "map_obj_80688E4.h" +#include "event_data.h" +#include "map_obj_lock.h" + +bool8 walkrun_is_standing_still(void) +{ + if (gPlayerAvatar.running1 == 1) + return FALSE; + else + return TRUE; +} + +void sub_8069570(u8 taskId) +{ + if (walkrun_is_standing_still()) + { + sub_805C270(); + DestroyTask(taskId); + } +} + +bool8 sub_8069590(void) +{ + if (FuncIsActiveTask(sub_8069570)) + return FALSE; + else + { + sub_805C780(); + return TRUE; + } +} + +void ScriptFreezeMapObjects(void) +{ + player_bitmagic(); + CreateTask(sub_8069570, 80); +} + +void sub_80695CC(u8 taskId) +{ + struct Task * task = &gTasks[taskId]; + + if (task->data[0] == 0 && walkrun_is_standing_still() == TRUE) + { + sub_805C270(); + task->data[0] = 1; + } + + if (task->data[1] == 0 && !gMapObjects[gSelectedEventObject].mapobj_bit_1) + { + FreezeMapObject(&gMapObjects[gSelectedEventObject]); + task->data[1] = 1; + } + + if (task->data[0] && task->data[1]) + DestroyTask(taskId); +} + +bool8 sub_8069648(void) +{ + if (FuncIsActiveTask(sub_80695CC)) + return FALSE; + else + { + sub_805C780(); + return TRUE; + } +} + +void LockSelectedMapObject(void) +{ + u8 taskId; + + FreezeMapObjectsExceptOne(gSelectedEventObject); + taskId = CreateTask(sub_80695CC, 80); + if (!gMapObjects[gSelectedEventObject].mapobj_bit_1) + { + FreezeMapObject(&gMapObjects[gSelectedEventObject]); + gTasks[taskId].data[1] = 1; + } +} + +void sub_80696C0(void) +{ + u8 fieldObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[fieldObjectId]); + sub_80974D8(); + UnfreezeMapObjects(); +} + +void sub_80696F0(void) +{ + u8 fieldObjectId; + if (gMapObjects[gSelectedEventObject].active) + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedEventObject]); + fieldObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[fieldObjectId]); + sub_80974D8(); + UnfreezeMapObjects(); +} + +void sub_8069740(void) +{ + FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedEventObject], gSpecialVar_Facing); +} + +void sub_8069768(void) +{ + FieldObjectClearAnimIfSpecialAnimActive(&gMapObjects[gSelectedEventObject]); +} |