summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCameron Hall <camthesaxman@users.noreply.github.com>2017-01-22 21:35:31 -0600
committerYamaArashi <YamaArashi@users.noreply.github.com>2017-01-22 19:35:31 -0800
commit22e4e3f3781cf69813ff258f1cd575a9ca46ae18 (patch)
treedd913b42e28402ff4e4fd568738d8155d3bfe9e2
parentef82a98a1525f58d3a6c56194a42f7660cfc923b (diff)
decompile script_movement (#213)
* start decompiling script_movement * finish decompiling * delete script_movement.s
-rw-r--r--asm/script_movement.s596
-rw-r--r--include/asm.inc.h4
-rw-r--r--ld_script.txt2
-rw-r--r--src/script_movement.c225
4 files changed, 228 insertions, 599 deletions
diff --git a/asm/script_movement.s b/asm/script_movement.s
deleted file mode 100644
index 72523c639..000000000
--- a/asm/script_movement.s
+++ /dev/null
@@ -1,596 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "constants/species_constants.inc"
- .include "asm/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start exec_movement
-exec_movement: @ 80A20D4
- 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 TryGetFieldObjectIdByLocalIdAndMap
- lsls r0, 24
- cmp r0, 0
- beq _080A20F6
- movs r0, 0x1
- b _080A211E
-_080A20F6:
- ldr r0, _080A2128 @ =sub_80A244C
- bl FuncIsActiveTask
- lsls r0, 24
- cmp r0, 0
- bne _080A2108
- movs r0, 0x32
- bl sub_80A2198
-_080A2108:
- bl sub_80A21E0
- lsls r0, 24
- lsrs r0, 24
- mov r1, sp
- ldrb r1, [r1]
- adds r2, r4, 0
- bl sub_80A21F4
- lsls r0, 24
- lsrs r0, 24
-_080A211E:
- add sp, 0x4
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080A2128: .4byte sub_80A244C
- thumb_func_end exec_movement
-
- thumb_func_start sub_80A212C
-sub_80A212C: @ 80A212C
- 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 TryGetFieldObjectIdByLocalIdAndMap
- lsls r0, 24
- cmp r0, 0
- bne _080A216E
- bl sub_80A21E0
- lsls r0, 24
- lsrs r4, r0, 24
- mov r0, sp
- ldrb r1, [r0]
- adds r0, r4, 0
- bl sub_80A2260
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0x10
- beq _080A216E
- adds r0, r4, 0
- bl sub_80A2370
- lsls r0, 24
- lsrs r0, 24
- b _080A2170
-_080A216E:
- movs r0, 0x1
-_080A2170:
- add sp, 0x4
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_80A212C
-
- thumb_func_start sub_80A2178
-sub_80A2178: @ 80A2178
- push {r4,lr}
- bl sub_80A21E0
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0xFF
- beq _080A2192
- adds r0, r4, 0
- bl sub_80A2408
- adds r0, r4, 0
- bl DestroyTask
-_080A2192:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_80A2178
-
- thumb_func_start sub_80A2198
-sub_80A2198: @ 80A2198
- push {r4,r5,lr}
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- ldr r0, _080A21D4 @ =sub_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, _080A21D8 @ =gTasks + 0x8
- ldr r0, _080A21DC @ =0x0000ffff
- adds r4, r0, 0
-_080A21B8:
- 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 _080A21B8
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080A21D4: .4byte sub_80A244C
-_080A21D8: .4byte gTasks + 0x8
-_080A21DC: .4byte 0x0000ffff
- thumb_func_end sub_80A2198
-
- thumb_func_start sub_80A21E0
-sub_80A21E0: @ 80A21E0
- push {lr}
- ldr r0, _080A21F0 @ =sub_80A244C
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- pop {r1}
- bx r1
- .align 2, 0
-_080A21F0: .4byte sub_80A244C
- thumb_func_end sub_80A21E0
-
- thumb_func_start sub_80A21F4
-sub_80A21F4: @ 80A21F4
- 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_80A2260
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x10
- beq _080A2230
- adds r0, r5, 0
- adds r1, r4, 0
- bl sub_80A2370
- lsls r0, 24
- cmp r0, 0
- beq _080A2250
- adds r0, r5, 0
- adds r1, r4, 0
- adds r2, r6, 0
- b _080A2246
-_080A2230:
- adds r0, r7, 0
- movs r1, 0xFF
- bl sub_80A2260
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x10
- beq _080A2250
- adds r0, r7, 0
- adds r1, r4, 0
- mov r2, r8
-_080A2246:
- mov r3, r9
- bl sub_80A23C8
- movs r0, 0
- b _080A2252
-_080A2250:
- movs r0, 0x1
-_080A2252:
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_80A21F4
-
- thumb_func_start sub_80A2260
-sub_80A2260: @ 80A2260
- 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, _080A2284 @ =gTasks + 0x8
- adds r1, r0
- adds r1, 0x2
- movs r2, 0
-_080A2278:
- ldrb r0, [r1]
- cmp r0, r3
- bne _080A2288
- adds r0, r2, 0
- b _080A2296
- .align 2, 0
-_080A2284: .4byte gTasks + 0x8
-_080A2288:
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- adds r1, 0x1
- cmp r2, 0xF
- bls _080A2278
- movs r0, 0x10
-_080A2296:
- pop {r1}
- bx r1
- thumb_func_end sub_80A2260
-
- thumb_func_start sub_80A229C
-sub_80A229C: @ 80A229C
- 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, _080A22CC @ =gTasks + 0x8
- adds r1, r0
- adds r1, 0x2
- str r1, [r2]
- movs r0, 0
- cmp r0, r3
- bcs _080A22C8
-_080A22BA:
- adds r0, 0x1
- lsls r0, 24
- lsrs r0, 24
- adds r1, 0x1
- cmp r0, r3
- bcc _080A22BA
- str r1, [r2]
-_080A22C8:
- pop {r0}
- bx r0
- .align 2, 0
-_080A22CC: .4byte gTasks + 0x8
- thumb_func_end sub_80A229C
-
- thumb_func_start sub_80A22D0
-sub_80A22D0: @ 80A22D0
- 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_80A229C
- ldr r0, [sp]
- strb r4, [r0]
- add sp, 0x4
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_80A22D0
-
- thumb_func_start sub_80A22F4
-sub_80A22F4: @ 80A22F4
- 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_80A229C
- ldr r0, [sp]
- ldrb r0, [r0]
- strb r0, [r4]
- add sp, 0x4
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_80A22F4
-
- thumb_func_start sub_80A2318
-sub_80A2318: @ 80A2318
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- ldr r2, _080A2340 @ =gBitTable
- lsrs r1, 22
- adds r1, r2
- ldr r2, [r1]
- mvns r2, r2
- lsls r2, 16
- lsrs r2, 16
- ldr r3, _080A2344 @ =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
-_080A2340: .4byte gBitTable
-_080A2344: .4byte gTasks
- thumb_func_end sub_80A2318
-
- thumb_func_start sub_80A2348
-sub_80A2348: @ 80A2348
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- ldr r3, _080A2368 @ =gTasks
- lsls r2, r0, 2
- adds r2, r0
- lsls r2, 3
- adds r2, r3
- ldr r0, _080A236C @ =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
-_080A2368: .4byte gTasks
-_080A236C: .4byte gBitTable
- thumb_func_end sub_80A2348
-
- thumb_func_start sub_80A2370
-sub_80A2370: @ 80A2370
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- ldr r3, _080A2398 @ =gTasks
- lsls r2, r0, 2
- adds r2, r0
- lsls r2, 3
- adds r2, r3
- ldr r0, _080A239C @ =gBitTable
- lsrs r1, 22
- adds r1, r0
- ldr r0, [r1]
- ldrh r1, [r2, 0x8]
- ands r0, r1
- cmp r0, 0
- bne _080A23A0
- movs r0, 0
- b _080A23A2
- .align 2, 0
-_080A2398: .4byte gTasks
-_080A239C: .4byte gBitTable
-_080A23A0:
- movs r0, 0x1
-_080A23A2:
- pop {r1}
- bx r1
- thumb_func_end sub_80A2370
-
- thumb_func_start npc_obj_offscreen_culling_and_flag_update
-npc_obj_offscreen_culling_and_flag_update: @ 80A23A8
- lsls r0, 24
- ldr r2, _080A23B4 @ =gUnknown_020384F8
- lsrs r0, 22
- adds r0, r2
- str r1, [r0]
- bx lr
- .align 2, 0
-_080A23B4: .4byte gUnknown_020384F8
- thumb_func_end npc_obj_offscreen_culling_and_flag_update
-
- thumb_func_start sub_80A23B8
-sub_80A23B8: @ 80A23B8
- lsls r0, 24
- ldr r1, _080A23C4 @ =gUnknown_020384F8
- lsrs r0, 22
- adds r0, r1
- ldr r0, [r0]
- bx lr
- .align 2, 0
-_080A23C4: .4byte gUnknown_020384F8
- thumb_func_end sub_80A23B8
-
- thumb_func_start sub_80A23C8
-sub_80A23C8: @ 80A23C8
- 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_80A2318
- 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_80A22D0
- pop {r3}
- mov r8, r3
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end sub_80A23C8
-
- thumb_func_start sub_80A2408
-sub_80A2408: @ 80A2408
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- ldr r0, _080A2444 @ =gTasks + 0x8
- adds r1, r0
- adds r4, r1, 0x2
- movs r5, 0
-_080A241C:
- ldrb r0, [r4]
- cmp r0, 0xFF
- beq _080A2432
- adds r1, r0, 0
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _080A2448 @ =gMapObjects
- adds r0, r1
- bl UnfreezeMapObject
-_080A2432:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- adds r4, 0x1
- cmp r5, 0xF
- bls _080A241C
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080A2444: .4byte gTasks + 0x8
-_080A2448: .4byte gMapObjects
- thumb_func_end sub_80A2408
-
- thumb_func_start sub_80A244C
-sub_80A244C: @ 80A244C
- push {r4-r7,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r7, r0, 24
- movs r5, 0
- mov r6, sp
-_080A2458:
- adds r0, r7, 0
- adds r1, r5, 0
- mov r2, sp
- bl sub_80A22F4
- ldrb r0, [r6]
- cmp r0, 0xFF
- beq _080A247C
- adds r4, r0, 0
- adds r0, r5, 0
- bl sub_80A23B8
- adds r3, r0, 0
- adds r0, r7, 0
- adds r1, r5, 0
- adds r2, r4, 0
- bl sub_80A2490
-_080A247C:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0xF
- bls _080A2458
- add sp, 0x4
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_80A244C
-
- thumb_func_start sub_80A2490
-sub_80A2490: @ 80A2490
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- adds r5, r3, 0
- lsls r0, 24
- lsrs r7, r0, 24
- lsls r1, 24
- lsrs r6, r1, 24
- mov r8, r6
- lsls r2, 24
- lsrs r2, 24
- lsls r0, r2, 3
- adds r0, r2
- lsls r0, 2
- ldr r1, _080A24E0 @ =gMapObjects
- adds r4, r0, r1
- adds r0, r4, 0
- bl FieldObjectIsSpecialAnimActive
- lsls r0, 24
- cmp r0, 0
- beq _080A24C8
- adds r0, r4, 0
- bl FieldObjectClearAnimIfSpecialAnimFinished
- lsls r0, 24
- cmp r0, 0
- beq _080A24FA
-_080A24C8:
- ldrb r1, [r5]
- cmp r1, 0xFE
- bne _080A24E4
- adds r0, r7, 0
- adds r1, r6, 0
- bl sub_80A2348
- adds r0, r4, 0
- bl FreezeMapObject
- b _080A24FA
- .align 2, 0
-_080A24E0: .4byte gMapObjects
-_080A24E4:
- adds r0, r4, 0
- bl FieldObjectSetSpecialAnim
- lsls r0, 24
- cmp r0, 0
- bne _080A24FA
- adds r5, 0x1
- mov r0, r8
- adds r1, r5, 0
- bl npc_obj_offscreen_culling_and_flag_update
-_080A24FA:
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_80A2490
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/include/asm.inc.h b/include/asm.inc.h
index bfc902ffb..482f4d91f 100644
--- a/include/asm.inc.h
+++ b/include/asm.inc.h
@@ -96,7 +96,7 @@ void sub_8060288(u8, u8, u8);
void sub_80603CC(s16 x, s16 y, s16 *pInt, s16 *pInt1);
void FieldObjectMoveDestCoords(struct MapObject *pObject, u8 unk_19, s16 *pInt, s16 *pInt1);
bool8 FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(struct MapObject *);
-void FieldObjectSetSpecialAnim(struct MapObject *, u8);
+bool8 FieldObjectSetSpecialAnim(struct MapObject *, u8);
void FieldObjectForceSetSpecialAnim(struct MapObject *pObject, u8 a);
void FieldObjectClearAnimIfSpecialAnimActive(struct MapObject *);
void FieldObjectClearAnim(struct MapObject *);
@@ -236,7 +236,7 @@ void sub_809D608(u16);
u8 pokemon_ailments_get_primary(u32);
// asm/script_movement.o
-u8 exec_movement(u8, u8, u8, void *);
+bool8 exec_movement(u8, u8, u8, u8 *);
bool8 sub_80A212C(u8, u8, u8);
void sub_80A2178(void);
diff --git a/ld_script.txt b/ld_script.txt
index c133233ff..1af54ea2b 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -138,7 +138,7 @@ SECTIONS {
asm/pokemon_summary_screen.o(.text);
src/pokemon_summary_screen.o(.text);
asm/pokemon_summary_screen.o(.text_80A0958);
- asm/script_movement.o(.text);
+ src/script_movement.o(.text);
asm/fldeff_cut.o(.text);
asm/mail_data.o(.text);
src/map_name_popup.o(.text);
diff --git a/src/script_movement.c b/src/script_movement.c
new file mode 100644
index 000000000..781235986
--- /dev/null
+++ b/src/script_movement.c
@@ -0,0 +1,225 @@
+#include "global.h"
+#include "asm.h"
+#include "task.h"
+
+extern const u32 gBitTable[];
+extern u8 *gUnknown_020384F8[];
+
+extern void UnfreezeMapObject(struct MapObject *);
+extern bool8 FieldObjectIsSpecialAnimActive(struct MapObject *);
+
+static void sub_80A2198(u8);
+static u8 sub_80A21E0(void);
+static bool8 sub_80A21F4(u8, u8, u8 *);
+static u8 sub_80A2260(u8, u8);
+static bool8 sub_80A2370(u8, u8);
+static void sub_80A23C8(u8, u8, u8, u8 *);
+static void sub_80A2408(u8);
+static void Task_80A244C(u8);
+static void sub_80A2490(u8, u8, u8, u8 *);
+
+bool8 exec_movement(u8 a, u8 b, u8 c, u8 *d)
+{
+ u8 mapObjId;
+
+ if (TryGetFieldObjectIdByLocalIdAndMap(a, b, c, &mapObjId))
+ return TRUE;
+ if (!FuncIsActiveTask(Task_80A244C))
+ sub_80A2198(50);
+ return sub_80A21F4(sub_80A21E0(), mapObjId, d);
+}
+
+bool8 sub_80A212C(u8 a, u8 b, u8 c)
+{
+ u8 mapObjId;
+ u8 r4;
+ u8 r1;
+
+ if (TryGetFieldObjectIdByLocalIdAndMap(a, b, c, &mapObjId))
+ return 1;
+ r4 = sub_80A21E0();
+ r1 = sub_80A2260(r4, mapObjId);
+ if (r1 == 16)
+ return 1;
+ return sub_80A2370(r4, r1);
+}
+
+void sub_80A2178(void)
+{
+ u8 taskId;
+
+ taskId = sub_80A21E0();
+ if (taskId != 0xFF)
+ {
+ sub_80A2408(taskId);
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_80A2198(u8 priority)
+{
+ u8 taskId;
+ u8 i;
+
+ taskId = CreateTask(Task_80A244C, priority);
+ for (i = 1; i < 16; i++)
+ gTasks[taskId].data[i] = 0xFFFF;
+}
+
+static u8 sub_80A21E0(void)
+{
+ return FindTaskIdByFunc(Task_80A244C);
+}
+
+static bool8 sub_80A21F4(u8 taskId, u8 b, u8 *c)
+{
+ u8 r4;
+
+ r4 = sub_80A2260(taskId, b);
+ if (r4 != 16)
+ {
+ if (sub_80A2370(taskId, r4) == 0)
+ return TRUE;
+ else
+ {
+ sub_80A23C8(taskId, r4, b, c);
+ return FALSE;
+ }
+ }
+ r4 = sub_80A2260(taskId, 0xFF);
+ if (r4 == 16)
+ return TRUE;
+ else
+ {
+ sub_80A23C8(taskId, r4, b, c);
+ return FALSE;
+ }
+}
+
+static u8 sub_80A2260(u8 taskId, u8 b)
+{
+ u8 *ptr;
+ u8 i;
+
+ ptr = (u8 *)&gTasks[taskId].data[1];
+ for (i = 0; i < 16; i++, ptr++)
+ {
+ if (*ptr == b)
+ return i;
+ }
+ return 16;
+}
+
+static void sub_80A229C(u8 taskId, u8 b, u8 **c)
+{
+ u8 i;
+
+ *c = (u8 *)&gTasks[taskId].data[1];
+ for (i = 0; i < b; i++, (*c)++)
+ ;
+}
+
+static void sub_80A22D0(u8 taskId, u8 b, u8 c)
+{
+ u8 *ptr;
+
+ sub_80A229C(taskId, b, &ptr);
+ *ptr = c; //what is this supposed to do?
+}
+
+static void sub_80A22F4(u8 taskId, u8 b, u8 *c)
+{
+ u8 *ptr;
+
+ sub_80A229C(taskId, b, &ptr);
+ *c = *ptr;
+}
+
+static void sub_80A2318(u8 a, u8 b)
+{
+ u16 var = ~gBitTable[b];
+
+ gTasks[a].data[0] &= var;
+}
+
+static void sub_80A2348(u8 taskId, u8 b)
+{
+ gTasks[taskId].data[0] |= gBitTable[b];
+}
+
+static bool8 sub_80A2370(u8 taskId, u8 b)
+{
+ u16 var = (u16)gTasks[taskId].data[0] & gBitTable[b];
+
+ if (var != 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void npc_obj_offscreen_culling_and_flag_update(u8 a, u8 *b)
+{
+ gUnknown_020384F8[a] = b;
+}
+
+static u8 *sub_80A23B8(u8 a)
+{
+ return gUnknown_020384F8[a];
+}
+
+static void sub_80A23C8(u8 taskId, u8 b, u8 c, u8 *d)
+{
+ sub_80A2318(taskId, b);
+ npc_obj_offscreen_culling_and_flag_update(b, d);
+ sub_80A22D0(taskId, b, c);
+}
+
+static void sub_80A2408(u8 a)
+{
+ u8 *ptr;
+ u8 i;
+
+ ptr = (u8 *)&gTasks[a].data[1];
+ for (i = 0; i < 16; i++, ptr++)
+ {
+ if (*ptr != 0xFF)
+ UnfreezeMapObject(&gMapObjects[*ptr]);
+ }
+}
+
+static void Task_80A244C(u8 taskId)
+{
+ u8 i;
+ u8 var;
+
+ for (i = 0; i < 16; i++)
+ {
+ sub_80A22F4(taskId, i, &var);
+ if (var != 0xFF)
+ sub_80A2490(taskId, i, var, sub_80A23B8(i));
+ }
+}
+
+static void sub_80A2490(u8 taskId, u8 b, u8 c, u8 *d)
+{
+ u8 var;
+
+ if (FieldObjectIsSpecialAnimActive(&gMapObjects[c])
+ && !FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[c]))
+ return;
+
+ var = *d;
+ if (var == 0xFE)
+ {
+ sub_80A2348(taskId, b);
+ FreezeMapObject(&gMapObjects[c]);
+ }
+ else
+ {
+ if (!FieldObjectSetSpecialAnim(&gMapObjects[c], var))
+ {
+ d++;
+ npc_obj_offscreen_culling_and_flag_update(b, d);
+ }
+ }
+}