summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorProjectRevoTPP <projectrevotpp@hotmail.com>2016-11-19 01:18:26 -0500
committerYamaArashi <YamaArashi@users.noreply.github.com>2016-11-18 22:18:26 -0800
commit2405562993bcc4f3eda613b0fa443dd94573c5ab (patch)
tree658110fba2a63f5ee7d7babfb00b4c3673d329ff
parent5b4e2d3f18f8c3896503abdebd288cf503fbad1e (diff)
decompile trainer_see.c (#102)
* begin decompiling trainer_see.c * ...actually add the c file you dummy * decompile more of trainer_see.c * finish decompiling trainer_see.c * formatting
-rw-r--r--asm/trainer_see.s1119
-rw-r--r--data/data2.s6
-rw-r--r--include/fieldmap.h20
-rw-r--r--ld_script.txt2
-rw-r--r--src/trainer_see.c404
5 files changed, 419 insertions, 1132 deletions
diff --git a/asm/trainer_see.s b/asm/trainer_see.s
deleted file mode 100644
index 18585ed3a..000000000
--- a/asm/trainer_see.s
+++ /dev/null
@@ -1,1119 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "constants/species_constants.inc"
- .include "asm/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start CheckTrainers
-CheckTrainers: @ 8083FBC
- push {r4,r5,lr}
- movs r4, 0
- ldr r5, _08083FEC @ =gMapObjects
-_08083FC2:
- lsls r0, r4, 3
- adds r0, r4
- lsls r0, 2
- adds r1, r0, r5
- ldrb r0, [r1]
- lsls r0, 31
- cmp r0, 0
- beq _08083FF0
- ldrb r0, [r1, 0x7]
- cmp r0, 0x1
- beq _08083FDC
- cmp r0, 0x3
- bne _08083FF0
-_08083FDC:
- adds r0, r4, 0
- bl CheckTrainer
- lsls r0, 24
- cmp r0, 0
- beq _08083FF0
- movs r0, 0x1
- b _08083FFC
- .align 2, 0
-_08083FEC: .4byte gMapObjects
-_08083FF0:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0xF
- bls _08083FC2
- movs r0, 0
-_08083FFC:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end CheckTrainers
-
- thumb_func_start CheckTrainer
-CheckTrainer: @ 8084004
- push {r4-r7,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- adds r7, r4, 0
- adds r0, r4, 0
- bl GetFieldObjectScriptPointerByFieldObjectId
- adds r6, r0, 0
- bl GetTrainerFlagFromScriptPointer
- cmp r0, 0
- bne _08084034
- lsls r0, r4, 3
- adds r0, r4
- lsls r0, 2
- ldr r1, _08084038 @ =gMapObjects
- adds r5, r0, r1
- adds r0, r5, 0
- bl TrainerCanApproachPlayer
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0
- bne _0808403C
-_08084034:
- movs r0, 0
- b _08084052
- .align 2, 0
-_08084038: .4byte gMapObjects
-_0808403C:
- adds r0, r7, 0
- adds r1, r6, 0
- bl TrainerWantsBattle
- subs r1, r4, 0x1
- lsls r1, 24
- lsrs r1, 24
- adds r0, r5, 0
- bl sub_80842C8
- movs r0, 0x1
-_08084052:
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end CheckTrainer
-
- thumb_func_start TrainerCanApproachPlayer
-TrainerCanApproachPlayer: @ 8084058
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x4
- adds r7, r0, 0
- mov r4, sp
- adds r4, 0x2
- mov r0, sp
- adds r1, r4, 0
- bl PlayerGetDestCoords
- ldrb r0, [r7, 0x7]
- mov r8, r4
- cmp r0, 0x1
- bne _080840B8
- ldr r1, _080840B0 @ =gUnknown_0839B488
- ldrb r0, [r7, 0x18]
- lsls r0, 28
- lsrs r0, 26
- subs r0, 0x4
- adds r0, r1
- ldrb r1, [r7, 0x1D]
- mov r2, sp
- movs r3, 0
- ldrsh r2, [r2, r3]
- movs r5, 0
- ldrsh r3, [r4, r5]
- ldr r4, [r0]
- adds r0, r7, 0
- bl _call_via_r4
- lsls r0, 24
- lsrs r6, r0, 24
- ldrb r2, [r7, 0x18]
- lsls r2, 28
- lsrs r2, 28
- adds r0, r7, 0
- adds r1, r6, 0
- bl CheckPathBetweenTrainerAndPlayer
- lsls r0, 24
- lsrs r0, 24
- b _080840F8
- .align 2, 0
-_080840B0: .4byte gUnknown_0839B488
-_080840B4:
- adds r0, r6, 0
- b _080840F8
-_080840B8:
- movs r5, 0
-_080840BA:
- ldr r0, _08084104 @ =gUnknown_0839B488
- lsls r4, r5, 2
- adds r4, r0
- ldrb r1, [r7, 0x1D]
- mov r0, sp
- movs r6, 0
- ldrsh r2, [r0, r6]
- mov r0, r8
- movs r6, 0
- ldrsh r3, [r0, r6]
- ldr r4, [r4]
- adds r0, r7, 0
- bl _call_via_r4
- lsls r0, 24
- lsrs r6, r0, 24
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- adds r0, r7, 0
- adds r1, r6, 0
- adds r2, r4, 0
- bl CheckPathBetweenTrainerAndPlayer
- lsls r0, 24
- cmp r0, 0
- bne _080840B4
- adds r5, r4, 0
- cmp r5, 0x3
- bls _080840BA
- movs r0, 0
-_080840F8:
- add sp, 0x4
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_08084104: .4byte gUnknown_0839B488
- thumb_func_end TrainerCanApproachPlayer
-
- thumb_func_start IsTrainerInRangeSouth
-IsTrainerInRangeSouth: @ 8084108
- push {r4-r6,lr}
- adds r4, r0, 0
- lsls r1, 16
- lsrs r6, r1, 16
- lsls r3, 16
- lsrs r5, r3, 16
- movs r1, 0x10
- ldrsh r0, [r4, r1]
- lsls r2, 16
- asrs r2, 16
- cmp r0, r2
- bne _08084142
- lsls r0, r5, 16
- asrs r2, r0, 16
- ldrh r3, [r4, 0x12]
- movs r1, 0x12
- ldrsh r0, [r4, r1]
- cmp r2, r0
- ble _08084142
- adds r1, r0, 0
- lsls r0, r6, 16
- asrs r0, 16
- adds r1, r0
- cmp r2, r1
- bgt _08084142
- subs r0, r5, r3
- lsls r0, 24
- lsrs r0, 24
- b _08084144
-_08084142:
- movs r0, 0
-_08084144:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end IsTrainerInRangeSouth
-
- thumb_func_start IsTrainerInRangeNorth
-IsTrainerInRangeNorth: @ 808414C
- push {r4-r6,lr}
- adds r4, r0, 0
- lsls r1, 16
- lsrs r6, r1, 16
- lsls r3, 16
- lsrs r5, r3, 16
- movs r1, 0x10
- ldrsh r0, [r4, r1]
- lsls r2, 16
- asrs r2, 16
- cmp r0, r2
- bne _08084186
- lsls r0, r5, 16
- asrs r2, r0, 16
- ldrh r3, [r4, 0x12]
- movs r1, 0x12
- ldrsh r0, [r4, r1]
- cmp r2, r0
- bge _08084186
- adds r1, r0, 0
- lsls r0, r6, 16
- asrs r0, 16
- subs r1, r0
- cmp r2, r1
- blt _08084186
- subs r0, r3, r5
- lsls r0, 24
- lsrs r0, 24
- b _08084188
-_08084186:
- movs r0, 0
-_08084188:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end IsTrainerInRangeNorth
-
- thumb_func_start IsTrainerInRangeWest
-IsTrainerInRangeWest: @ 8084190
- push {r4-r6,lr}
- adds r4, r0, 0
- lsls r1, 16
- lsrs r6, r1, 16
- lsls r2, 16
- lsrs r5, r2, 16
- movs r1, 0x12
- ldrsh r0, [r4, r1]
- lsls r3, 16
- asrs r3, 16
- cmp r0, r3
- bne _080841CA
- lsls r0, r5, 16
- asrs r3, r0, 16
- ldrh r2, [r4, 0x10]
- movs r1, 0x10
- ldrsh r0, [r4, r1]
- cmp r3, r0
- bge _080841CA
- adds r1, r0, 0
- lsls r0, r6, 16
- asrs r0, 16
- subs r1, r0
- cmp r3, r1
- blt _080841CA
- subs r0, r2, r5
- lsls r0, 24
- lsrs r0, 24
- b _080841CC
-_080841CA:
- movs r0, 0
-_080841CC:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end IsTrainerInRangeWest
-
- thumb_func_start IsTrainerInRangeEast
-IsTrainerInRangeEast: @ 80841D4
- push {r4-r6,lr}
- adds r4, r0, 0
- lsls r1, 16
- lsrs r6, r1, 16
- lsls r2, 16
- lsrs r5, r2, 16
- movs r1, 0x12
- ldrsh r0, [r4, r1]
- lsls r3, 16
- asrs r3, 16
- cmp r0, r3
- bne _0808420E
- lsls r0, r5, 16
- asrs r3, r0, 16
- ldrh r2, [r4, 0x10]
- movs r1, 0x10
- ldrsh r0, [r4, r1]
- cmp r3, r0
- ble _0808420E
- adds r1, r0, 0
- lsls r0, r6, 16
- asrs r0, 16
- adds r1, r0
- cmp r3, r1
- bgt _0808420E
- subs r0, r5, r2
- lsls r0, 24
- lsrs r0, 24
- b _08084210
-_0808420E:
- movs r0, 0
-_08084210:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end IsTrainerInRangeEast
-
- thumb_func_start CheckPathBetweenTrainerAndPlayer
-CheckPathBetweenTrainerAndPlayer: @ 8084218
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- sub sp, 0x4
- adds r6, r0, 0
- lsls r1, 24
- lsrs r1, 24
- mov r9, r1
- lsls r2, 24
- lsrs r7, r2, 24
- cmp r1, 0
- beq _080842B2
- ldrh r1, [r6, 0x10]
- mov r0, sp
- strh r1, [r0]
- ldrh r0, [r6, 0x12]
- mov r1, sp
- adds r1, 0x2
- strh r0, [r1]
- movs r4, 0
- mov r8, r1
- mov r5, r9
- subs r5, 0x1
- cmp r4, r5
- bgt _08084284
-_0808424C:
- mov r0, sp
- movs r2, 0
- ldrsh r1, [r0, r2]
- mov r3, r8
- movs r0, 0
- ldrsh r2, [r3, r0]
- adds r0, r6, 0
- adds r3, r7, 0
- bl sub_8060024
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0
- beq _08084270
- movs r0, 0x1
- ands r1, r0
- cmp r1, 0
- bne _080842B2
-_08084270:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- adds r0, r7, 0
- mov r1, sp
- mov r2, r8
- bl MoveCoords
- cmp r4, r5
- ble _0808424C
-_08084284:
- ldrb r4, [r6, 0x19]
- lsls r5, r4, 28
- lsrs r5, 28
- lsrs r4, 4
- movs r0, 0
- strb r0, [r6, 0x19]
- mov r0, sp
- movs r2, 0
- ldrsh r1, [r0, r2]
- mov r3, r8
- movs r0, 0
- ldrsh r2, [r3, r0]
- adds r0, r6, 0
- adds r3, r7, 0
- bl npc_block_way
- lsls r0, 24
- lsrs r1, r0, 24
- lsls r4, 4
- orrs r5, r4
- strb r5, [r6, 0x19]
- cmp r1, 0x4
- beq _080842B6
-_080842B2:
- movs r0, 0
- b _080842B8
-_080842B6:
- mov r0, r9
-_080842B8:
- add sp, 0x4
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end CheckPathBetweenTrainerAndPlayer
-
- thumb_func_start sub_80842C8
-sub_80842C8: @ 80842C8
- push {r4,r5,lr}
- adds r5, r0, 0
- lsls r4, r1, 24
- lsrs r4, 24
- ldr r0, _080842F4 @ =sub_808433C
- movs r1, 0x50
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- ldr r0, _080842F8 @ =gTasks
- adds r1, r0
- lsrs r0, r5, 16
- strh r0, [r1, 0xA]
- strh r5, [r1, 0xC]
- strh r4, [r1, 0xE]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080842F4: .4byte sub_808433C
-_080842F8: .4byte gTasks
- thumb_func_end sub_80842C8
-
- thumb_func_start sub_80842FC
-sub_80842FC: @ 80842FC
- push {r4-r6,lr}
- adds r6, r0, 0
- ldr r5, _08084334 @ =sub_808433C
- adds r0, r5, 0
- bl FindTaskIdByFunc
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- adds r0, r4, 0
- adds r1, r5, 0
- adds r2, r6, 0
- bl SetTaskFuncWithFollowupFunc
- ldr r1, _08084338 @ =gTasks
- lsls r0, r4, 2
- adds r0, r4
- lsls r0, 3
- adds r0, r1
- movs r1, 0x1
- strh r1, [r0, 0x8]
- adds r0, r4, 0
- bl _call_via_r5
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08084334: .4byte sub_808433C
-_08084338: .4byte gTasks
- thumb_func_end sub_80842FC
-
- thumb_func_start sub_808433C
-sub_808433C: @ 808433C
- push {r4-r7,lr}
- lsls r0, 24
- lsrs r6, r0, 24
- lsls r0, r6, 2
- adds r0, r6
- lsls r0, 3
- ldr r1, _08084368 @ =gTasks
- adds r4, r0, r1
- movs r1, 0xA
- ldrsh r0, [r4, r1]
- lsls r5, r0, 16
- movs r1, 0xC
- ldrsh r0, [r4, r1]
- orrs r5, r0
- ldrb r0, [r5]
- lsls r0, 31
- cmp r0, 0
- bne _0808436C
- adds r0, r6, 0
- bl SwitchTaskToFollowupFunc
- b _08084388
- .align 2, 0
-_08084368: .4byte gTasks
-_0808436C:
- ldr r7, _08084390 @ =gUnknown_0839B498
-_0808436E:
- movs r1, 0x8
- ldrsh r0, [r4, r1]
- lsls r0, 2
- adds r0, r7
- ldr r3, [r0]
- adds r0, r6, 0
- adds r1, r4, 0
- adds r2, r5, 0
- bl _call_via_r3
- lsls r0, 24
- cmp r0, 0
- bne _0808436E
-_08084388:
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08084390: .4byte gUnknown_0839B498
- thumb_func_end sub_808433C
-
- thumb_func_start sub_8084394
-sub_8084394: @ 8084394
- movs r0, 0
- bx lr
- thumb_func_end sub_8084394
-
- thumb_func_start sub_8084398
-sub_8084398: @ 8084398
- push {r4,r5,lr}
- adds r5, r1, 0
- adds r4, r2, 0
- ldr r1, _080843D8 @ =gUnknown_0202FF84
- adds r2, r1, 0x4
- adds r3, r1, 0
- adds r3, 0x8
- adds r0, r4, 0
- bl FieldObjectGetLocalIdAndMap
- movs r0, 0
- bl FieldEffectStart
- ldrb r0, [r4, 0x18]
- lsls r0, 28
- lsrs r0, 28
- bl GetFaceDirectionAnimId
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl FieldObjectSetSpecialAnim
- ldrh r0, [r5, 0x8]
- adds r0, 0x1
- strh r0, [r5, 0x8]
- movs r0, 0x1
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_080843D8: .4byte gUnknown_0202FF84
- thumb_func_end sub_8084398
-
- thumb_func_start sub_80843DC
-sub_80843DC: @ 80843DC
- push {r4,r5,lr}
- adds r4, r1, 0
- adds r5, r2, 0
- movs r0, 0
- bl FieldEffectActiveListContains
- lsls r0, 24
- cmp r0, 0
- beq _080843F2
- movs r0, 0
- b _08084414
-_080843F2:
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- ldrb r0, [r5, 0x6]
- subs r0, 0x39
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bhi _08084408
- movs r0, 0x6
- strh r0, [r4, 0x8]
-_08084408:
- ldrb r0, [r5, 0x6]
- cmp r0, 0x3F
- bne _08084412
- movs r0, 0x8
- strh r0, [r4, 0x8]
-_08084412:
- movs r0, 0x1
-_08084414:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_80843DC
-
- thumb_func_start sub_808441C
-sub_808441C: @ 808441C
- push {r4,r5,lr}
- adds r5, r1, 0
- adds r4, r2, 0
- adds r0, r4, 0
- bl FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive
- lsls r0, 24
- cmp r0, 0
- beq _0808443A
- adds r0, r4, 0
- bl FieldObjectClearAnimIfSpecialAnimFinished
- lsls r0, 24
- cmp r0, 0
- beq _0808446E
-_0808443A:
- movs r1, 0xE
- ldrsh r0, [r5, r1]
- cmp r0, 0
- beq _08084460
- ldrb r0, [r4, 0x18]
- lsls r0, 28
- lsrs r0, 28
- bl GetGoSpeed0AnimId
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl FieldObjectSetSpecialAnim
- ldrh r0, [r5, 0xE]
- subs r0, 0x1
- strh r0, [r5, 0xE]
- b _0808446E
-_08084460:
- adds r0, r4, 0
- movs r1, 0x3E
- bl FieldObjectSetSpecialAnim
- ldrh r0, [r5, 0x8]
- adds r0, 0x1
- strh r0, [r5, 0x8]
-_0808446E:
- movs r0, 0
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_808441C
-
- thumb_func_start sub_8084478
-sub_8084478: @ 8084478
- push {r4-r6,lr}
- adds r6, r1, 0
- adds r5, r2, 0
- adds r0, r5, 0
- bl FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive
- lsls r0, 24
- cmp r0, 0
- beq _08084496
- adds r0, r5, 0
- bl FieldObjectClearAnimIfSpecialAnimFinished
- lsls r0, 24
- cmp r0, 0
- beq _08084524
-_08084496:
- ldrb r0, [r5, 0x18]
- lsls r0, 28
- lsrs r0, 28
- bl npc_running_behaviour_by_direction
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r5, 0
- bl npc_set_running_behaviour_etc
- ldrb r0, [r5, 0x18]
- lsls r0, 28
- lsrs r0, 28
- bl npc_running_behaviour_by_direction
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r5, 0
- bl sub_805C774
- adds r0, r5, 0
- bl sub_805C754
- ldr r0, _0808452C @ =gPlayerAvatar
- ldrb r1, [r0, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08084530 @ =gMapObjects
- adds r4, r0, r1
- adds r0, r4, 0
- bl FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive
- lsls r0, 24
- cmp r0, 0
- beq _080844EE
- adds r0, r4, 0
- bl FieldObjectClearAnimIfSpecialAnimFinished
- lsls r0, 24
- cmp r0, 0
- beq _08084524
-_080844EE:
- bl sub_80597E8
- ldr r0, _0808452C @ =gPlayerAvatar
- ldrb r0, [r0, 0x5]
- lsls r4, r0, 3
- adds r4, r0
- lsls r4, 2
- ldr r0, _08084530 @ =gMapObjects
- adds r4, r0
- ldrb r0, [r5, 0x18]
- lsls r0, 28
- lsrs r0, 28
- bl GetOppositeDirection
- lsls r0, 24
- lsrs r0, 24
- bl GetFaceDirectionAnimId
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl FieldObjectSetSpecialAnim
- ldrh r0, [r6, 0x8]
- adds r0, 0x1
- strh r0, [r6, 0x8]
-_08084524:
- movs r0, 0
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_0808452C: .4byte gPlayerAvatar
-_08084530: .4byte gMapObjects
- thumb_func_end sub_8084478
-
- thumb_func_start sub_8084534
-sub_8084534: @ 8084534
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r5, r0, 24
- ldr r0, _08084570 @ =gPlayerAvatar
- ldrb r1, [r0, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08084574 @ =gMapObjects
- adds r4, r0, r1
- adds r0, r4, 0
- bl FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive
- lsls r0, 24
- cmp r0, 0
- beq _08084560
- adds r0, r4, 0
- bl FieldObjectClearAnimIfSpecialAnimFinished
- lsls r0, 24
- cmp r0, 0
- beq _08084566
-_08084560:
- adds r0, r5, 0
- bl SwitchTaskToFollowupFunc
-_08084566:
- movs r0, 0
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_08084570: .4byte gPlayerAvatar
-_08084574: .4byte gMapObjects
- thumb_func_end sub_8084534
-
- thumb_func_start sub_8084578
-sub_8084578: @ 8084578
- push {r4,r5,lr}
- adds r5, r1, 0
- adds r4, r2, 0
- adds r0, r4, 0
- bl FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive
- lsls r0, 24
- cmp r0, 0
- beq _08084596
- adds r0, r4, 0
- bl FieldObjectClearAnimIfSpecialAnimFinished
- lsls r0, 24
- cmp r0, 0
- beq _080845A4
-_08084596:
- adds r0, r4, 0
- movs r1, 0x59
- bl FieldObjectSetSpecialAnim
- ldrh r0, [r5, 0x8]
- adds r0, 0x1
- strh r0, [r5, 0x8]
-_080845A4:
- movs r0, 0
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_8084578
-
- thumb_func_start sub_80845AC
-sub_80845AC: @ 80845AC
- push {r4,lr}
- adds r4, r1, 0
- adds r0, r2, 0
- bl FieldObjectClearAnimIfSpecialAnimFinished
- lsls r0, 24
- cmp r0, 0
- beq _080845C0
- movs r0, 0x3
- strh r0, [r4, 0x8]
-_080845C0:
- movs r0, 0
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_80845AC
-
- thumb_func_start sub_80845C8
-sub_80845C8: @ 80845C8
- push {r4,r5,lr}
- adds r5, r1, 0
- adds r4, r2, 0
- adds r0, r4, 0
- bl FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive
- lsls r0, 24
- cmp r0, 0
- beq _080845E6
- adds r0, r4, 0
- bl FieldObjectClearAnimIfSpecialAnimFinished
- lsls r0, 24
- cmp r0, 0
- beq _080845F4
-_080845E6:
- adds r0, r4, 0
- movs r1, 0x3E
- bl FieldObjectSetSpecialAnim
- ldrh r0, [r5, 0x8]
- adds r0, 0x1
- strh r0, [r5, 0x8]
-_080845F4:
- movs r0, 0
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_80845C8
-
- thumb_func_start sub_80845FC
-sub_80845FC: @ 80845FC
- push {r4,r5,lr}
- adds r5, r1, 0
- adds r4, r2, 0
- adds r0, r4, 0
- bl FieldObjectCheckIfSpecialAnimFinishedOrInactive
- lsls r0, 24
- cmp r0, 0
- beq _08084642
- ldr r2, _0808464C @ =gUnknown_0202FF84
- movs r1, 0x10
- ldrsh r0, [r4, r1]
- str r0, [r2]
- movs r1, 0x12
- ldrsh r0, [r4, r1]
- str r0, [r2, 0x4]
- ldr r3, _08084650 @ =gSprites
- ldrb r1, [r4, 0x4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r3
- adds r0, 0x43
- ldrb r0, [r0]
- subs r0, 0x1
- str r0, [r2, 0x8]
- movs r0, 0x2
- str r0, [r2, 0xC]
- movs r0, 0x31
- bl FieldEffectStart
- strh r0, [r5, 0x10]
- ldrh r0, [r5, 0x8]
- adds r0, 0x1
- strh r0, [r5, 0x8]
-_08084642:
- movs r0, 0
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_0808464C: .4byte gUnknown_0202FF84
-_08084650: .4byte gSprites
- thumb_func_end sub_80845FC
-
- thumb_func_start sub_8084654
-sub_8084654: @ 8084654
- push {r4,r5,lr}
- adds r5, r1, 0
- adds r4, r2, 0
- ldr r2, _080846C4 @ =gSprites
- movs r1, 0x10
- ldrsh r0, [r5, r1]
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- adds r1, r2
- adds r1, 0x2B
- ldrb r0, [r1]
- cmp r0, 0x2
- bne _080846BC
- ldrb r1, [r4, 0x3]
- movs r0, 0x5
- negs r0, r0
- ands r0, r1
- strb r0, [r4, 0x3]
- ldrb r0, [r4]
- movs r1, 0x4
- orrs r0, r1
- strb r0, [r4]
- ldrb r1, [r4, 0x4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r2
- ldrb r2, [r0, 0x5]
- movs r1, 0xD
- negs r1, r1
- ands r1, r2
- movs r2, 0x8
- orrs r1, r2
- strb r1, [r0, 0x5]
- adds r0, r4, 0
- bl FieldObjectClearAnimIfSpecialAnimFinished
- ldrb r0, [r4, 0x18]
- lsls r0, 28
- lsrs r0, 28
- bl sub_806084C
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl FieldObjectSetSpecialAnim
- ldrh r0, [r5, 0x8]
- adds r0, 0x1
- strh r0, [r5, 0x8]
-_080846BC:
- movs r0, 0
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_080846C4: .4byte gSprites
- thumb_func_end sub_8084654
-
- thumb_func_start sub_80846C8
-sub_80846C8: @ 80846C8
- push {r4,lr}
- adds r4, r1, 0
- movs r0, 0x31
- bl FieldEffectActiveListContains
- lsls r0, 24
- cmp r0, 0
- bne _080846DC
- movs r0, 0x3
- strh r0, [r4, 0x8]
-_080846DC:
- movs r0, 0
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_80846C8
-
- thumb_func_start sub_80846E4
-sub_80846E4: @ 80846E4
- push {r4,r5,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r0, 24
- adds r5, r0, 0
- lsls r0, r5, 2
- adds r0, r5
- lsls r0, 3
- ldr r1, _08084778 @ =gTasks
- adds r4, r0, r1
- adds r0, r4, 0
- adds r0, 0xA
- mov r1, sp
- bl LoadWordFromTwoHalfwords
- movs r1, 0x16
- ldrsh r0, [r4, r1]
- cmp r0, 0
- bne _08084716
- ldr r0, [sp]
- bl FieldObjectClearAnim
- ldrh r0, [r4, 0x16]
- adds r0, 0x1
- strh r0, [r4, 0x16]
-_08084716:
- ldr r1, _0808477C @ =gUnknown_0839B4C8
- movs r2, 0x8
- ldrsh r0, [r4, r2]
- lsls r0, 2
- adds r0, r1
- ldr r2, [sp]
- ldr r3, [r0]
- adds r0, r5, 0
- adds r1, r4, 0
- bl _call_via_r3
- movs r1, 0x8
- ldrsh r0, [r4, r1]
- cmp r0, 0x3
- bne _08084780
- movs r0, 0x31
- bl FieldEffectActiveListContains
- lsls r0, 24
- cmp r0, 0
- bne _08084780
- ldr r4, [sp]
- ldrb r0, [r4, 0x18]
- lsls r0, 28
- lsrs r0, 28
- bl npc_running_behaviour_by_direction
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl npc_set_running_behaviour_etc
- ldr r4, [sp]
- ldrb r0, [r4, 0x18]
- lsls r0, 28
- lsrs r0, 28
- bl npc_running_behaviour_by_direction
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl sub_805C774
- adds r0, r5, 0
- bl DestroyTask
- b _0808478A
- .align 2, 0
-_08084778: .4byte gTasks
-_0808477C: .4byte gUnknown_0839B4C8
-_08084780:
- ldr r2, [sp]
- ldrb r1, [r2]
- movs r0, 0x7F
- ands r0, r1
- strb r0, [r2]
-_0808478A:
- add sp, 0x4
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_80846E4
-
- thumb_func_start sub_8084794
-sub_8084794: @ 8084794
- push {r4,lr}
- adds r4, r0, 0
- ldr r0, _080847C0 @ =sub_80846E4
- movs r1, 0
- bl CreateTask
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 3
- ldr r1, _080847C4 @ =gTasks + 0x8
- adds r0, r1
- adds r0, 0x2
- adds r1, r4, 0
- bl StoreWordInTwoHalfwords
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080847C0: .4byte sub_80846E4
-_080847C4: .4byte gTasks + 0x8
- thumb_func_end sub_8084794
-
- thumb_func_start sub_80847C8
-sub_80847C8: @ 80847C8
- push {lr}
- ldr r0, _080847D4 @ =sub_80847D8
- bl sub_80842FC
- pop {r0}
- bx r0
- .align 2, 0
-_080847D4: .4byte sub_80847D8
- thumb_func_end sub_80847C8
-
- thumb_func_start sub_80847D8
-sub_80847D8: @ 80847D8
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
- bl EnableBothScriptContexts
- pop {r0}
- bx r0
- thumb_func_end sub_80847D8
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/data/data2.s b/data/data2.s
index e5dd9110f..35121b3de 100644
--- a/data/data2.s
+++ b/data/data2.s
@@ -11118,14 +11118,14 @@ gSpriteImage_839B408:: @ 839B408
.incbin "graphics/unknown_sprites/839B408.4bpp"
.align 2
-gUnknown_0839B488:: @ 839B488
+gIsTrainerInRange:: @ 839B488
.4byte IsTrainerInRangeSouth
.4byte IsTrainerInRangeNorth
.4byte IsTrainerInRangeWest
.4byte IsTrainerInRangeEast
.align 2
-gUnknown_0839B498:: @ 839B498
+gTrainerSeeFuncList:: @ 839B498
.4byte sub_8084394
.4byte sub_8084398
.4byte sub_80843DC
@@ -11140,7 +11140,7 @@ gUnknown_0839B498:: @ 839B498
.4byte sub_80846C8
.align 2
-gUnknown_0839B4C8:: @ 839B4C8
+gTrainerSeeFuncList2:: @ 839B4C8
.4byte sub_80845C8
.4byte sub_80845FC
.4byte sub_8084654
diff --git a/include/fieldmap.h b/include/fieldmap.h
index bd28f752a..66408c43b 100644
--- a/include/fieldmap.h
+++ b/include/fieldmap.h
@@ -166,13 +166,15 @@ struct MapObject
/*0x10*/ struct Coords16 coords2;
/*0x14*/ struct Coords16 coords3;
/*0x18*/ u8 mapobj_unk_18:4;
- /*0x19*/ u8 mapobj_unk_19;
+ /*0x18*/ u8 placeholder18:4;
+ /*0x19*/ u8 mapobj_unk_19:4;
+ /*0x19*/ u8 mapobj_unk_19b:4;
/*0x1A*/ u8 mapobj_unk_1A;
/*0x1B*/ u8 mapobj_unk_1B;
/*0x1C*/ u8 mapobj_unk_1C;
/*0x1D*/ u8 trainerRange_berryTreeId;
- /*0x1E*/ u8 mapobj_unk_1E;
- /*0x1E*/ u8 mapobj_unk_1F;
+ /*0x1E */ u8 mapobj_unk_1E;
+ /*0x1F*/ u8 mapobj_unk_1F;
/*0x20*/ u8 mapobj_unk_20;
/*0x21*/ u8 mapobj_unk_21;
/*size = 0x24*/
@@ -200,12 +202,12 @@ struct MapObjectGraphicsInfo
struct PlayerAvatar
{
- u8 bitfield;
- u8 bike;
- u8 running2;
- u8 running1;
- u8 spriteId;
- u8 mapObjectId;
+ /* 0x00 */ u8 bitfield;
+ /* 0x01 */ u8 bike;
+ /* 0x02 */ u8 running2;
+ /* 0x03 */ u8 running1;
+ /* 0x04 */ u8 spriteId;
+ /* 0x05 */ u8 mapObjectId;
// TODO: rest of struct
};
diff --git a/ld_script.txt b/ld_script.txt
index c5fbd3bfc..7580985b8 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -100,7 +100,7 @@ SECTIONS {
src/battle_setup.o(.text);
asm/cable_club.o(.text);
src/mori_debug_menu.o(.text);
- asm/trainer_see.o(.text);
+ src/trainer_see.o(.text);
src/fldeff_emotion.o(.text);
src/wild_encounter.o(.text);
src/field_effect.o(.text);
diff --git a/src/trainer_see.c b/src/trainer_see.c
new file mode 100644
index 000000000..57a53634a
--- /dev/null
+++ b/src/trainer_see.c
@@ -0,0 +1,404 @@
+#include "global.h"
+#include "fieldmap.h"
+#include "task.h"
+#include "sprite.h"
+
+extern u8 * GetFieldObjectScriptPointerByFieldObjectId(u8);
+extern u8 * GetTrainerFlagFromScriptPointer(u8 *);
+extern u8 TrainerCanApproachPlayer(struct MapObject *);
+extern u8 sub_8060024(struct MapObject *, s16, s16, u8);
+extern u8 npc_block_way(struct MapObject *, s16, s16, u8);
+extern u8 npc_running_behaviour_by_direction(u8);
+extern u8 GetGoSpeed0AnimId(u8);
+extern u8 GetOppositeDirection(u8);
+extern u8 GetFaceDirectionAnimId(u8);
+extern bool8 FieldEffectActiveListContains(u8);
+extern bool8 FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(struct MapObject *);
+extern bool8 FieldObjectCheckIfSpecialAnimFinishedOrInactive(struct MapObject *);
+extern bool8 FieldObjectClearAnimIfSpecialAnimFinished(struct MapObject *);
+extern void FieldObjectClearAnim(struct MapObject *);
+extern void TrainerWantsBattle(u8, u8 *);
+extern void FieldObjectSetSpecialAnim(struct MapObject *, u8);
+extern void LoadWordFromTwoHalfwords(u32, u8 *);
+extern void StoreWordInTwoHalfwords(u32, u8 *);
+
+extern void sub_80842FC(void (*func)(u8));
+
+extern bool8 (*gIsTrainerInRange[])(struct MapObject *, u16, s16, s16);
+extern bool8 (*gTrainerSeeFuncList[])(u8, struct Task *, struct MapObject *);
+extern bool8 (*gTrainerSeeFuncList2[])(u8, struct Task *, struct MapObject *);
+
+extern u32 gUnknown_0202FF84[];
+
+bool8 CheckTrainer(u8);
+bool8 CheckPathBetweenTrainerAndPlayer(struct MapObject *, u8, u8);
+void sub_80842C8(struct MapObject *, u8);
+void RunTrainerSeeFuncList(u8);
+void sub_80847D8(u8);
+
+bool8 CheckTrainers(void)
+{
+ u8 i;
+
+ for(i = 0; i < 16; i++)
+ {
+ if ( gMapObjects[i].active )
+ if ( gMapObjects[i].trainerType == 1 || gMapObjects[i].trainerType == 3 )
+ if ( CheckTrainer(i) )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 CheckTrainer(u8 trainer)
+{
+ u8 *scriptPtr = GetFieldObjectScriptPointerByFieldObjectId(trainer);
+
+ if(GetTrainerFlagFromScriptPointer(scriptPtr))
+ return FALSE;
+ else
+ {
+ struct MapObject *trainerObj = &gMapObjects[trainer];
+ u8 canApproach = TrainerCanApproachPlayer(trainerObj);
+
+ if(canApproach != 0)
+ {
+ TrainerWantsBattle(trainer, scriptPtr);
+ sub_80842C8(trainerObj, (canApproach - 1));
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+}
+
+bool8 TrainerCanApproachPlayer(struct MapObject *trainerObj)
+{
+ s16 x, y;
+ u8 i;
+ u8 playerCoord;
+
+ PlayerGetDestCoords(&x, &y);
+ if ( trainerObj->trainerType == 1 ) // trainers that don't spin
+ {
+ playerCoord = gIsTrainerInRange[trainerObj->mapobj_unk_18 - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y);
+ return CheckPathBetweenTrainerAndPlayer(trainerObj, playerCoord, trainerObj->mapobj_unk_18);
+ }
+ else // spinners
+ {
+ for(i = 0; i < 4; i++)
+ {
+ playerCoord = gIsTrainerInRange[i](trainerObj, trainerObj->trainerRange_berryTreeId, x, y);
+ if ( CheckPathBetweenTrainerAndPlayer(trainerObj, playerCoord, i + 1) ) // directions are 1-4 instead of 0-3. south north west east
+ return playerCoord;
+ }
+ return FALSE;
+ }
+}
+
+bool8 IsTrainerInRangeSouth(struct MapObject *trainerObj, s16 vision, s16 x, s16 y)
+{
+ if ( trainerObj->coords2.x == x
+ && y > trainerObj->coords2.y
+ && y <= trainerObj->coords2.y + vision )
+ return (y - trainerObj->coords2.y);
+ else
+ return FALSE;
+}
+
+bool8 IsTrainerInRangeNorth(struct MapObject *trainerObj, s16 vision, s16 x, s16 y)
+{
+ if ( trainerObj->coords2.x == x
+ && y < trainerObj->coords2.y
+ && y >= trainerObj->coords2.y - vision )
+ return (trainerObj->coords2.y - y);
+ else
+ return FALSE;
+}
+
+bool8 IsTrainerInRangeWest(struct MapObject *trainerObj, s16 vision, s16 x, s16 y)
+{
+ if ( trainerObj->coords2.y == y
+ && x < trainerObj->coords2.x
+ && x >= trainerObj->coords2.x - vision )
+ return (trainerObj->coords2.x - x);
+ else
+ return FALSE;
+}
+
+bool8 IsTrainerInRangeEast(struct MapObject *trainerObj, s16 vision, s16 x, s16 y)
+{
+ if ( trainerObj->coords2.y == y
+ && x > trainerObj->coords2.x
+ && x <= trainerObj->coords2.x + vision )
+ return (x - trainerObj->coords2.x);
+ else
+ return FALSE;
+}
+
+bool8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 playerCoord, u8 direction)
+{
+ s16 x, y;
+ u8 unk19_temp;
+ u8 unk19b_temp;
+ u8 i;
+ u8 var;
+
+ if ( !playerCoord )
+ return FALSE;
+
+ x = trainerObj->coords2.x;
+ y = trainerObj->coords2.y;
+
+ for(i = 0; i <= playerCoord - 1;)
+ {
+ var = sub_8060024(trainerObj, x, y, direction);
+
+ if (var != 0 && (var & 1) != 0 )
+ return FALSE;
+
+ i++;
+ MoveCoords(direction, &x, &y);
+ }
+
+ // preserve mapobj_unk_19 before clearing.
+ unk19_temp = trainerObj->mapobj_unk_19;
+ unk19b_temp = trainerObj->mapobj_unk_19b;
+ trainerObj->mapobj_unk_19 = 0;
+ trainerObj->mapobj_unk_19b = 0;
+
+ var = npc_block_way(trainerObj, x, y, direction);
+
+ trainerObj->mapobj_unk_19 = unk19_temp;
+ trainerObj->mapobj_unk_19b = unk19b_temp;
+ if ( var == 4 )
+ return playerCoord;
+
+ return FALSE;
+}
+
+void sub_80842C8(struct MapObject *trainerObj, u8 taskId)
+{
+ struct Task *task = &gTasks[CreateTask(RunTrainerSeeFuncList, 0x50)];
+
+ task->data[1] = (u32)(trainerObj) >> 16;
+ task->data[2] = (u32)(trainerObj);
+ task->data[3] = taskId;
+}
+
+void sub_80842FC(TaskFunc func)
+{
+ TaskFunc func2 = RunTrainerSeeFuncList;
+ u8 taskId = FindTaskIdByFunc(func2);
+
+ SetTaskFuncWithFollowupFunc(taskId, RunTrainerSeeFuncList, func);
+ gTasks[taskId].data[0] = 1;
+ func2(taskId);
+}
+
+void RunTrainerSeeFuncList(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ struct MapObject *trainerObj = (task->data[1] << 16) | (task->data[2]);
+
+ if (!trainerObj->active)
+ SwitchTaskToFollowupFunc(taskId);
+ else
+ while (gTrainerSeeFuncList[task->data[0]](taskId, task, trainerObj));
+}
+
+u8 sub_8084394() // cant be void because it is called with RunTrainerSeeFuncList with arguments.
+{
+ return 0;
+}
+
+s8 sub_8084398(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ u8 direction;
+
+ FieldObjectGetLocalIdAndMap(trainerObj, &gUnknown_0202FF84[0], &gUnknown_0202FF84[1], &gUnknown_0202FF84[2]);
+ FieldEffectStart(0);
+
+ direction = GetFaceDirectionAnimId(trainerObj->mapobj_unk_18);
+
+ FieldObjectSetSpecialAnim(trainerObj, direction);
+ task->data[0]++;
+ return 1;
+}
+
+s8 sub_80843DC(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ if (FieldEffectActiveListContains(0))
+ return 0;
+ else
+ {
+ task->data[0]++;
+ if ((u8)(trainerObj->animPattern - 57) <= 1)
+ task->data[0] = 6;
+ if (trainerObj->animPattern == 63)
+ task->data[0] = 8;
+ return 1;
+ }
+}
+
+s8 sub_808441C(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ if (!(FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)) || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
+ {
+ if(task->data[3])
+ {
+ FieldObjectSetSpecialAnim(trainerObj, GetGoSpeed0AnimId(trainerObj->mapobj_unk_18));
+ task->data[3]--;
+ }
+ else
+ {
+ FieldObjectSetSpecialAnim(trainerObj, 0x3E);
+ task->data[0]++;
+ }
+ }
+ return 0;
+}
+
+s8 sub_8084478(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ struct MapObject *playerObj;
+
+ if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) && !FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
+ return 0;
+
+ npc_set_running_behaviour_etc(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18));
+ sub_805C774(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18));
+ sub_805C754(trainerObj);
+
+ playerObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+ if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj)
+ && !FieldObjectClearAnimIfSpecialAnimFinished(playerObj))
+ return 0;
+
+ sub_80597E8();
+ FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], GetFaceDirectionAnimId(GetOppositeDirection(trainerObj->mapobj_unk_18)));
+ task->data[0]++;
+ return 0;
+}
+
+s8 sub_8084534(u8 taskId, struct Task *task, struct MapObject *trainerObj) // technically only 1 parameter, but needs all 3 for TrainerSeeFuncList call.
+{
+ struct MapObject *playerObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+
+ if ( !FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj)
+ || FieldObjectClearAnimIfSpecialAnimFinished(playerObj) )
+ SwitchTaskToFollowupFunc(taskId);
+
+ return 0;
+}
+
+s8 sub_8084578(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ if(!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)
+ || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
+ {
+ FieldObjectSetSpecialAnim(trainerObj, 0x59);
+ task->data[0]++;
+ }
+ return 0;
+}
+
+s8 sub_80845AC(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ if ( FieldObjectClearAnimIfSpecialAnimFinished(trainerObj) )
+ task->data[0] = 3;
+
+ return 0;
+}
+
+s8 sub_80845C8(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ if(!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)
+ || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
+ {
+ FieldObjectSetSpecialAnim(trainerObj, 0x3E);
+ task->data[0]++;
+ }
+ return 0;
+}
+
+s8 sub_80845FC(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ if(FieldObjectCheckIfSpecialAnimFinishedOrInactive(trainerObj))
+ {
+ gUnknown_0202FF84[0] = trainerObj->coords2.x;
+ gUnknown_0202FF84[1] = trainerObj->coords2.y;
+ gUnknown_0202FF84[2] = gSprites[trainerObj->spriteId].subpriority - 1;
+ gUnknown_0202FF84[3] = 2;
+ task->data[4] = FieldEffectStart(49);
+ task->data[0]++;
+ }
+ return 0;
+}
+
+s8 sub_8084654(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ struct Sprite *sprite;
+
+ if(gSprites[task->data[4]].animCmdIndex == 2)
+ {
+ trainerObj->mapobj_bit_26 = 0;
+ trainerObj->mapobj_bit_2 = 1;
+
+ sprite = &gSprites[trainerObj->spriteId];
+ sprite->oam.priority = 2;
+ FieldObjectClearAnimIfSpecialAnimFinished(trainerObj);
+ FieldObjectSetSpecialAnim(trainerObj, sub_806084C(trainerObj->mapobj_unk_18));
+ task->data[0]++;
+ }
+ return 0;
+}
+
+s8 sub_80846C8(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ if(!FieldEffectActiveListContains(49))
+ task->data[0] = 3;
+
+ return 0;
+}
+
+void sub_80846E4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ struct MapObject *mapObj;
+
+ // another mapObj loaded into by loadword?
+ LoadWordFromTwoHalfwords(&task->data[1], &mapObj);
+ if(!task->data[7])
+ {
+ FieldObjectClearAnim(mapObj);
+ task->data[7]++;
+ }
+ gTrainerSeeFuncList2[task->data[0]](taskId, task, mapObj);
+ if(task->data[0] == 3 && !FieldEffectActiveListContains(49))
+ {
+ npc_set_running_behaviour_etc(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18));
+ sub_805C774(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18));
+ DestroyTask(taskId);
+ }
+ else
+ mapObj->mapobj_bit_7 = 0;
+}
+
+void sub_8084794(u32 var)
+{
+ StoreWordInTwoHalfwords(&gTasks[CreateTask(sub_80846E4, 0)].data[1], var);
+}
+
+void sub_80847C8(void)
+{
+ sub_80842FC(sub_80847D8);
+}
+
+void sub_80847D8(u8 taskId)
+{
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+}