summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/map_obj_lock.s302
-rw-r--r--include/global.fieldmap.h2
-rw-r--r--include/map_obj_80688E4.h1
-rw-r--r--ld_script.txt2
-rw-r--r--src/map_obj_lock.c116
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]);
+}