Finish itemfinder dism/decomp

This commit is contained in:
PikalaxALT
2019-10-03 12:12:06 -04:00
parent afd5f1f52f
commit 26d940dfeb
15 changed files with 549 additions and 937 deletions
+4 -4
View File
@@ -1152,24 +1152,24 @@ _0806D174:
_0806D17A:
ldr r0, [r5, 0x8]
movs r1, 0x3
bl sub_80CC44C
bl GetHiddenItemAttr
lsls r0, 16
lsrs r0, 16
cmp r0, 0x1
beq _0806D164
ldr r0, [r5, 0x8]
movs r1, 0
bl sub_80CC44C
bl GetHiddenItemAttr
ldr r1, _0806D1C4 @ =gSpecialVar_0x8005
strh r0, [r1]
ldr r0, [r5, 0x8]
movs r1, 0x1
bl sub_80CC44C
bl GetHiddenItemAttr
ldr r4, _0806D1C8 @ =gSpecialVar_0x8004
strh r0, [r4]
ldr r0, [r5, 0x8]
movs r1, 0x2
bl sub_80CC44C
bl GetHiddenItemAttr
ldr r1, _0806D1CC @ =gSpecialVar_0x8006
strh r0, [r1]
ldrh r0, [r4]
+3 -3
View File
@@ -3942,8 +3942,8 @@ _080CC444: .4byte gSpecialVar_0x8004
_080CC448: .4byte gSpecialVar_0x8006
thumb_func_end sub_80CC3CC
thumb_func_start sub_80CC44C
sub_80CC44C: @ 80CC44C
thumb_func_start GetHiddenItemAttr
GetHiddenItemAttr: @ 80CC44C
push {lr}
lsls r1, 24
lsrs r1, 24
@@ -3980,7 +3980,7 @@ _080CC484:
_080CC486:
pop {r1}
bx r1
thumb_func_end sub_80CC44C
thumb_func_end GetHiddenItemAttr
thumb_func_start sub_80CC48C
sub_80CC48C: @ 80CC48C
-834
View File
@@ -1,834 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start sub_813F070
sub_813F070: @ 813F070
push {r4-r6,lr}
adds r4, r0, 0
adds r5, r1, 0
adds r6, r2, 0
bl mapconnection_get_mapheader
adds r3, r0, 0
ldrb r0, [r4]
cmp r0, 0x2
beq _0813F098
cmp r0, 0x2
bgt _0813F08E
cmp r0, 0x1
beq _0813F0AC
b _0813F0EC
_0813F08E:
cmp r0, 0x3
beq _0813F0C4
cmp r0, 0x4
beq _0813F0CE
b _0813F0EC
_0813F098:
ldr r0, [r4, 0x4]
adds r0, 0x7
subs r0, r5, r0
lsls r0, 16
lsrs r1, r0, 16
ldr r0, [r3]
ldr r0, [r0, 0x4]
subs r0, 0x7
adds r0, r6
b _0813F0E2
_0813F0AC:
ldr r0, [r4, 0x4]
adds r0, 0x7
subs r0, r5, r0
lsls r0, 16
lsrs r1, r0, 16
ldr r0, _0813F0C0 @ =gMapHeader
ldr r0, [r0]
ldr r0, [r0, 0x4]
b _0813F0DE
.align 2, 0
_0813F0C0: .4byte gMapHeader
_0813F0C4:
ldr r0, [r3]
ldr r0, [r0]
subs r0, 0x7
adds r0, r5
b _0813F0D8
_0813F0CE:
ldr r0, _0813F0E8 @ =gMapHeader
ldr r0, [r0]
ldr r0, [r0]
adds r0, 0x7
subs r0, r5, r0
_0813F0D8:
lsls r0, 16
lsrs r1, r0, 16
ldr r0, [r4, 0x4]
_0813F0DE:
adds r0, 0x7
subs r0, r6, r0
_0813F0E2:
lsls r0, 16
lsrs r2, r0, 16
b _0813F0F0
.align 2, 0
_0813F0E8: .4byte gMapHeader
_0813F0EC:
movs r0, 0
b _0813F102
_0813F0F0:
ldr r0, [r3, 0x4]
lsls r1, 16
asrs r1, 16
lsls r2, 16
asrs r2, 16
bl sub_813F004
lsls r0, 24
lsrs r0, 24
_0813F102:
pop {r4-r6}
pop {r1}
bx r1
thumb_func_end sub_813F070
thumb_func_start sub_813F108
sub_813F108: @ 813F108
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
sub sp, 0x14
lsls r0, 24
lsrs r0, 24
str r0, [sp, 0x4]
ldr r0, _0813F21C @ =gMapHeader
ldr r1, [r0]
ldr r0, [r1]
adds r0, 0x7
lsls r0, 16
lsrs r0, 16
str r0, [sp, 0x8]
ldr r0, [r1, 0x4]
adds r0, 0x7
lsls r0, 16
lsrs r0, 16
str r0, [sp, 0xC]
mov r4, sp
adds r4, 0x2
mov r0, sp
adds r1, r4, 0
bl PlayerGetDestCoords
mov r0, sp
ldrh r0, [r0]
subs r0, 0x7
lsls r0, 16
lsrs r3, r0, 16
asrs r0, 16
mov r1, sp
movs r2, 0
ldrsh r1, [r1, r2]
adds r1, 0x7
cmp r0, r1
bgt _0813F20C
_0813F156:
mov r5, sp
ldrh r0, [r5, 0x2]
subs r0, 0x5
lsls r0, 16
lsrs r4, r0, 16
lsls r2, r4, 16
asrs r1, r2, 16
movs r6, 0x2
ldrsh r0, [r5, r6]
adds r0, 0x5
lsls r3, 16
mov r8, r3
cmp r1, r0
bgt _0813F1F6
movs r0, 0x7
str r0, [sp, 0x10]
mov r1, r8
asrs r1, 16
mov r9, r1
mov r10, r0
_0813F17E:
ldr r3, [sp, 0x10]
cmp r3, r9
bgt _0813F1A0
ldr r5, [sp, 0x8]
lsls r0, r5, 16
asrs r0, 16
cmp r9, r0
bge _0813F1A0
asrs r1, r2, 16
cmp r10, r1
bgt _0813F1A0
ldr r6, [sp, 0xC]
lsls r0, r6, 16
asrs r0, 16
lsls r7, r4, 16
cmp r1, r0
blt _0813F1DE
_0813F1A0:
mov r0, r8
asrs r5, r0, 16
lsls r4, 16
asrs r6, r4, 16
adds r0, r5, 0
adds r1, r6, 0
bl sub_805973C
adds r7, r4, 0
cmp r0, 0
beq _0813F1DE
adds r1, r5, 0
adds r2, r6, 0
bl sub_813F070
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
bne _0813F1DE
mov r0, sp
ldrh r1, [r0]
subs r1, r5, r1
lsls r1, 16
asrs r1, 16
ldrh r2, [r0, 0x2]
subs r2, r6, r2
lsls r2, 16
asrs r2, 16
ldr r0, [sp, 0x4]
bl sub_813F220
_0813F1DE:
movs r1, 0x80
lsls r1, 9
adds r0, r7, r1
lsrs r4, r0, 16
lsls r2, r4, 16
asrs r1, r2, 16
mov r3, sp
movs r5, 0x2
ldrsh r0, [r3, r5]
adds r0, 0x5
cmp r1, r0
ble _0813F17E
_0813F1F6:
movs r1, 0x80
lsls r1, 9
add r1, r8
lsrs r3, r1, 16
asrs r1, 16
mov r0, sp
movs r6, 0
ldrsh r0, [r0, r6]
adds r0, 0x7
cmp r1, r0
ble _0813F156
_0813F20C:
add sp, 0x14
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_0813F21C: .4byte gMapHeader
thumb_func_end sub_813F108
thumb_func_start sub_813F220
sub_813F220: @ 813F220
push {r4-r7,lr}
mov r7, r9
mov r6, r8
push {r6,r7}
lsls r0, 24
lsrs r0, 24
lsls r1, 16
lsrs r7, r1, 16
lsls r2, 16
lsrs r2, 16
mov r12, r2
lsls r1, r0, 2
adds r1, r0
lsls r1, 3
ldr r0, _0813F254 @ =gTasks+0x8
adds r3, r1, r0
movs r1, 0x4
ldrsh r0, [r3, r1]
cmp r0, 0
bne _0813F258
strh r7, [r3]
mov r0, r12
strh r0, [r3, 0x2]
movs r0, 0x1
strh r0, [r3, 0x4]
b _0813F2E2
.align 2, 0
_0813F254: .4byte gTasks+0x8
_0813F258:
movs r1, 0
ldrsh r0, [r3, r1]
cmp r0, 0
bge _0813F268
negs r0, r0
lsls r0, 16
lsrs r4, r0, 16
b _0813F26A
_0813F268:
ldrh r4, [r3]
_0813F26A:
movs r1, 0x2
ldrsh r0, [r3, r1]
ldrh r1, [r3, 0x2]
mov r9, r1
cmp r0, 0
bge _0813F27E
negs r0, r0
lsls r0, 16
lsrs r2, r0, 16
b _0813F280
_0813F27E:
ldrh r2, [r3, 0x2]
_0813F280:
lsls r1, r7, 16
asrs r0, r1, 16
cmp r0, 0
bge _0813F290
negs r0, r0
lsls r0, 16
lsrs r6, r0, 16
b _0813F292
_0813F290:
lsrs r6, r1, 16
_0813F292:
mov r1, r12
lsls r0, r1, 16
asrs r1, r0, 16
mov r8, r0
cmp r1, 0
bge _0813F2A4
negs r0, r1
lsls r0, 16
b _0813F2A6
_0813F2A4:
mov r0, r8
_0813F2A6:
lsrs r5, r0, 16
lsls r0, r4, 16
asrs r0, 16
lsls r1, r2, 16
asrs r2, r1, 16
adds r4, r0, r2
lsls r0, r6, 16
asrs r0, 16
lsls r1, r5, 16
asrs r1, 16
adds r0, r1
cmp r4, r0
ble _0813F2C8
strh r7, [r3]
mov r1, r12
strh r1, [r3, 0x2]
b _0813F2E2
_0813F2C8:
cmp r4, r0
bne _0813F2E2
cmp r2, r1
bgt _0813F2DC
cmp r2, r1
bne _0813F2E2
mov r1, r9
lsls r0, r1, 16
cmp r0, r8
bge _0813F2E2
_0813F2DC:
strh r7, [r3]
mov r0, r12
strh r0, [r3, 0x2]
_0813F2E2:
pop {r3,r4}
mov r8, r3
mov r9, r4
pop {r4-r7}
pop {r0}
bx r0
thumb_func_end sub_813F220
thumb_func_start GetPlayerDirectionTowardsHiddenItem
GetPlayerDirectionTowardsHiddenItem: @ 813F2F0
push {r4,r5,lr}
lsls r0, 16
lsls r1, 16
lsrs r1, 16
lsrs r2, r0, 16
cmp r0, 0
bne _0813F302
cmp r1, 0
beq _0813F35C
_0813F302:
lsls r0, r2, 16
asrs r2, r0, 16
adds r5, r0, 0
cmp r2, 0
bge _0813F314
negs r0, r2
lsls r0, 16
lsrs r4, r0, 16
b _0813F316
_0813F314:
lsrs r4, r5, 16
_0813F316:
lsls r0, r1, 16
asrs r2, r0, 16
adds r1, r0, 0
cmp r2, 0
bge _0813F328
negs r0, r2
lsls r0, 16
lsrs r3, r0, 16
b _0813F32A
_0813F328:
lsrs r3, r1, 16
_0813F32A:
lsls r0, r4, 16
asrs r2, r0, 16
lsls r0, r3, 16
asrs r0, 16
cmp r2, r0
ble _0813F342
cmp r5, 0
bge _0813F33E
movs r0, 0x4
b _0813F35E
_0813F33E:
movs r0, 0x2
b _0813F35E
_0813F342:
cmp r2, r0
bge _0813F34C
cmp r1, 0
blt _0813F354
b _0813F358
_0813F34C:
cmp r2, r0
bne _0813F35C
cmp r1, 0
bge _0813F358
_0813F354:
movs r0, 0x1
b _0813F35E
_0813F358:
movs r0, 0x3
b _0813F35E
_0813F35C:
movs r0, 0
_0813F35E:
pop {r4,r5}
pop {r1}
bx r1
thumb_func_end GetPlayerDirectionTowardsHiddenItem
thumb_func_start sub_813F364
sub_813F364: @ 813F364
push {lr}
lsls r0, 24
lsrs r0, 24
ldr r2, _0813F378 @ =gText_ItemfinderResponding
ldr r3, _0813F37C @ =sub_813F380
movs r1, 0x2
bl DisplayItemMessageOnField
pop {r0}
bx r0
.align 2, 0
_0813F378: .4byte gText_ItemfinderResponding
_0813F37C: .4byte sub_813F380
thumb_func_end sub_813F364
thumb_func_start sub_813F380
sub_813F380: @ 813F380
push {r4,lr}
adds r4, r0, 0
lsls r4, 24
lsrs r4, 24
bl sub_813F3FC
movs r0, 0
movs r1, 0x1
bl ClearDialogWindowAndFrame
bl sub_80696C0
bl ScriptContext2_Disable
adds r0, r4, 0
bl DestroyTask
pop {r4}
pop {r0}
bx r0
thumb_func_end sub_813F380
thumb_func_start sub_813F3A8
sub_813F3A8: @ 813F3A8
push {lr}
lsls r0, 24
lsrs r0, 24
ldr r2, _0813F3BC @ =gText_ItemfinderShakingWildly
ldr r3, _0813F3C0 @ =sub_813F3C4
movs r1, 0x2
bl DisplayItemMessageOnField
pop {r0}
bx r0
.align 2, 0
_0813F3BC: .4byte gText_ItemfinderShakingWildly
_0813F3C0: .4byte sub_813F3C4
thumb_func_end sub_813F3A8
thumb_func_start sub_813F3C4
sub_813F3C4: @ 813F3C4
push {r4,lr}
adds r4, r0, 0
lsls r4, 24
lsrs r4, 24
bl sub_813F3FC
adds r0, r4, 0
bl DestroyTask
ldr r0, _0813F3E8 @ =gUnknown_81A8D49
bl ScriptContext1_SetupScript
bl ScriptContext2_Enable
pop {r4}
pop {r0}
bx r0
.align 2, 0
_0813F3E8: .4byte gUnknown_81A8D49
thumb_func_end sub_813F3C4
thumb_func_start sub_813F3EC
sub_813F3EC: @ 813F3EC
push {lr}
ldr r0, _0813F3F8 @ =gUnknown_84647FC
bl LoadSpriteSheet
pop {r0}
bx r0
.align 2, 0
_0813F3F8: .4byte gUnknown_84647FC
thumb_func_end sub_813F3EC
thumb_func_start sub_813F3FC
sub_813F3FC: @ 813F3FC
push {lr}
movs r0, 0xFA
lsls r0, 3
bl FreeSpriteTilesByTag
pop {r0}
bx r0
thumb_func_end sub_813F3FC
thumb_func_start sub_813F40C
sub_813F40C: @ 813F40C
push {r4-r7,lr}
adds r5, r0, 0
lsls r5, 24
lsrs r5, 24
lsls r1, 24
lsrs r7, r1, 24
ldr r0, _0813F464 @ =gUnknown_84647E4
movs r1, 0x78
movs r2, 0x4C
movs r3, 0
bl CreateSprite
lsls r0, 24
lsrs r6, r0, 24
ldr r0, _0813F468 @ =gSprites
lsls r4, r6, 4
adds r4, r6
lsls r4, 2
adds r4, r0
ldrb r1, [r4, 0x5]
movs r0, 0xF
ands r0, r1
strb r0, [r4, 0x5]
adds r0, r4, 0
adds r1, r5, 0
bl StartSpriteAnim
movs r0, 0
strh r5, [r4, 0x3C]
strh r0, [r4, 0x2E]
strh r0, [r4, 0x34]
strh r0, [r4, 0x36]
movs r0, 0x78
strh r0, [r4, 0x38]
movs r0, 0x4C
strh r0, [r4, 0x3A]
cmp r7, 0x4
bhi _0813F53E
lsls r0, r7, 2
ldr r1, _0813F46C @ =_0813F470
adds r0, r1
ldr r0, [r0]
mov pc, r0
.align 2, 0
_0813F464: .4byte gUnknown_84647E4
_0813F468: .4byte gSprites
_0813F46C: .4byte _0813F470
.align 2, 0
_0813F470:
.4byte _0813F484
.4byte _0813F4C8
.4byte _0813F4EC
.4byte _0813F50C
.4byte _0813F52C
_0813F484:
bl GetPlayerFacingDirection
lsls r0, 24
lsrs r0, 24
cmp r0, 0x2
beq _0813F4C8
cmp r0, 0x2
bgt _0813F49A
cmp r0, 0x1
beq _0813F50C
b _0813F53E
_0813F49A:
cmp r0, 0x3
beq _0813F4A4
cmp r0, 0x4
beq _0813F4EC
b _0813F53E
_0813F4A4:
ldr r1, _0813F4C0 @ =gSprites
lsls r0, r6, 4
adds r0, r6
lsls r0, 2
adds r0, r1
movs r2, 0
ldr r1, _0813F4C4 @ =0x0000ff9c
strh r1, [r0, 0x30]
strh r2, [r0, 0x32]
movs r1, 0
bl StartSpriteAffineAnim
b _0813F53E
.align 2, 0
_0813F4C0: .4byte gSprites
_0813F4C4: .4byte 0x0000ff9c
_0813F4C8:
ldr r1, _0813F4E4 @ =gSprites
lsls r0, r6, 4
adds r0, r6
lsls r0, 2
adds r0, r1
movs r1, 0
strh r1, [r0, 0x30]
ldr r1, _0813F4E8 @ =0x0000ff9c
strh r1, [r0, 0x32]
movs r1, 0x3
bl StartSpriteAffineAnim
b _0813F53E
.align 2, 0
_0813F4E4: .4byte gSprites
_0813F4E8: .4byte 0x0000ff9c
_0813F4EC:
ldr r1, _0813F508 @ =gSprites
lsls r0, r6, 4
adds r0, r6
lsls r0, 2
adds r0, r1
movs r2, 0
movs r1, 0x64
strh r1, [r0, 0x30]
strh r2, [r0, 0x32]
movs r1, 0x2
bl StartSpriteAffineAnim
b _0813F53E
.align 2, 0
_0813F508: .4byte gSprites
_0813F50C:
ldr r1, _0813F528 @ =gSprites
lsls r0, r6, 4
adds r0, r6
lsls r0, 2
adds r0, r1
movs r1, 0
strh r1, [r0, 0x30]
movs r1, 0x64
strh r1, [r0, 0x32]
movs r1, 0x1
bl StartSpriteAffineAnim
b _0813F53E
.align 2, 0
_0813F528: .4byte gSprites
_0813F52C:
ldr r1, _0813F544 @ =gSprites
lsls r0, r6, 4
adds r0, r6
lsls r0, 2
adds r0, r1
movs r2, 0
ldr r1, _0813F548 @ =0x0000ff9c
strh r1, [r0, 0x30]
strh r2, [r0, 0x32]
_0813F53E:
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_0813F544: .4byte gSprites
_0813F548: .4byte 0x0000ff9c
thumb_func_end sub_813F40C
thumb_func_start sub_813F54C
sub_813F54C: @ 813F54C
push {lr}
adds r2, r0, 0
ldrh r0, [r2, 0x30]
ldrh r1, [r2, 0x34]
adds r0, r1
strh r0, [r2, 0x34]
ldrh r1, [r2, 0x32]
ldrh r3, [r2, 0x36]
adds r1, r3
strh r1, [r2, 0x36]
lsls r0, 16
asrs r0, 24
ldrh r3, [r2, 0x38]
adds r0, r3
strh r0, [r2, 0x20]
lsls r1, 16
asrs r1, 24
ldrh r3, [r2, 0x3A]
adds r1, r3
strh r1, [r2, 0x22]
subs r0, 0x69
lsls r0, 16
lsrs r0, 16
cmp r0, 0x1B
bhi _0813F58A
lsls r0, r1, 16
asrs r0, 16
cmp r0, 0x3C
ble _0813F58A
cmp r0, 0x58
ble _0813F58E
_0813F58A:
ldr r0, _0813F594 @ =sub_813F598
str r0, [r2, 0x1C]
_0813F58E:
pop {r0}
bx r0
.align 2, 0
_0813F594: .4byte sub_813F598
thumb_func_end sub_813F54C
thumb_func_start sub_813F598
sub_813F598: @ 813F598
push {r4,lr}
adds r4, r0, 0
bl FreeSpriteOamMatrix
adds r0, r4, 0
bl DestroySprite
pop {r4}
pop {r0}
bx r0
thumb_func_end sub_813F598
thumb_func_start sub_813F5AC
sub_813F5AC: @ 813F5AC
push {r4,r5,lr}
ldr r0, _0813F604 @ =gUnknown_84647E4
movs r1, 0x78
movs r2, 0x4C
movs r3, 0
bl CreateSprite
adds r5, r0, 0
lsls r5, 24
lsrs r5, 24
ldr r2, _0813F608 @ =gSprites
lsls r1, r5, 4
adds r1, r5
lsls r1, 2
adds r4, r1, r2
ldrb r3, [r4, 0x5]
movs r0, 0xF
ands r0, r3
strb r0, [r4, 0x5]
adds r2, 0x1C
adds r1, r2
ldr r0, _0813F60C @ =sub_813F614
str r0, [r1]
adds r0, r4, 0
movs r1, 0x4
bl StartSpriteAnim
movs r1, 0
strh r1, [r4, 0x3C]
strh r1, [r4, 0x2E]
strh r1, [r4, 0x34]
strh r1, [r4, 0x36]
movs r0, 0x78
strh r0, [r4, 0x38]
movs r0, 0x4C
strh r0, [r4, 0x3A]
strh r1, [r4, 0x30]
ldr r0, _0813F610 @ =0x0000ff9c
strh r0, [r4, 0x32]
adds r0, r5, 0
pop {r4,r5}
pop {r1}
bx r1
.align 2, 0
_0813F604: .4byte gUnknown_84647E4
_0813F608: .4byte gSprites
_0813F60C: .4byte sub_813F614
_0813F610: .4byte 0x0000ff9c
thumb_func_end sub_813F5AC
thumb_func_start sub_813F614
sub_813F614: @ 813F614
push {lr}
adds r2, r0, 0
ldrh r0, [r2, 0x30]
ldrh r1, [r2, 0x34]
adds r0, r1
strh r0, [r2, 0x34]
ldrh r1, [r2, 0x32]
ldrh r3, [r2, 0x36]
adds r1, r3
strh r1, [r2, 0x36]
lsls r0, 16
asrs r0, 24
ldrh r3, [r2, 0x38]
adds r0, r3
strh r0, [r2, 0x20]
lsls r1, 16
asrs r1, 24
ldrh r3, [r2, 0x3A]
adds r1, r3
strh r1, [r2, 0x22]
subs r0, 0x69
lsls r0, 16
lsrs r0, 16
cmp r0, 0x1B
bhi _0813F652
lsls r0, r1, 16
asrs r0, 16
cmp r0, 0x3C
ble _0813F652
cmp r0, 0x58
ble _0813F656
_0813F652:
ldr r0, _0813F65C @ =sub_813F660
str r0, [r2, 0x1C]
_0813F656:
pop {r0}
bx r0
.align 2, 0
_0813F65C: .4byte sub_813F660
thumb_func_end sub_813F614
thumb_func_start sub_813F660
sub_813F660: @ 813F660
push {lr}
bl DestroySprite
pop {r0}
bx r0
thumb_func_end sub_813F660
.align 2, 0 @ Don't pad with nop.
BIN
View File
Binary file not shown.
-11
View File
@@ -1,11 +0,0 @@
.section .rodata
.align 2
gUnknown_84644D0:: @ 84644D0
.incbin "baserom.gba", 0x4644D0, 0x314
gUnknown_84647E4:: @ 84647E4
.incbin "baserom.gba", 0x4647E4, 0x18
gUnknown_84647FC:: @ 84647FC
.incbin "baserom.gba", 0x4647FC, 0x8
Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

