summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2019-06-15 14:45:24 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2019-06-15 14:45:24 -0400
commit9fb5dcdbf6a954762f68e792b69c5d83cbd9a4f5 (patch)
treebebad7e3feb7487bb232934c090cbfb1ec7ab9f9
parentdecd15a45876549a117df8e8594865cb42aa7b1a (diff)
unk_815F138
-rw-r--r--asm/unk_815F138.s753
-rw-r--r--data/data_8471F00.s80
-rw-r--r--include/sprite.h1
-rw-r--r--ld_script.txt3
-rw-r--r--src/unk_815F138.c322
5 files changed, 325 insertions, 834 deletions
diff --git a/asm/unk_815F138.s b/asm/unk_815F138.s
deleted file mode 100644
index 3a1d49e81..000000000
--- a/asm/unk_815F138.s
+++ /dev/null
@@ -1,753 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_815F138
-sub_815F138: @ 815F138
- push {r4-r6,lr}
- mov r6, r8
- push {r6}
- sub sp, 0x4
- adds r4, r0, 0
- adds r5, r1, 0
- adds r6, r2, 0
- ldr r0, [sp, 0x18]
- lsls r4, 16
- lsrs r4, 16
- lsls r5, 16
- lsrs r5, 16
- lsls r6, 16
- lsrs r6, 16
- lsls r3, 16
- lsrs r3, 16
- lsls r0, 24
- lsrs r0, 24
- mov r8, r0
- ldr r0, _0815F190 @ =sub_815F1AC
- movs r1, 0x50
- str r3, [sp]
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _0815F194 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r2
- strh r4, [r1, 0xC]
- strh r5, [r1, 0xE]
- strh r6, [r1, 0x10]
- ldr r3, [sp]
- strh r3, [r1, 0x12]
- mov r0, r8
- strh r0, [r1, 0x14]
- add sp, 0x4
- pop {r3}
- mov r8, r3
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0815F190: .4byte sub_815F1AC
-_0815F194: .4byte gTasks
- thumb_func_end sub_815F138
-
- thumb_func_start sub_815F198
-sub_815F198: @ 815F198
- push {lr}
- ldr r0, _0815F1A8 @ =sub_815F1AC
- bl FuncIsActiveTask
- lsls r0, 24
- lsrs r0, 24
- pop {r1}
- bx r1
- .align 2, 0
-_0815F1A8: .4byte sub_815F1AC
- thumb_func_end sub_815F198
-
- thumb_func_start sub_815F1AC
-sub_815F1AC: @ 815F1AC
- push {r4-r6,lr}
- sub sp, 0xC
- lsls r0, 24
- lsrs r6, r0, 24
- lsls r0, r6, 2
- adds r0, r6
- lsls r0, 3
- ldr r1, _0815F1D0 @ =gTasks+0x8
- adds r5, r0, r1
- movs r1, 0
- ldrsh r0, [r5, r1]
- cmp r0, 0x1
- beq _0815F21C
- cmp r0, 0x1
- bgt _0815F1D4
- cmp r0, 0
- beq _0815F1DA
- b _0815F29E
- .align 2, 0
-_0815F1D0: .4byte gTasks+0x8
-_0815F1D4:
- cmp r0, 0x2
- beq _0815F260
- b _0815F29E
-_0815F1DA:
- ldrh r0, [r5, 0x4]
- ldrh r1, [r5, 0x6]
- bl sub_815F564
- ldrh r0, [r5, 0x4]
- ldrh r1, [r5, 0x6]
- movs r3, 0x8
- ldrsh r2, [r5, r3]
- movs r4, 0xA
- ldrsh r3, [r5, r4]
- ldrb r4, [r5, 0xC]
- str r4, [sp]
- bl sub_815F5BC
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r5, 0xE]
- ldrh r0, [r5, 0x4]
- ldrh r1, [r5, 0x6]
- movs r3, 0x8
- ldrsh r2, [r5, r3]
- movs r4, 0xA
- ldrsh r3, [r5, r4]
- ldrb r4, [r5, 0xC]
- str r4, [sp]
- adds r4, r5, 0
- adds r4, 0x10
- str r4, [sp, 0x4]
- adds r4, 0x2
- str r4, [sp, 0x8]
- bl sub_815F610
- b _0815F252
-_0815F21C:
- ldrb r0, [r5, 0xE]
- bl sub_815F2AC
- cmp r0, 0
- bne _0815F29E
- ldrb r0, [r5, 0xE]
- ldrb r1, [r5, 0x10]
- ldrb r2, [r5, 0x12]
- bl sub_815F3E0
- movs r0, 0xE
- ldrsh r1, [r5, r0]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r4, _0815F25C @ =gSprites
- adds r0, r4
- bl FreeSpriteOamMatrix
- movs r3, 0xE
- ldrsh r1, [r5, r3]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r4
- bl DestroySprite
-_0815F252:
- ldrh r0, [r5]
- adds r0, 0x1
- strh r0, [r5]
- b _0815F29E
- .align 2, 0
-_0815F25C: .4byte gSprites
-_0815F260:
- ldrb r0, [r5, 0x10]
- bl sub_815F444
- cmp r0, 0
- bne _0815F29E
- movs r4, 0x10
- ldrsh r1, [r5, r4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r4, _0815F2A8 @ =gSprites
- adds r0, r4
- bl DestroySprite
- movs r0, 0x12
- ldrsh r1, [r5, r0]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r4
- bl DestroySprite
- ldrh r0, [r5, 0x4]
- bl FreeSpriteTilesByTag
- ldrh r0, [r5, 0x6]
- bl FreeSpritePaletteByTag
- adds r0, r6, 0
- bl DestroyTask
-_0815F29E:
- add sp, 0xC
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0815F2A8: .4byte gSprites
- thumb_func_end sub_815F1AC
-
- thumb_func_start sub_815F2AC
-sub_815F2AC: @ 815F2AC
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- ldr r0, _0815F2D0 @ =gSprites
- adds r4, r1, r0
- movs r1, 0x2E
- ldrsh r0, [r4, r1]
- cmp r0, 0x7
- bls _0815F2C6
- b _0815F3D8
-_0815F2C6:
- lsls r0, 2
- ldr r1, _0815F2D4 @ =_0815F2D8
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_0815F2D0: .4byte gSprites
-_0815F2D4: .4byte _0815F2D8
- .align 2, 0
-_0815F2D8:
- .4byte _0815F2F8
- .4byte _0815F30A
- .4byte _0815F330
- .4byte _0815F340
- .4byte _0815F362
- .4byte _0815F39A
- .4byte _0815F3C0
- .4byte _0815F396
-_0815F2F8:
- movs r1, 0x80
- lsls r1, 4
- adds r0, r4, 0
- movs r2, 0x1A
- bl sub_8007FFC
- ldrh r0, [r4, 0x2E]
- adds r0, 0x1
- strh r0, [r4, 0x2E]
-_0815F30A:
- movs r2, 0x32
- ldrsh r0, [r4, r2]
- cmp r0, 0
- bne _0815F318
- movs r0, 0x32
- bl PlaySE
-_0815F318:
- ldrh r0, [r4, 0x32]
- adds r0, 0x1
- strh r0, [r4, 0x32]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x13
- ble _0815F3D8
- movs r0, 0
- strh r0, [r4, 0x32]
- adds r0, r4, 0
- movs r1, 0x1
- b _0815F3B6
-_0815F330:
- adds r0, r4, 0
- adds r0, 0x3F
- ldrb r1, [r0]
- movs r0, 0x20
- ands r0, r1
- cmp r0, 0
- beq _0815F3D8
- b _0815F3BA
-_0815F340:
- ldrh r0, [r4, 0x32]
- adds r0, 0x1
- strh r0, [r4, 0x32]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x3
- ble _0815F3D8
- movs r0, 0
- strh r0, [r4, 0x32]
- ldrh r0, [r4, 0x2E]
- adds r0, 0x1
- strh r0, [r4, 0x2E]
- adds r0, r4, 0
- movs r1, 0x2
- bl StartSpriteAffineAnim
- b _0815F3D8
-_0815F362:
- ldrh r0, [r4, 0x22]
- subs r0, 0x4
- strh r0, [r4, 0x22]
- ldrh r0, [r4, 0x32]
- adds r0, 0x1
- strh r0, [r4, 0x32]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x7
- ble _0815F3D8
- ldrh r1, [r4, 0x36]
- movs r2, 0x36
- ldrsh r0, [r4, r2]
- cmp r0, 0x1
- bgt _0815F392
- adds r1, 0x1
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl StartSpriteAnim
- movs r0, 0
- strh r0, [r4, 0x32]
- b _0815F3BA
-_0815F392:
- movs r0, 0x7
- strh r0, [r4, 0x2E]
-_0815F396:
- movs r0, 0
- b _0815F3DA
-_0815F39A:
- ldrh r0, [r4, 0x22]
- adds r0, 0x4
- strh r0, [r4, 0x22]
- ldrh r0, [r4, 0x32]
- adds r0, 0x1
- strh r0, [r4, 0x32]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x7
- ble _0815F3D8
- movs r0, 0
- strh r0, [r4, 0x32]
- adds r0, r4, 0
- movs r1, 0x3
-_0815F3B6:
- bl StartSpriteAffineAnim
-_0815F3BA:
- ldrh r0, [r4, 0x2E]
- adds r0, 0x1
- b _0815F3D6
-_0815F3C0:
- adds r0, r4, 0
- adds r0, 0x3F
- ldrb r1, [r0]
- movs r0, 0x20
- ands r0, r1
- cmp r0, 0
- beq _0815F3D8
- ldrh r0, [r4, 0x36]
- adds r0, 0x1
- strh r0, [r4, 0x36]
- movs r0, 0x1
-_0815F3D6:
- strh r0, [r4, 0x2E]
-_0815F3D8:
- movs r0, 0x1
-_0815F3DA:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_815F2AC
-
- thumb_func_start sub_815F3E0
-sub_815F3E0: @ 815F3E0
- push {r4-r6,lr}
- mov r6, r8
- push {r6}
- lsls r1, 24
- lsrs r1, 24
- lsls r2, 24
- lsrs r2, 24
- ldr r0, _0815F438 @ =gSprites
- mov r8, r0
- lsls r4, r1, 4
- adds r4, r1
- lsls r4, 2
- adds r5, r4, r0
- ldr r0, _0815F43C @ =0x0000ffd8
- strh r0, [r5, 0x26]
- lsls r3, r2, 4
- adds r3, r2
- lsls r3, 2
- mov r1, r8
- adds r2, r3, r1
- strh r0, [r2, 0x26]
- adds r5, 0x3E
- ldrb r6, [r5]
- movs r1, 0x5
- negs r1, r1
- adds r0, r1, 0
- ands r0, r6
- strb r0, [r5]
- adds r2, 0x3E
- ldrb r0, [r2]
- ands r1, r0
- strb r1, [r2]
- movs r0, 0x1C
- add r8, r0
- add r4, r8
- ldr r0, _0815F440 @ =sub_815F470
- str r0, [r4]
- add r3, r8
- str r0, [r3]
- pop {r3}
- mov r8, r3
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0815F438: .4byte gSprites
-_0815F43C: .4byte 0x0000ffd8
-_0815F440: .4byte sub_815F470
- thumb_func_end sub_815F3E0
-
- thumb_func_start sub_815F444
-sub_815F444: @ 815F444
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- movs r3, 0
- ldr r2, _0815F468 @ =gSprites
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- adds r2, 0x1C
- adds r1, r2
- ldr r1, [r1]
- ldr r0, _0815F46C @ =sub_815F470
- cmp r1, r0
- bne _0815F462
- movs r3, 0x1
-_0815F462:
- adds r0, r3, 0
- pop {r1}
- bx r1
- .align 2, 0
-_0815F468: .4byte gSprites
-_0815F46C: .4byte sub_815F470
- thumb_func_end sub_815F444
-
- thumb_func_start sub_815F470
-sub_815F470: @ 815F470
- push {r4,r5,lr}
- adds r5, r0, 0
- adds r4, r5, 0
- adds r4, 0x2E
- movs r1, 0x2E
- ldrsh r0, [r5, r1]
- cmp r0, 0x4
- bhi _0815F55A
- lsls r0, 2
- ldr r1, _0815F48C @ =_0815F490
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_0815F48C: .4byte _0815F490
- .align 2, 0
-_0815F490:
- .4byte _0815F4A4
- .4byte _0815F4B4
- .4byte _0815F4DC
- .4byte _0815F510
- .4byte _0815F548
-_0815F4A4:
- movs r0, 0x40
- strh r0, [r4, 0x8]
- ldrh r0, [r5, 0x26]
- lsls r0, 4
- strh r0, [r4, 0xA]
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
-_0815F4B4:
- ldrh r1, [r4, 0x8]
- ldrh r2, [r4, 0xA]
- adds r0, r1, r2
- strh r0, [r4, 0xA]
- adds r1, 0x1
- strh r1, [r4, 0x8]
- lsls r0, 16
- asrs r0, 20
- strh r0, [r5, 0x26]
- cmp r0, 0
- blt _0815F55A
- movs r0, 0x32
- bl PlaySE
- movs r0, 0
- strh r0, [r5, 0x26]
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
- b _0815F55A
-_0815F4DC:
- ldrh r0, [r4, 0x2]
- adds r0, 0xC
- strh r0, [r4, 0x2]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x7F
- ble _0815F4FA
- movs r0, 0x32
- bl PlaySE
- movs r0, 0
- strh r0, [r4, 0x2]
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
-_0815F4FA:
- ldr r0, _0815F50C @ =gSineTable
- movs r2, 0x2
- ldrsh r1, [r4, r2]
- lsls r1, 1
- adds r1, r0
- movs r2, 0
- ldrsh r0, [r1, r2]
- asrs r0, 4
- b _0815F53E
- .align 2, 0
-_0815F50C: .4byte gSineTable
-_0815F510:
- ldrh r0, [r4, 0x2]
- adds r0, 0x10
- strh r0, [r4, 0x2]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x7F
- ble _0815F52E
- movs r0, 0x32
- bl PlaySE
- movs r0, 0
- strh r0, [r4, 0x2]
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
-_0815F52E:
- ldr r1, _0815F544 @ =gSineTable
- movs r2, 0x2
- ldrsh r0, [r4, r2]
- lsls r0, 1
- adds r0, r1
- ldrh r0, [r0]
- lsls r0, 16
- asrs r0, 21
-_0815F53E:
- negs r0, r0
- strh r0, [r5, 0x26]
- b _0815F55A
- .align 2, 0
-_0815F544: .4byte gSineTable
-_0815F548:
- ldrh r0, [r4, 0x2]
- adds r0, 0x1
- strh r0, [r4, 0x2]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x28
- ble _0815F55A
- ldr r0, _0815F560 @ =SpriteCallbackDummy
- str r0, [r5, 0x1C]
-_0815F55A:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0815F560: .4byte SpriteCallbackDummy
- thumb_func_end sub_815F470
-
- thumb_func_start sub_815F564
-sub_815F564: @ 815F564
- push {r4,lr}
- sub sp, 0x10
- lsls r1, 16
- lsrs r1, 16
- ldr r2, _0815F5AC @ =gUnknown_847A79C
- ldr r3, [r2, 0x4]
- ldr r2, [r2]
- str r2, [sp]
- str r3, [sp, 0x4]
- ldr r2, _0815F5B0 @ =gUnknown_847A7A4
- ldr r3, [r2, 0x4]
- ldr r2, [r2]
- str r2, [sp, 0x8]
- str r3, [sp, 0xC]
- lsls r0, 16
- ldr r3, _0815F5B4 @ =0x0000ffff
- ldr r2, [sp, 0x4]
- ands r2, r3
- orrs r2, r0
- str r2, [sp, 0x4]
- ldr r2, _0815F5B8 @ =0xffff0000
- add r4, sp, 0x8
- ldr r0, [r4, 0x4]
- ands r0, r2
- orrs r0, r1
- str r0, [r4, 0x4]
- mov r0, sp
- bl LoadCompressedObjectPic
- adds r0, r4, 0
- bl LoadSpritePalette
- add sp, 0x10
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0815F5AC: .4byte gUnknown_847A79C
-_0815F5B0: .4byte gUnknown_847A7A4
-_0815F5B4: .4byte 0x0000ffff
-_0815F5B8: .4byte 0xffff0000
- thumb_func_end sub_815F564
-
- thumb_func_start sub_815F5BC
-sub_815F5BC: @ 815F5BC
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x18
- mov r12, r3
- ldr r3, [sp, 0x30]
- lsls r1, 16
- lsrs r1, 16
- lsls r3, 24
- lsrs r3, 24
- mov r8, r3
- mov r5, sp
- ldr r4, _0815F60C @ =gUnknown_847A860
- ldm r4!, {r3,r6,r7}
- stm r5!, {r3,r6,r7}
- ldm r4!, {r3,r6,r7}
- stm r5!, {r3,r6,r7}
- mov r4, sp
- strh r0, [r4]
- mov r0, sp
- strh r1, [r0, 0x2]
- lsls r2, 16
- asrs r2, 16
- mov r0, r12
- lsls r6, r0, 16
- asrs r6, 16
- mov r0, sp
- adds r1, r2, 0
- adds r2, r6, 0
- mov r3, r8
- bl CreateSprite
- lsls r0, 24
- lsrs r0, 24
- add sp, 0x18
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_0815F60C: .4byte gUnknown_847A860
- thumb_func_end sub_815F5BC
-
- thumb_func_start sub_815F610
-sub_815F610: @ 815F610
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x18
- mov r12, r3
- ldr r6, [sp, 0x38]
- ldr r3, [sp, 0x3C]
- mov r9, r3
- ldr r4, [sp, 0x40]
- mov r8, r4
- lsls r1, 16
- lsrs r1, 16
- lsls r6, 24
- lsrs r6, 24
- mov r10, r6
- mov r4, sp
- ldr r3, _0815F6D4 @ =gUnknown_847A878
- ldm r3!, {r5-r7}
- stm r4!, {r5-r7}
- ldm r3!, {r5-r7}
- stm r4!, {r5-r7}
- mov r3, sp
- strh r0, [r3]
- mov r0, sp
- strh r1, [r0, 0x2]
- lsls r2, 16
- asrs r4, r2, 16
- ldr r0, _0815F6D8 @ =0xffe00000
- adds r2, r0
- asrs r2, 16
- mov r1, r12
- lsls r5, r1, 16
- asrs r5, 16
- mov r0, sp
- adds r1, r2, 0
- adds r2, r5, 0
- mov r3, r10
- bl CreateSprite
- lsls r0, 24
- lsrs r0, 24
- mov r3, r9
- strh r0, [r3]
- adds r4, 0x20
- lsls r4, 16
- asrs r4, 16
- mov r0, sp
- adds r1, r4, 0
- adds r2, r5, 0
- mov r3, r10
- bl CreateSprite
- lsls r0, 24
- lsrs r0, 24
- mov r4, r8
- strh r0, [r4]
- ldr r2, _0815F6DC @ =gSprites
- mov r5, r9
- movs r6, 0
- ldrsh r1, [r5, r6]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r2
- adds r0, 0x3E
- ldrb r1, [r0]
- movs r3, 0x4
- orrs r1, r3
- strb r1, [r0]
- movs r7, 0
- ldrsh r1, [r4, r7]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r2
- adds r0, 0x3E
- ldrb r1, [r0]
- orrs r1, r3
- strb r1, [r0]
- movs r0, 0
- ldrsh r1, [r4, r0]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r2
- movs r1, 0x1
- bl StartSpriteAnim
- add sp, 0x18
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0815F6D4: .4byte gUnknown_847A878
-_0815F6D8: .4byte 0xffe00000
-_0815F6DC: .4byte gSprites
- thumb_func_end sub_815F610
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/data/data_8471F00.s b/data/data_8471F00.s
index b25d7ea57..8877ff4c5 100644
--- a/data/data_8471F00.s
+++ b/data/data_8471F00.s
@@ -229,86 +229,6 @@ gUnknown_8479748::
.section .rodata.after_trainer_tower
- // unk_815F138
-
-gUnknown_847A328::
- .incbin "data/graphics/unk_847a348.gbapal"
-
-gUnknown_847A348::
- .incbin "data/graphics/unk_847a348.4bpp.lz"
-
-gUnknown_847A79C:: @ 847A79C
- obj_tiles gUnknown_847A348, 0xE00, 0
-
-gUnknown_847A7A4:: @ 847A7A4
- obj_pal gUnknown_847A328, 0
-
-gOamData_847A7AC::
- .4byte 0x80000300, 0x00000000
-
-gOamData_847A7B4::
- .4byte 0xc0004000, 0x00000000
-
-gUnknown_847A7BC::
- obj_image_anim_frame 0, 1
- obj_image_anim_end
-
-gUnknown_847A7C4::
- obj_image_anim_frame 16, 1
- obj_image_anim_end
-
-gUnknown_847A7CC::
- obj_image_anim_frame 32, 1
- obj_image_anim_end
-
-gUnknown_847A7D4::
- .4byte gUnknown_847A7BC
- .4byte gUnknown_847A7C4
- .4byte gUnknown_847A7CC
-
-gUnknown_847A7E0::
- obj_image_anim_frame 48, 1
- obj_image_anim_end
-
-gUnknown_847A7E8::
- obj_image_anim_frame 80, 1
- obj_image_anim_end
-
-gUnknown_847A7F0::
- .4byte gUnknown_847A7E0
- .4byte gUnknown_847A7E8
-
-gUnknown_847A7F8::
- obj_rot_scal_anim_frame 0x100, 0x100, 0, 0
- obj_rot_scal_anim_end
-
-gUnknown_847A808::
- obj_rot_scal_anim_frame 0x100, 0x100, 0, 0
- obj_rot_scal_anim_frame 0x10, -0x10, 0, 8
- obj_rot_scal_anim_end
-
-gUnknown_847A820::
- obj_rot_scal_anim_frame -0x12, 0x12, 0, 8
- obj_rot_scal_anim_end
-
-gUnknown_847A830::
- obj_rot_scal_anim_frame 0x6, -0x6, 0, 8
- obj_rot_scal_anim_frame -0x4, 0x4, 0, 8
- obj_rot_scal_anim_frame 0x100, 0x100, 0, 0
- obj_rot_scal_anim_end
-
-gUnknown_847A850::
- .4byte gUnknown_847A7F8
- .4byte gUnknown_847A808
- .4byte gUnknown_847A820
- .4byte gUnknown_847A830
-
-gUnknown_847A860:: @ 847A860
- spr_template 0, 0, gOamData_847A7AC, gUnknown_847A7D4, NULL, gUnknown_847A850, SpriteCallbackDummy
-
-gUnknown_847A878:: @ 847A878
- spr_template 0, 0, gOamData_847A7B4, gUnknown_847A7F0, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
-
// berry_fix_program
gUnknown_847A890:: @ 847A890
diff --git a/include/sprite.h b/include/sprite.h
index fb0f710e8..5fa85ee21 100644
--- a/include/sprite.h
+++ b/include/sprite.h
@@ -302,5 +302,6 @@ void CopyFromSprites(u8 *dest);
u8 SpriteTileAllocBitmapOp(u16 bit, u8 op);
void ClearSpriteCopyRequests(void);
void ResetAffineAnimData(void);
+void sub_8007FFC(struct Sprite* sprite, s16 a2, s16 a3);
#endif //GUARD_SPRITE_H
diff --git a/ld_script.txt b/ld_script.txt
index 1ae51f0c1..4659879bc 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -284,7 +284,7 @@ SECTIONS {
src/cereader_tool.o(.text);
src/trainer_tower.o(.text);
src/unk_815EDDC.o(.text);
- asm/unk_815F138.o(.text);
+ src/unk_815F138.o(.text);
asm/berry_fix_program.o(.text);
} =0
@@ -457,6 +457,7 @@ SECTIONS {
src/ss_anne.o(.rodata);
src/cereader_tool.o(.rodata);
src/trainer_tower.o(.rodata);
+ src/unk_815F138.o(.rodata);
data/data_8471F00.o(.rodata.after_trainer_tower);
src/mystery_event_msg.o(.rodata);
data/mystery_event_msg.o(.rodata);
diff --git a/src/unk_815F138.c b/src/unk_815F138.c
new file mode 100644
index 000000000..8941f1559
--- /dev/null
+++ b/src/unk_815F138.c
@@ -0,0 +1,322 @@
+#include "global.h"
+#include "decompress.h"
+#include "sound.h"
+#include "task.h"
+#include "trig.h"
+#include "constants/songs.h"
+
+void sub_815F1AC(u8 taskId);
+bool32 sub_815F2AC(u8 spriteId);
+void sub_815F3E0(u8 spriteId1, u8 spriteId2, u8 spriteId3);
+bool32 sub_815F444(u8 spriteId);
+void sub_815F470(struct Sprite * sprite);
+void sub_815F564(u16 tilesTag, u16 palTag);
+u8 sub_815F5BC(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority);
+void sub_815F610(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p);
+
+void sub_815F138(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
+{
+ u8 taskId = CreateTask(sub_815F1AC, 80);
+ gTasks[taskId].data[2] = tilesTag;
+ gTasks[taskId].data[3] = palTag;
+ gTasks[taskId].data[4] = x;
+ gTasks[taskId].data[5] = y;
+ gTasks[taskId].data[6] = subpriority;
+}
+
+bool8 sub_815F198(void)
+{
+ return FuncIsActiveTask(sub_815F1AC);
+}
+
+void sub_815F1AC(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ sub_815F564(data[2], data[3]);
+ data[7] = sub_815F5BC(data[2], data[3], data[4], data[5], data[6]);
+ sub_815F610(data[2], data[3], data[4], data[5], data[6], &data[8], &data[9]);
+ data[0]++;
+ break;
+ case 1:
+ if (!sub_815F2AC(data[7]))
+ {
+ sub_815F3E0(data[7], data[8], data[9]);
+ FreeSpriteOamMatrix(&gSprites[data[7]]);
+ DestroySprite(&gSprites[data[7]]);
+ data[0]++;
+ }
+ break;
+ case 2:
+ if (!sub_815F444(data[8]))
+ {
+ DestroySprite(&gSprites[data[8]]);
+ DestroySprite(&gSprites[data[9]]);
+ FreeSpriteTilesByTag(data[2]);
+ FreeSpritePaletteByTag(data[3]);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+bool32 sub_815F2AC(u8 spriteId)
+{
+ struct Sprite * sprite = &gSprites[spriteId];
+
+ switch (sprite->data[0])
+ {
+ case 0:
+ sub_8007FFC(sprite, 0x800, 0x1A);
+ sprite->data[0]++;
+ // fallthrough
+ case 1:
+ if (sprite->data[2] == 0)
+ PlaySE(SE_TRACK_STOP);
+ if (++sprite->data[2] >= 20)
+ {
+ sprite->data[2] = 0;
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ if (sprite->affineAnimEnded)
+ sprite->data[0]++;
+ break;
+ case 3:
+ if (++sprite->data[2] >= 4)
+ {
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ StartSpriteAffineAnim(sprite, 2);
+ }
+ break;
+ case 4:
+ sprite->pos1.y -= 4;
+ if (++sprite->data[2] >= 8)
+ {
+ if (sprite->data[4] < 2)
+ {
+ StartSpriteAnim(sprite, sprite->data[4] + 1);
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+ else
+ {
+ sprite->data[0] = 7;
+ return FALSE;
+ }
+ }
+ break;
+ case 5:
+ sprite->pos1.y += 4;
+ if (++sprite->data[2] >= 8)
+ {
+ sprite->data[2] = 0;
+ StartSpriteAffineAnim(sprite, 3);
+ sprite->data[0]++;
+ }
+ break;
+ case 6:
+ if (sprite->affineAnimEnded)
+ {
+ sprite->data[4]++;
+ sprite->data[0] = 1;
+ }
+ break;
+ case 7:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void sub_815F3E0(u8 spriteId1, u8 spriteId2, u8 spriteId3)
+{
+ gSprites[spriteId2].pos2.y = -40;
+ gSprites[spriteId3].pos2.y = -40;
+ gSprites[spriteId2].invisible = FALSE;
+ gSprites[spriteId3].invisible = FALSE;
+ gSprites[spriteId2].callback = sub_815F470;
+ gSprites[spriteId3].callback = sub_815F470;
+}
+
+bool32 sub_815F444(u8 spriteId)
+{
+ return gSprites[spriteId].callback == sub_815F470;
+}
+
+void sub_815F470(struct Sprite * sprite)
+{
+ s16 * data = sprite->data;
+ s32 y;
+
+ switch (sprite->data[0])
+ {
+ case 0:
+ data[4] = 64;
+ data[5] = sprite->pos2.y << 4;
+ data[0]++;
+ //fallthrough
+ case 1:
+ data[5] += data[4];
+ data[4]++;
+ sprite->pos2.y = data[5] >> 4;
+ if (sprite->pos2.y >= 0)
+ {
+ PlaySE(SE_TRACK_STOP);
+ sprite->pos2.y = 0;
+ data[0]++;
+ }
+ break;
+ case 2:
+ data[1] += 12;
+ if (data[1] >= 128)
+ {
+ PlaySE(SE_TRACK_STOP);
+ data[1] = 0;
+ data[0]++;
+ }
+ y = gSineTable[data[1]];
+ sprite->pos2.y = -(y >> 4);
+ break;
+ case 3:
+ data[1] += 16;
+ if (data[1] >= 128)
+ {
+ PlaySE(SE_TRACK_STOP);
+ data[1] = 0;
+ data[0]++;
+ }
+ sprite->pos2.y = -(gSineTable[data[1]] >> 5);
+ break;
+ case 4:
+ if (++data[1] > 40)
+ sprite->callback = SpriteCallbackDummy;
+ break;
+ }
+}
+
+const u16 gUnknown_847A328[] = INCBIN_U16("data/graphics/unk_847a348.gbapal");
+const u16 gUnknown_847A348[] = INCBIN_U16("data/graphics/unk_847a348.4bpp.lz");
+
+void sub_815F564(u16 tilesTag, u16 palTag)
+{
+ struct CompressedSpriteSheet spriteSheet = {(const void *)gUnknown_847A348, 0xE00};
+ struct SpritePalette spritePalette = {gUnknown_847A328};
+ spriteSheet.tag = tilesTag;
+ spritePalette.tag = palTag;
+ LoadCompressedObjectPic(&spriteSheet);
+ LoadSpritePalette(&spritePalette);
+}
+
+const struct OamData gOamData_847A7AC = {
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .shape = ST_OAM_SQUARE,
+ .size = 2
+};
+
+const struct OamData gOamData_847A7B4 = {
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .shape = ST_OAM_H_RECTANGLE,
+ .size = 3
+};
+
+const union AnimCmd gUnknown_847A7BC[] = {
+ ANIMCMD_FRAME( 0, 1),
+ ANIMCMD_END
+};
+
+const union AnimCmd gUnknown_847A7C4[] = {
+ ANIMCMD_FRAME(16, 1),
+ ANIMCMD_END
+};
+
+const union AnimCmd gUnknown_847A7CC[] = {
+ ANIMCMD_FRAME(32, 1),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gUnknown_847A7D4[] = {
+ gUnknown_847A7BC,
+ gUnknown_847A7C4,
+ gUnknown_847A7CC
+};
+
+const union AnimCmd gUnknown_847A7E0[] = {
+ ANIMCMD_FRAME(48, 1),
+ ANIMCMD_END
+};
+
+const union AnimCmd gUnknown_847A7E8[] = {
+ ANIMCMD_FRAME(80, 1),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gUnknown_847A7F0[] = {
+ gUnknown_847A7E0,
+ gUnknown_847A7E8
+};
+
+const union AffineAnimCmd gUnknown_847A7F8[] = {
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd gUnknown_847A808[] = {
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME( 0x10, -0x10, 0, 8),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd gUnknown_847A820[] = {
+ AFFINEANIMCMD_FRAME(-0x12, 0x12, 0, 8),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd gUnknown_847A830[] = {
+ AFFINEANIMCMD_FRAME( 0x6, -0x6, 0, 8),
+ AFFINEANIMCMD_FRAME( -0x4, 0x4, 0, 8),
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd *const gUnknown_847A850[] = {
+ gUnknown_847A7F8,
+ gUnknown_847A808,
+ gUnknown_847A820,
+ gUnknown_847A830
+};
+
+u8 sub_815F5BC(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
+{
+ struct SpriteTemplate spriteTemplate = {
+ .oam = &gOamData_847A7AC,
+ .anims = gUnknown_847A7D4,
+ .affineAnims = gUnknown_847A850,
+ .callback = SpriteCallbackDummy
+ };
+ spriteTemplate.tileTag = tilesTag;
+ spriteTemplate.paletteTag = palTag;
+ return CreateSprite(&spriteTemplate, x, y, subpriority);
+}
+
+void sub_815F610(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 * spriteId2_p, s16 * spriteId3_p)
+{
+ struct SpriteTemplate spriteTemplate = {
+ .oam = &gOamData_847A7B4,
+ .anims = gUnknown_847A7F0,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+ };
+ spriteTemplate.tileTag = tilesTag;
+ spriteTemplate.paletteTag = palTag;
+ *spriteId2_p = CreateSprite(&spriteTemplate, x - 32, y, subpriority);
+ *spriteId3_p = CreateSprite(&spriteTemplate, x + 32, y, subpriority);
+ gSprites[*spriteId2_p].invisible = TRUE;
+ gSprites[*spriteId3_p].invisible = TRUE;
+ StartSpriteAnim(&gSprites[*spriteId3_p], 1);
+}