+1 -1
View File
@@ -2275,7 +2275,7 @@ ViridianCity_PokemonCenter_2F_EventScript_1A8D02:: @ 81A8D02
VermilionCity_PokemonCenter_1F_EventScript_1A8D08:: @ 81A8D08
.incbin "baserom.gba", 0x1A8D08, 0x41
gUnknown_81A8D49:: @ 81A8D49
EventScript_ItemfinderDigUpUnderfootItem:: @ 81A8D49
.incbin "baserom.gba", 0x1A8D49, 0x4E
gUnknown_81A8D97:: @ 81A8D97
+2
View File
@@ -1153,4 +1153,6 @@ extern const u8 EventScript_SafariRetire[];
extern const u8 EventScript_SafariWarpOut[];
extern const u8 EventScript_SafariOutOfBalls[];
extern const u8 EventScript_ItemfinderDigUpUnderfootItem[];
#endif //GUARD_EVENT_SCRIPTS_H
+1 -1
View File
@@ -14,6 +14,6 @@ u8 ContextNpcGetTextColor(void);
void set_unknown_box_id(u8);
u16 get_unknown_box_id(void);
bool8 sub_80CC7B4(void);
u16 sub_80CC44C(struct HiddenItemStruct hiddenItem, u8 attr);
u16 GetHiddenItemAttr(struct HiddenItemStruct hiddenItem, u8 attr);
#endif // GUARD_FIELD_SPECIALS_H
+2
View File
@@ -23,5 +23,7 @@ bool8 MapGridIsImpassableAt(s32, s32);
s32 GetMapBorderIdAt(s32, s32);
bool32 CanCameraMoveInDirection(s32);
u32 GetBehaviorByMetatileIdAndMapData(struct MapData *mapData, u16 metatile, u8 attr);
const struct MapHeader * mapconnection_get_mapheader(struct MapConnection * connection);
struct MapConnection * GetMapConnectionAtPos(s16 x, s16 y);
#endif //GUARD_FIELDMAP_H
+1 -1
View File
@@ -1,6 +1,6 @@
#ifndef GUARD_ITEMFINDER_H
#define GUARD_ITEMFINDER_H
void sub_813EC8C(u8 taskId);
void ItemUseOnFieldCB_Itemfinder(u8 taskId);
#endif //GUARD_ITEMFINDER_H
-2
View File
@@ -253,7 +253,6 @@ SECTIONS {
src/dynamic_placeholder_text_util.o(.text);
src/berry_pouch.o(.text);
src/itemfinder.o(.text);
asm/itemfinder.o(.text);
src/buy_menu_helpers.o(.text);
src/slot_machine.o(.text);
src/roamer.o(.text);
@@ -469,7 +468,6 @@ SECTIONS {
src/dynamic_placeholder_text_util.o(.rodata);
src/berry_pouch.o(.rodata);
src/itemfinder.o(.rodata);
data/itemfinder.o(.rodata);
src/buy_menu_helpers.o(.rodata);
src/slot_machine.o(.rodata);
src/roamer.o(.rodata);
+1 -1
View File
@@ -833,7 +833,7 @@ s32 sub_80596FC(struct MapConnection *connection, s32 x, s32 y)
return FALSE;
}
struct MapConnection *sub_805973C(s16 x, s16 y)
struct MapConnection *GetMapConnectionAtPos(s16 x, s16 y)
{
s32 count;
struct MapConnection *connection;
+1 -1
View File
@@ -274,7 +274,7 @@ void ItemUseOnFieldCB_Rod(u8 taskId)
void ItemUseOutOfBattle_Itemfinder(u8 taskId)
{
IncrementGameStat(GAME_STAT_USED_ITEMFINDER);
sItemUseOnFieldCB = sub_813EC8C;
sItemUseOnFieldCB = ItemUseOnFieldCB_Itemfinder;
sub_80A103C(taskId);
}
+533 -78
View File
@@ -2,49 +2,153 @@
#include "task.h"
#include "new_menu_helpers.h"
#include "strings.h"
#include "event_scripts.h"
#include "map_obj_lock.h"
#include "script.h"
#include "sound.h"
#include "event_data.h"
#include "field_player_avatar.h"
#include "field_specials.h"
#include "fieldmap.h"
#include "itemfinder.h"
#include "constants/songs.h"
void sub_813ED18(u8 taskId);
void sub_813ED3C(u8 taskId);
void sub_813EDB0(u8 taskId);
bool8 sub_813EE14(struct MapEvents *events, u8 taskId);
void sub_813EF9C(u8 taskId);
void sub_813F108(u8 taskId);
void sub_813F220(u8 taskId, s16 dx, s16 dy);
u8 GetPlayerDirectionTowardsHiddenItem(s16 x, s16 y);
void sub_813F364(u8 taskId);
void sub_813F3A8(u8 taskId);
void sub_813F3EC(void);
void sub_813F40C(u8 palIdx, u8 direction);
u8 sub_813F5AC(void);
void sub_813EF40(u8 taskId, struct HiddenItemStruct hiddenItem);
static void Task_NoResponse_CleanUp(u8 taskId);
static void Task_ItemfinderResponseSoundsAndAnims(u8 taskId);
static void Task_ItemfinderUnderfootSoundsAndAnims(u8 taskId);
static bool8 HiddenItemIsWithinRangeOfPlayer(struct MapEvents *events, u8 taskId);
static void SetUnderfootHiddenItem(u8 taskId, struct HiddenItemStruct hiddenItem);
static void SetNormalHiddenItem(u8 taskId);
static void FindHiddenItemsInConnectedMaps(u8 taskId);
static void RegisterHiddenItemRelativeCoordsIfCloser(u8 taskId, s16 dx, s16 dy);
static u8 GetPlayerDirectionTowardsHiddenItem(s16 itemX, s16 itemY);
static void Task_ItemfinderResponsePrintMessage(u8 taskId);
static void Task_ItemfinderResponseCleanUp(u8 taskId);
static void Task_ItemfinderUnderfootPrintMessage(u8 taskId);
static void Task_ItemfinderUnderfootDigUpItem(u8 taskId);
static void DestroyArrowAndStarTiles(void);
static void LoadArrowAndStarTiles(void);
static void CreateArrowSprite(u8 animNum, u8 direction);
static void SpriteCallback_Arrow(struct Sprite * sprite);
static void SpriteCallback_DestroyArrow(struct Sprite * sprite);
static u8 CreateStarSprite(void);
static void SpriteCallback_Star(struct Sprite * sprite);
static void SpriteCallback_DestroyStar(struct Sprite * sprite);
void sub_813EC8C(u8 taskId)
#define ARROW_TILE_TAG 2000
static const u16 sArrowAndStarSpriteTiles[] = INCBIN_U16("data/itemfinder/spr_tiles.4bpp");
static const union AnimCmd sArrowAnim0[] = {
ANIMCMD_FRAME( 0, 10),
ANIMCMD_END
};
static const union AnimCmd sArrowAnim1[] = {
ANIMCMD_FRAME( 4, 10),
ANIMCMD_END
};
static const union AnimCmd sArrowAnim2[] = {
ANIMCMD_FRAME( 8, 10),
ANIMCMD_END
};
static const union AnimCmd sArrowAnim3[] = {
ANIMCMD_FRAME(12, 10),
ANIMCMD_END
};
static const union AnimCmd sStarAnim[] = {
ANIMCMD_FRAME(16, 10),
ANIMCMD_END
};
static const union AnimCmd *const sArrowAndStarSpriteAnimTable[] = {
sArrowAnim0,
sArrowAnim1,
sArrowAnim2,
sArrowAnim3,
sStarAnim
};
static const struct OamData sArrowAndStarSpriteOamData = {
.affineMode = ST_OAM_AFFINE_NORMAL,
.shape = ST_OAM_SQUARE,
.size = ST_OAM_SIZE_1
};
static const union AffineAnimCmd sAffineAnim_Left[] = {
AFFINEANIMCMD_FRAME(0, 0, 0x00, 1),
AFFINEANIMCMD_END
};
static const union AffineAnimCmd sAffineAnim_Down[] = {
AFFINEANIMCMD_FRAME(0, 0, 0x40, 1),
AFFINEANIMCMD_END
};
static const union AffineAnimCmd sAffineAnim_Right[] = {
AFFINEANIMCMD_FRAME(0, 0, 0x80, 1),
AFFINEANIMCMD_END
};
static const union AffineAnimCmd sAffineAnim_Up[] = {
AFFINEANIMCMD_FRAME(0, 0, 0xc0, 1),
AFFINEANIMCMD_END
};
static const union AffineAnimCmd *const sArrowAndStarSpriteAffineAnimTable[] = {
sAffineAnim_Left,
sAffineAnim_Down,
sAffineAnim_Right,
sAffineAnim_Up
};
static const struct SpriteTemplate gUnknown_84647E4 = {
.tileTag = ARROW_TILE_TAG,
.paletteTag = 0xFFFF,
.oam = &sArrowAndStarSpriteOamData,
.anims = sArrowAndStarSpriteAnimTable,
.affineAnims = sArrowAndStarSpriteAffineAnimTable,
.callback = SpriteCallback_Arrow
};
static const struct SpriteSheet sArrowAndStarSpriteSheet = {
.data = sArrowAndStarSpriteTiles,
.size = sizeof(sArrowAndStarSpriteTiles),
.tag = ARROW_TILE_TAG
};
#define tItemX data[0]
#define tItemY data[1]
#define tHiddenItemFound data[2]
#define tDingTimer data[3]
#define tNumDingsRemaining data[4]
#define tDingNum data[5]
#define tUnderfoot data[6]
#define tStartSpriteId data[7]
void ItemUseOnFieldCB_Itemfinder(u8 taskId)
{
u8 i;
for (i = 0; i < 16; i++)
gTasks[taskId].data[i] = 0;
if (sub_813EE14(gMapHeader.events, taskId) == TRUE)
if (HiddenItemIsWithinRangeOfPlayer(gMapHeader.events, taskId) == TRUE)
{
sub_813F3EC();
if (gTasks[taskId].data[6] == 1)
gTasks[taskId].func = sub_813EDB0;
LoadArrowAndStarTiles();
if (gTasks[taskId].tUnderfoot == TRUE)
gTasks[taskId].func = Task_ItemfinderUnderfootSoundsAndAnims;
else
gTasks[taskId].func = sub_813ED3C;
gTasks[taskId].func = Task_ItemfinderResponseSoundsAndAnims;
}
else
{
DisplayItemMessageOnField(taskId, 2, gText_NopeTheresNoResponse, sub_813ED18);
DisplayItemMessageOnField(taskId, 2, gText_NopeTheresNoResponse, Task_NoResponse_CleanUp);
}
}
void sub_813ED18(u8 taskId)
static void Task_NoResponse_CleanUp(u8 taskId)
{
ClearDialogWindowAndFrame(0, TRUE);
sub_80696C0();
@@ -52,66 +156,66 @@ void sub_813ED18(u8 taskId)
DestroyTask(taskId);
}
void sub_813ED3C(u8 taskId)
static void Task_ItemfinderResponseSoundsAndAnims(u8 taskId)
{
s16 * data = gTasks[taskId].data;
u8 direction;
if (data[3] % 25 == 0)
if (tDingTimer % 25 == 0)
{
direction = GetPlayerDirectionTowardsHiddenItem(data[0], data[1]);
if (data[4] == 0)
direction = GetPlayerDirectionTowardsHiddenItem(tItemX, tItemY);
if (tNumDingsRemaining == 0)
{
gTasks[taskId].func = sub_813F364;
gTasks[taskId].func = Task_ItemfinderResponsePrintMessage;
return;
}
else
{
PlaySE(SE_TOY_F);
sub_813F40C(data[5], direction);
data[5]++;
data[4]--;
CreateArrowSprite(tDingNum, direction);
tDingNum++;
tNumDingsRemaining--;
}
}
data[3]++;
tDingTimer++;
}
void sub_813EDB0(u8 taskId)
static void Task_ItemfinderUnderfootSoundsAndAnims(u8 taskId)
{
s16 * data = gTasks[taskId].data;
if (data[3] % 25 == 0)
if (tDingTimer % 25 == 0)
{
if (data[4] == 0)
if (tNumDingsRemaining == 0)
{
gTasks[taskId].func = sub_813F3A8;
gTasks[taskId].func = Task_ItemfinderUnderfootPrintMessage;
return;
}
else
{
PlaySE(SE_TOY_F);
data[7] = sub_813F5AC();
data[5]++;
data[4]--;
tStartSpriteId = CreateStarSprite();
tDingNum++;
tNumDingsRemaining--;
}
}
data[3]++;
tDingTimer++;
}
bool8 sub_813EE14(struct MapEvents *events, u8 taskId)
static bool8 HiddenItemIsWithinRangeOfPlayer(struct MapEvents *events, u8 taskId)
{
s16 x, y, i, dx, dy;
PlayerGetDestCoords(&x, &y);
gTasks[taskId].data[2] = 0;
gTasks[taskId].tHiddenItemFound = FALSE;
for (i = 0; i < events->bgEventCount; i++)
{
if (events->bgEvents[i].kind == 7 && !FlagGet(sub_80CC44C(events->bgEvents[i].bgUnion.hiddenItem, 1)))
if (events->bgEvents[i].kind == 7 && !FlagGet(GetHiddenItemAttr(events->bgEvents[i].bgUnion.hiddenItem, 1)))
{
dx = events->bgEvents[i].x + 7 - x;
dy = events->bgEvents[i].y + 7 - y;
if (sub_80CC44C(events->bgEvents[i].bgUnion.hiddenItem, 3) == TRUE)
if (GetHiddenItemAttr(events->bgEvents[i].bgUnion.hiddenItem, 3) == TRUE)
{
if (dx == 0 && dy == 0)
{
sub_813EF40(taskId, events->bgEvents[i].bgUnion.hiddenItem);
SetUnderfootHiddenItem(taskId, events->bgEvents[i].bgUnion.hiddenItem);
return TRUE;
}
}
@@ -122,69 +226,72 @@ bool8 sub_813EE14(struct MapEvents *events, u8 taskId)
&& dy <= 5
)
{
sub_813F220(taskId, dx, dy);
RegisterHiddenItemRelativeCoordsIfCloser(taskId, dx, dy);
}
}
}
sub_813F108(taskId);
if (gTasks[taskId].data[2] == 1)
FindHiddenItemsInConnectedMaps(taskId);
if (gTasks[taskId].tHiddenItemFound == TRUE)
{
sub_813EF9C(taskId);
SetNormalHiddenItem(taskId);
return TRUE;
}
return FALSE;
}
void sub_813EF40(u8 taskId, struct HiddenItemStruct hiddenItem)
static void SetUnderfootHiddenItem(u8 taskId, struct HiddenItemStruct hiddenItem)
{
s16 * data = gTasks[taskId].data;
gSpecialVar_0x8004 = sub_80CC44C(hiddenItem, 1);
gSpecialVar_0x8005 = sub_80CC44C(hiddenItem, 0);
gSpecialVar_0x8004 = GetHiddenItemAttr(hiddenItem, 1);
gSpecialVar_0x8005 = GetHiddenItemAttr(hiddenItem, 0);
gSpecialVar_0x8006 = 1;
TV_PrintIntToStringVar(0, gSpecialVar_0x8005);
data[2] = 1;
data[0] = 0;
data[1] = 0;
data[4] = 3;
data[6] = 1;
tHiddenItemFound = TRUE;
tItemX = 0;
tItemY = 0;
tNumDingsRemaining = 3;
tUnderfoot = TRUE;
}
void sub_813EF9C(u8 taskId)
static void SetNormalHiddenItem(u8 taskId)
{
s16 * data = gTasks[taskId].data;
s16 r3 = data[1];
s16 r2 = data[0];
if (data[0] == 0 && data[1] == 0)
data[4] = 4;
s16 absY = tItemY;
s16 absX = tItemX;
// The strength of the response increases inversely with distance to the item.
if (tItemX == 0 && tItemY == 0)
tNumDingsRemaining = 4;
else
{
if (data[0] < 0)
r2 = data[0] * -1;
if (data[1] < 0)
r3 = data[1] * -1;
if (r2 > r3)
if (tItemX < 0)
absX = tItemX * -1;
if (tItemY < 0)
absY = tItemY * -1;
if (absX > absY)
{
if (r2 > 3)
data[4] = 2;
if (absX > 3)
tNumDingsRemaining = 2;
else
data[4] = 4;
tNumDingsRemaining = 4;
}
else
{
if (r3 > 3)
data[4] = 2;
if (absY > 3)
tNumDingsRemaining = 2;
else
data[4] = 4;
tNumDingsRemaining = 4;
}
}
}
bool8 sub_813F004(struct MapEvents *events, s16 x, s16 y)
static bool8 HiddenItemAtPos(struct MapEvents *events, s16 x, s16 y)
{
s32 i;
u16 eventFlag;
s32 bgEventCount = events->bgEventCount;
u8 bgEventCount = events->bgEventCount;
struct BgEvent *bgEvents = events->bgEvents;
u16 eventFlag;
int i;
for (i = 0; i < bgEventCount; i++)
{
if (
@@ -193,8 +300,8 @@ bool8 sub_813F004(struct MapEvents *events, s16 x, s16 y)
&& y == bgEvents[i].y
)
{
eventFlag = sub_80CC44C(bgEvents[i].bgUnion.hiddenItem, 1);
if (sub_80CC44C(bgEvents[i].bgUnion.hiddenItem, 3) != TRUE && !FlagGet(eventFlag))
eventFlag = GetHiddenItemAttr(bgEvents[i].bgUnion.hiddenItem, 1);
if (GetHiddenItemAttr(bgEvents[i].bgUnion.hiddenItem, 3) != TRUE && !FlagGet(eventFlag))
return TRUE;
else
return FALSE;
@@ -202,3 +309,351 @@ bool8 sub_813F004(struct MapEvents *events, s16 x, s16 y)
}
return FALSE;
}
static bool8 HiddenItemInConnectedMapAtPos(struct MapConnection * connection, s32 x, s32 y)
{
const struct MapHeader *mapHeader;
u16 localX, localY;
u32 localOffset;
s32 localLength;
mapHeader = mapconnection_get_mapheader(connection);
switch (connection->direction)
{
// same weird temp variable behavior seen in HiddenItemAtPos
case 2:
localOffset = connection->offset + 7;
localX = x - localOffset;
localLength = mapHeader->mapData->height - 7;
localY = localLength + y; // additions are reversed for some reason
break;
case 1:
localOffset = connection->offset + 7;
localX = x - localOffset;
localLength = gMapHeader.mapData->height + 7;
localY = y - localLength;
break;
case 3:
localLength = mapHeader->mapData->width - 7;
localX = localLength + x; // additions are reversed for some reason
localOffset = connection->offset + 7;
localY = y - localOffset;
break;
case 4:
localLength = gMapHeader.mapData->width + 7;
localX = x - localLength;
localOffset = connection->offset + 7;
localY = y - localOffset;
break;
default:
return FALSE;
}
return HiddenItemAtPos(mapHeader->events, localX, localY);
}
static void FindHiddenItemsInConnectedMaps(u8 taskId)
{
s16 x, y;
s16 curX, curY;
s16 width = gMapHeader.mapData->width + 7;
s16 height = gMapHeader.mapData->height + 7;
s16 var1 = 7;
s16 var2 = 7;
PlayerGetDestCoords(&x, &y);
for (curX = x - 7; curX <= x + 7; curX++)
{
for (curY = y - 5; curY <= y + 5; curY++)
{
if (var1 > curX
|| curX >= width
|| var2 > curY
|| curY >= height)
{
struct MapConnection *conn = GetMapConnectionAtPos(curX, curY);
if (conn != NULL && HiddenItemInConnectedMapAtPos(conn, curX, curY) == TRUE)
RegisterHiddenItemRelativeCoordsIfCloser(taskId, curX - x, curY - y);
}
}
}
}
static void RegisterHiddenItemRelativeCoordsIfCloser(u8 taskId, s16 dx, s16 dy)
{
s16 *data = gTasks[taskId].data;
s16 dx2, dy2, dx3, dy3;
if (tHiddenItemFound == FALSE)
{
tItemX = dx;
tItemY = dy;
tHiddenItemFound = TRUE;
}
else
{
// tItemX and tItemY contain the player's coordinates.
// dx and dy contain the item's coordinates.
if (tItemX < 0)
dx2 = tItemX * -1; // item is to the left
else
dx2 = tItemX; // item is to the right
if (tItemY < 0)
dy2 = tItemY * -1; // item is to the north
else
dy2 = tItemY; // item is to the south
if (dx < 0)
dx3 = dx * -1;
else
dx3 = dx;
if (dy < 0)
dy3 = dy * -1;
else
dy3 = dy;
if (dx2 + dy2 > dx3 + dy3)
{
tItemX = dx;
tItemY = dy;
}
else
{
if (dx2 + dy2 == dx3 + dy3 && (dy2 > dy3 || (dy2 == dy3 && tItemY < dy)))
{
tItemX = dx;
tItemY = dy;
}
}
}
}
static u8 GetPlayerDirectionTowardsHiddenItem(s16 itemX, s16 itemY)
{
s16 abX, abY;
if (itemX == 0 && itemY == 0)
return DIR_NONE; // player is standing on the item.
// get absolute X distance.
if (itemX < 0)
abX = itemX * -1;
else
abX = itemX;
// get absolute Y distance.
if (itemY < 0)
abY = itemY * -1;
else
abY = itemY;
if (abX > abY)
{
if (itemX < 0)
return DIR_EAST;
else
return DIR_NORTH;
}
else
{
if (abX < abY)
{
if (itemY < 0)
return DIR_SOUTH;
else
return DIR_WEST;
}
if (abX == abY)
{
if (itemY < 0)
return DIR_SOUTH;
else
return DIR_WEST;
}
return DIR_NONE; // should never get here. return something so it doesnt crash.
}
}
static void Task_ItemfinderResponsePrintMessage(u8 taskId)
{
DisplayItemMessageOnField(taskId, 2, gText_ItemfinderResponding, Task_ItemfinderResponseCleanUp);
}
static void Task_ItemfinderResponseCleanUp(u8 taskId)
{
DestroyArrowAndStarTiles();
ClearDialogWindowAndFrame(0, TRUE);
sub_80696C0();
ScriptContext2_Disable();
DestroyTask(taskId);
}
static void Task_ItemfinderUnderfootPrintMessage(u8 taskId)
{
DisplayItemMessageOnField(taskId, 2, gText_ItemfinderShakingWildly, Task_ItemfinderUnderfootDigUpItem);
}
static void Task_ItemfinderUnderfootDigUpItem(u8 taskId)
{
DestroyArrowAndStarTiles();
DestroyTask(taskId);
ScriptContext1_SetupScript(EventScript_ItemfinderDigUpUnderfootItem);
ScriptContext2_Enable();
}
#undef tStartSpriteId
#undef tUnderfoot
#undef tDingNum
#undef tNumDingsRemaining
#undef tDingTimer
#undef tHiddenItemFound
#undef tItemY
#undef tItemX
#define spData0 data[0]
#define spDeltaX data[1]
#define spDeltaY data[2]
#define spCurX data[3]
#define spCurY data[4]
#define spCenterX data[5]
#define spCenterY data[6]
#define spAnimNum data[7]
static void LoadArrowAndStarTiles(void)
{
LoadSpriteSheet(&sArrowAndStarSpriteSheet);
}
static void DestroyArrowAndStarTiles(void)
{
FreeSpriteTilesByTag(ARROW_TILE_TAG);
}
static void CreateArrowSprite(u8 animNum, u8 direction)
{
u8 spriteId = CreateSprite(&gUnknown_84647E4, 120, 76, 0);
gSprites[spriteId].oam.paletteNum = 0;
StartSpriteAnim(&gSprites[spriteId], animNum);
gSprites[spriteId].spAnimNum = animNum;
gSprites[spriteId].spData0 = 0;
gSprites[spriteId].spCurX = 0;
gSprites[spriteId].spCurY = 0;
gSprites[spriteId].spCenterX = 120;
gSprites[spriteId].spCenterY = 76;
switch (direction)
{
case DIR_NONE:
switch (GetPlayerFacingDirection())
{
case DIR_WEST:
gSprites[spriteId].spDeltaX = -100;
gSprites[spriteId].spDeltaY = 0;
StartSpriteAffineAnim(&gSprites[spriteId], 0);
break;
case DIR_NORTH:
gSprites[spriteId].spDeltaX = 0;
gSprites[spriteId].spDeltaY = -100;
StartSpriteAffineAnim(&gSprites[spriteId], 3);
break;
case DIR_EAST:
gSprites[spriteId].spDeltaX = 100;
gSprites[spriteId].spDeltaY = 0;
StartSpriteAffineAnim(&gSprites[spriteId], 2);
break;
case DIR_SOUTH:
gSprites[spriteId].spDeltaX = 0;
gSprites[spriteId].spDeltaY = 100;
StartSpriteAffineAnim(&gSprites[spriteId], 1);
break;
}
break;
case DIR_SOUTH:
gSprites[spriteId].spDeltaX = 0;
gSprites[spriteId].spDeltaY = -100;
StartSpriteAffineAnim(&gSprites[spriteId], 3);
break;
case DIR_NORTH:
gSprites[spriteId].spDeltaX = 100;
gSprites[spriteId].spDeltaY = 0;
StartSpriteAffineAnim(&gSprites[spriteId], 2);
break;
case DIR_WEST:
gSprites[spriteId].spDeltaX = 0;
gSprites[spriteId].spDeltaY = 100;
StartSpriteAffineAnim(&gSprites[spriteId], 1);
break;
case DIR_EAST:
gSprites[spriteId].spDeltaX = -100;
gSprites[spriteId].spDeltaY = 0;
break;
}
}
static void SpriteCallback_Arrow(struct Sprite * sprite)
{
s16 x, y;
sprite->spCurX += sprite->spDeltaX;
sprite->spCurY += sprite->spDeltaY;
sprite->pos1.x = sprite->spCenterX + (sprite->spCurX >> 8);
sprite->pos1.y = sprite->spCenterY + (sprite->spCurY >> 8);
if (sprite->pos1.x <= 104
|| sprite->pos1.x > 132
|| sprite->pos1.y <= 60
|| sprite->pos1.y > 88)
sprite->callback = SpriteCallback_DestroyArrow;
}
static void SpriteCallback_DestroyArrow(struct Sprite * sprite)
{
FreeSpriteOamMatrix(sprite);
DestroySprite(sprite);
}
static u8 CreateStarSprite(void)
{
u8 spriteId = CreateSprite(&gUnknown_84647E4, 120, 76, 0);
gSprites[spriteId].oam.paletteNum = 0;
gSprites[spriteId].callback = SpriteCallback_Star;
StartSpriteAnim(&gSprites[spriteId], 4);
gSprites[spriteId].spAnimNum = 0;
gSprites[spriteId].spData0 = 0;
gSprites[spriteId].spCurX = 0;
gSprites[spriteId].spCurY = 0;
gSprites[spriteId].spCenterX = 120;
gSprites[spriteId].spCenterY = 76;
gSprites[spriteId].spDeltaX = 0;
gSprites[spriteId].spDeltaY = -100;
return spriteId;
}
static void SpriteCallback_Star(struct Sprite * sprite)
{
s16 x, y;
sprite->spCurX += sprite->spDeltaX;
sprite->spCurY += sprite->spDeltaY;
sprite->pos1.x = sprite->spCenterX + (sprite->spCurX >> 8);
sprite->pos1.y = sprite->spCenterY + (sprite->spCurY >> 8);
if (sprite->pos1.x <= 104
|| sprite->pos1.x > 132
|| sprite->pos1.y <= 60
|| sprite->pos1.y > 88)
sprite->callback = SpriteCallback_DestroyStar;
}
static void SpriteCallback_DestroyStar(struct Sprite * sprite)
{
DestroySprite(sprite);
}
#undef spAnimNum
#undef spCenterY
#undef spCenterX
#undef spCurY
#undef spCurX
#undef spDeltaY
#undef spDeltaX
#undef spData0