summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/field_map_obj.s992
-rw-r--r--include/asm.inc.h9
-rw-r--r--include/global.fieldmap.h34
-rw-r--r--include/sprite.h2
-rw-r--r--src/field_map_obj.c298
-rw-r--r--src/field_player_avatar.c32
-rw-r--r--src/sprite.c2
7 files changed, 337 insertions, 1032 deletions
diff --git a/asm/field_map_obj.s b/asm/field_map_obj.s
index 8d0520bb1..b50b6f2d1 100644
--- a/asm/field_map_obj.s
+++ b/asm/field_map_obj.s
@@ -6,998 +6,6 @@
.text
- thumb_func_start sub_805AFCC
-sub_805AFCC: @ 805AFCC
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- adds r7, r1, 0
- adds r1, r2, 0
- adds r2, r3, 0
- ldr r3, [sp, 0x20]
- ldr r4, [sp, 0x24]
- lsls r1, 24
- lsrs r1, 24
- lsls r2, 24
- lsrs r2, 24
- lsls r3, 16
- lsrs r3, 16
- mov r9, r3
- lsls r4, 16
- lsrs r4, 16
- mov r10, r4
- bl InitFieldObjectStateFromTemplate
- lsls r0, 24
- lsrs r0, 24
- mov r8, r0
- cmp r0, 0x10
- bne _0805B006
- movs r0, 0x10
- b _0805B154
-_0805B006:
- mov r0, r8
- lsls r4, r0, 3
- adds r0, r4, r0
- lsls r0, 2
- ldr r1, _0805B030 @ =gMapObjects
- adds r5, r0, r1
- ldrb r0, [r5, 0x5]
- bl GetFieldObjectGraphicsInfo
- adds r6, r0, 0
- ldrb r1, [r6, 0xC]
- movs r0, 0xF
- ands r0, r1
- cmp r0, 0
- bne _0805B034
- ldrh r0, [r6, 0x2]
- lsls r1, 28
- lsrs r1, 28
- bl npc_load_two_palettes__no_record
- b _0805B042
- .align 2, 0
-_0805B030: .4byte gMapObjects
-_0805B034:
- cmp r0, 0xA
- bne _0805B042
- ldrh r0, [r6, 0x2]
- lsls r1, 28
- lsrs r1, 28
- bl npc_load_two_palettes__and_record
-_0805B042:
- ldrb r0, [r5, 0x6]
- cmp r0, 0x4C
- bne _0805B050
- ldrb r0, [r5, 0x1]
- movs r1, 0x20
- orrs r0, r1
- strb r0, [r5, 0x1]
-_0805B050:
- ldr r1, _0805B084 @ =0x0000ffff
- adds r0, r1, 0
- strh r0, [r7, 0x2]
- adds r0, r7, 0
- movs r1, 0
- movs r2, 0
- movs r3, 0
- bl CreateSprite
- lsls r0, 24
- lsrs r7, r0, 24
- cmp r7, 0x40
- bne _0805B08C
- ldr r0, _0805B088 @ =gMapObjects
- mov r2, r8
- adds r1, r4, r2
- lsls r1, 2
- adds r1, r0
- ldrb r2, [r1]
- movs r0, 0x2
- negs r0, r0
- ands r0, r2
- strb r0, [r1]
- movs r0, 0x10
- b _0805B154
- .align 2, 0
-_0805B084: .4byte 0x0000ffff
-_0805B088: .4byte gMapObjects
-_0805B08C:
- lsls r0, r7, 4
- adds r0, r7
- lsls r0, 2
- ldr r1, _0805B164 @ =gSprites
- adds r4, r0, r1
- mov r1, r9
- lsls r0, r1, 16
- asrs r0, 16
- ldrh r2, [r5, 0x10]
- adds r0, r2
- lsls r0, 16
- asrs r0, 16
- mov r2, r10
- lsls r1, r2, 16
- asrs r1, 16
- ldrh r2, [r5, 0x12]
- adds r1, r2
- lsls r1, 16
- asrs r1, 16
- adds r2, r4, 0
- adds r2, 0x20
- adds r3, r4, 0
- adds r3, 0x22
- bl sub_8060388
- ldrh r0, [r6, 0x8]
- lsls r0, 16
- asrs r0, 17
- negs r0, r0
- adds r1, r4, 0
- adds r1, 0x28
- strb r0, [r1]
- ldrh r0, [r6, 0xA]
- lsls r0, 16
- asrs r0, 17
- negs r0, r0
- adds r2, r4, 0
- adds r2, 0x29
- strb r0, [r2]
- ldrh r0, [r4, 0x20]
- adds r0, 0x8
- strh r0, [r4, 0x20]
- ldrh r1, [r4, 0x22]
- adds r1, 0x10
- movs r0, 0
- ldrsb r0, [r2, r0]
- adds r0, r1
- strh r0, [r4, 0x22]
- ldrb r1, [r6, 0xC]
- lsls r1, 28
- lsrs r1, 24
- ldrb r2, [r4, 0x5]
- movs r0, 0xF
- ands r0, r2
- orrs r0, r1
- strb r0, [r4, 0x5]
- adds r2, r4, 0
- adds r2, 0x3E
- ldrb r0, [r2]
- movs r1, 0x2
- orrs r0, r1
- strb r0, [r2]
- mov r0, r8
- strh r0, [r4, 0x2E]
- strb r7, [r5, 0x4]
- ldrb r1, [r6, 0xC]
- lsls r1, 25
- lsrs r1, 31
- lsls r1, 4
- ldrb r2, [r5, 0x1]
- movs r0, 0x11
- negs r0, r0
- ands r0, r2
- orrs r0, r1
- strb r0, [r5, 0x1]
- lsls r0, 27
- cmp r0, 0
- blt _0805B13E
- ldrb r0, [r5, 0x18]
- lsls r0, 28
- lsrs r0, 28
- bl FieldObjectDirectionToImageAnimId
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl StartSpriteAnim
-_0805B13E:
- ldrb r0, [r5, 0xB]
- lsrs r0, 4
- adds r1, r4, 0
- movs r2, 0x1
- bl SetObjectSubpriorityByZCoord
- adds r0, r5, 0
- adds r1, r4, 0
- bl sub_80634D0
- mov r0, r8
-_0805B154:
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_0805B164: .4byte gSprites
- thumb_func_end sub_805AFCC
-
- thumb_func_start SpawnFieldObject
-SpawnFieldObject: @ 805B168
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- sub sp, 0x2C
- mov r9, r0
- adds r6, r1, 0
- mov r8, r2
- adds r4, r3, 0
- ldr r5, [sp, 0x48]
- lsls r6, 24
- lsrs r6, 24
- mov r0, r8
- lsls r0, 24
- lsrs r0, 24
- mov r8, r0
- lsls r4, 16
- lsrs r4, 16
- lsls r5, 16
- lsrs r5, 16
- movs r0, 0
- str r0, [sp, 0x20]
- mov r1, r9
- ldrb r0, [r1, 0x1]
- bl GetFieldObjectGraphicsInfo
- adds r7, r0, 0
- add r2, sp, 0x20
- mov r0, r9
- add r1, sp, 0x8
- bl MakeObjectTemplateFromFieldObjectTemplate
- ldrh r3, [r7, 0x6]
- ldr r2, _0805B1E0 @ =0xffff0000
- add r1, sp, 0x24
- ldr r0, [r1, 0x4]
- ands r0, r2
- orrs r0, r3
- str r0, [r1, 0x4]
- str r1, [sp, 0x14]
- lsls r4, 16
- asrs r4, 16
- str r4, [sp]
- lsls r5, 16
- asrs r5, 16
- str r5, [sp, 0x4]
- mov r0, r9
- add r1, sp, 0x8
- adds r2, r6, 0
- mov r3, r8
- bl sub_805AFCC
- lsls r0, 24
- lsrs r2, r0, 24
- adds r5, r2, 0
- cmp r2, 0x10
- bne _0805B1E4
- movs r0, 0x10
- b _0805B21A
- .align 2, 0
-_0805B1E0: .4byte 0xffff0000
-_0805B1E4:
- ldr r4, _0805B228 @ =gSprites
- ldr r1, _0805B22C @ =gMapObjects
- lsls r0, r2, 3
- adds r0, r2
- lsls r0, 2
- adds r3, r0, r1
- ldrb r1, [r3, 0x4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r1, r4, 0
- adds r1, 0xC
- adds r0, r1
- ldr r1, [r7, 0x1C]
- str r1, [r0]
- ldr r2, [sp, 0x20]
- cmp r2, 0
- beq _0805B218
- ldrb r1, [r3, 0x4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r4
- adds r1, r2, 0
- bl SetSubspriteTables
-_0805B218:
- adds r0, r5, 0
-_0805B21A:
- add sp, 0x2C
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_0805B228: .4byte gSprites
-_0805B22C: .4byte gMapObjects
- thumb_func_end SpawnFieldObject
-
- thumb_func_start SpawnSpecialFieldObject
-SpawnSpecialFieldObject: @ 805B230
- push {r4-r6,lr}
- sub sp, 0x8
- adds r5, r0, 0
- mov r4, sp
- adds r4, 0x6
- add r0, sp, 0x4
- adds r1, r4, 0
- bl GetFieldObjectMovingCameraOffset
- ldr r0, _0805B268 @ =gSaveBlock1
- ldrb r1, [r0, 0x5]
- ldrb r2, [r0, 0x4]
- add r0, sp, 0x4
- movs r6, 0
- ldrsh r3, [r0, r6]
- movs r6, 0
- ldrsh r0, [r4, r6]
- str r0, [sp]
- adds r0, r5, 0
- bl SpawnFieldObject
- lsls r0, 24
- lsrs r0, 24
- add sp, 0x8
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_0805B268: .4byte gSaveBlock1
- thumb_func_end SpawnSpecialFieldObject
-
- thumb_func_start SpawnSpecialFieldObjectParametrized
-SpawnSpecialFieldObjectParametrized: @ 805B26C
- push {r4-r6,lr}
- mov r6, r8
- push {r6}
- sub sp, 0x18
- ldr r4, [sp, 0x2C]
- ldr r5, [sp, 0x30]
- mov r8, r5
- lsls r0, 24
- lsrs r0, 24
- lsls r3, 16
- ldr r5, _0805B2D0 @ =0xfff90000
- adds r3, r5
- lsrs r3, 16
- lsls r4, 16
- adds r4, r5
- lsrs r4, 16
- mov r5, sp
- movs r6, 0
- strb r2, [r5]
- mov r2, sp
- strb r0, [r2, 0x1]
- mov r0, sp
- strb r6, [r0, 0x2]
- movs r5, 0
- strh r3, [r0, 0x4]
- strh r4, [r0, 0x6]
- mov r2, r8
- strb r2, [r0, 0x8]
- strb r1, [r0, 0x9]
- mov r2, sp
- ldrb r1, [r2, 0xA]
- movs r0, 0x10
- negs r0, r0
- ands r0, r1
- strb r0, [r2, 0xA]
- mov r0, sp
- strb r5, [r0, 0xA]
- strh r6, [r0, 0xC]
- strh r6, [r0, 0xE]
- bl SpawnSpecialFieldObject
- lsls r0, 24
- lsrs r0, 24
- add sp, 0x18
- pop {r3}
- mov r8, r3
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_0805B2D0: .4byte 0xfff90000
- thumb_func_end SpawnSpecialFieldObjectParametrized
-
- thumb_func_start show_sprite
-show_sprite: @ 805B2D4
- push {r4-r7,lr}
- sub sp, 0x8
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r7, r1, 24
- lsls r2, 24
- lsrs r6, r2, 24
- adds r1, r7, 0
- adds r2, r6, 0
- bl GetFieldObjectTemplateByLocalIdAndMap
- adds r5, r0, 0
- cmp r5, 0
- beq _0805B31A
- mov r4, sp
- adds r4, 0x6
- add r0, sp, 0x4
- adds r1, r4, 0
- bl GetFieldObjectMovingCameraOffset
- add r0, sp, 0x4
- movs r1, 0
- ldrsh r3, [r0, r1]
- movs r1, 0
- ldrsh r0, [r4, r1]
- str r0, [sp]
- adds r0, r5, 0
- adds r1, r7, 0
- adds r2, r6, 0
- bl SpawnFieldObject
- lsls r0, 24
- lsrs r0, 24
- b _0805B31C
-_0805B31A:
- movs r0, 0x10
-_0805B31C:
- add sp, 0x8
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end show_sprite
-
- thumb_func_start MakeObjectTemplateFromFieldObjectGraphicsInfo
-MakeObjectTemplateFromFieldObjectGraphicsInfo: @ 805B324
- push {r4-r6,lr}
- adds r5, r1, 0
- adds r4, r2, 0
- adds r6, r3, 0
- lsls r0, 24
- lsrs r0, 24
- bl GetFieldObjectGraphicsInfo
- ldrh r1, [r0]
- strh r1, [r4]
- ldrh r1, [r0, 0x2]
- strh r1, [r4, 0x2]
- ldr r1, [r0, 0x10]
- str r1, [r4, 0x4]
- ldr r1, [r0, 0x18]
- str r1, [r4, 0x8]
- ldr r1, [r0, 0x1C]
- str r1, [r4, 0xC]
- ldr r1, [r0, 0x20]
- str r1, [r4, 0x10]
- str r5, [r4, 0x14]
- ldr r0, [r0, 0x14]
- str r0, [r6]
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end MakeObjectTemplateFromFieldObjectGraphicsInfo
-
- thumb_func_start MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex
-MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex: @ 805B358
- push {r4,lr}
- lsls r0, 16
- lsrs r0, 16
- lsls r1, 16
- ldr r4, _0805B374 @ =gUnknown_0836DA88
- lsrs r1, 14
- adds r1, r4
- ldr r1, [r1]
- bl MakeObjectTemplateFromFieldObjectGraphicsInfo
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0805B374: .4byte gUnknown_0836DA88
- thumb_func_end MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex
-
- thumb_func_start MakeObjectTemplateFromFieldObjectTemplate
-MakeObjectTemplateFromFieldObjectTemplate: @ 805B378
- push {r4,r5,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- adds r3, r2, 0
- ldrb r0, [r4, 0x1]
- ldrb r1, [r4, 0x9]
- adds r2, r5, 0
- bl MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end MakeObjectTemplateFromFieldObjectTemplate
-
- thumb_func_start AddPseudoFieldObject
-AddPseudoFieldObject: @ 805B390
- push {r4-r6,lr}
- sub sp, 0x1C
- ldr r4, [sp, 0x2C]
- lsls r0, 16
- lsrs r0, 16
- lsls r2, 16
- lsrs r6, r2, 16
- lsls r3, 16
- lsrs r5, r3, 16
- lsls r4, 24
- lsrs r4, 24
- add r3, sp, 0x18
- mov r2, sp
- bl MakeObjectTemplateFromFieldObjectGraphicsInfo
- mov r0, sp
- ldrh r1, [r0, 0x2]
- ldr r0, _0805B408 @ =0x0000ffff
- cmp r1, r0
- beq _0805B3C0
- mov r0, sp
- ldrh r0, [r0, 0x2]
- bl sub_805BDF8
-_0805B3C0:
- lsls r1, r6, 16
- asrs r1, 16
- lsls r2, r5, 16
- asrs r2, 16
- mov r0, sp
- adds r3, r4, 0
- bl CreateSprite
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0x40
- beq _0805B3FC
- ldr r1, [sp, 0x18]
- cmp r1, 0
- beq _0805B3FC
- lsls r4, r5, 4
- adds r4, r5
- lsls r4, 2
- ldr r0, _0805B40C @ =gSprites
- adds r4, r0
- adds r0, r4, 0
- bl SetSubspriteTables
- adds r4, 0x42
- ldrb r1, [r4]
- movs r0, 0x3F
- ands r0, r1
- movs r1, 0x80
- orrs r0, r1
- strb r0, [r4]
-_0805B3FC:
- adds r0, r5, 0
- add sp, 0x1C
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_0805B408: .4byte 0x0000ffff
-_0805B40C: .4byte gSprites
- thumb_func_end AddPseudoFieldObject
-
- thumb_func_start sub_805B410
-sub_805B410: @ 805B410
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x24
- adds r5, r0, 0
- ldr r0, [sp, 0x44]
- ldr r4, [sp, 0x48]
- lsls r5, 24
- lsrs r5, 24
- lsls r1, 24
- lsrs r1, 24
- mov r10, r1
- add r1, sp, 0x18
- mov r8, r1
- strh r2, [r1]
- mov r6, sp
- adds r6, 0x1A
- strh r3, [r6]
- lsls r0, 24
- lsrs r7, r0, 24
- mov r9, r7
- lsls r4, 24
- lsrs r4, 24
- str r4, [sp, 0x20]
- adds r0, r5, 0
- bl GetFieldObjectGraphicsInfo
- adds r4, r0, 0
- ldr r1, _0805B550 @ =sub_8064970
- add r3, sp, 0x1C
- adds r0, r5, 0
- mov r2, sp
- bl MakeObjectTemplateFromFieldObjectGraphicsInfo
- mov r1, sp
- ldr r2, _0805B554 @ =0x0000ffff
- adds r0, r2, 0
- strh r0, [r1, 0x2]
- mov r1, r8
- movs r2, 0
- ldrsh r0, [r1, r2]
- adds r0, 0x7
- strh r0, [r1]
- movs r1, 0
- ldrsh r0, [r6, r1]
- adds r0, 0x7
- strh r0, [r6]
- mov r0, r8
- adds r1, r6, 0
- movs r2, 0x8
- movs r3, 0x10
- bl sub_8060470
- mov r2, r8
- movs r0, 0
- ldrsh r1, [r2, r0]
- movs r0, 0
- ldrsh r2, [r6, r0]
- mov r0, sp
- movs r3, 0
- bl CreateSpriteAtEnd
- lsls r0, 24
- lsrs r6, r0, 24
- cmp r6, 0x40
- beq _0805B53C
- lsls r0, r6, 4
- adds r0, r6
- lsls r0, 2
- ldr r1, _0805B558 @ =gSprites
- adds r5, r0, r1
- ldrh r0, [r4, 0x8]
- lsls r0, 16
- asrs r0, 17
- negs r0, r0
- adds r1, r5, 0
- adds r1, 0x28
- strb r0, [r1]
- ldrh r0, [r4, 0xA]
- lsls r0, 16
- asrs r0, 17
- negs r0, r0
- adds r1, 0x1
- strb r0, [r1]
- movs r0, 0
- ldrsb r0, [r1, r0]
- ldrh r1, [r5, 0x22]
- adds r0, r1
- strh r0, [r5, 0x22]
- ldrb r1, [r4, 0xC]
- lsls r1, 28
- lsrs r1, 24
- ldrb r3, [r5, 0x5]
- movs r2, 0xF
- adds r0, r2, 0
- ands r0, r3
- orrs r0, r1
- strb r0, [r5, 0x5]
- adds r3, r5, 0
- adds r3, 0x3E
- ldrb r0, [r3]
- movs r1, 0x2
- orrs r0, r1
- strb r0, [r3]
- mov r0, r10
- strh r0, [r5, 0x2E]
- strh r7, [r5, 0x30]
- ldrb r1, [r4, 0xC]
- ands r2, r1
- cmp r2, 0xA
- bne _0805B4FC
- ldrh r0, [r4, 0x2]
- lsls r1, 28
- lsrs r1, 28
- bl npc_load_two_palettes__and_record
-_0805B4FC:
- ldr r1, [sp, 0x1C]
- cmp r1, 0
- beq _0805B518
- adds r0, r5, 0
- bl SetSubspriteTables
- adds r2, r5, 0
- adds r2, 0x42
- ldrb r0, [r2]
- movs r1, 0x3F
- ands r1, r0
- movs r0, 0x80
- orrs r1, r0
- strb r1, [r2]
-_0805B518:
- adds r0, r5, 0
- mov r1, r9
- bl InitObjectPriorityByZCoord
- mov r0, r9
- adds r1, r5, 0
- movs r2, 0x1
- bl SetObjectSubpriorityByZCoord
- ldr r0, [sp, 0x20]
- bl FieldObjectDirectionToImageAnimId
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r5, 0
- bl StartSpriteAnim
-_0805B53C:
- adds r0, r6, 0
- add sp, 0x24
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_0805B550: .4byte sub_8064970
-_0805B554: .4byte 0x0000ffff
-_0805B558: .4byte gSprites
- thumb_func_end sub_805B410
-
- thumb_func_start sub_805B55C
-sub_805B55C: @ 805B55C
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x10
- lsls r0, 16
- lsrs r3, r0, 16
- lsls r1, 16
- lsrs r1, 16
- str r1, [sp, 0x4]
- ldr r0, _0805B628 @ =gMapHeader
- ldr r5, [r0, 0x4]
- cmp r5, 0
- beq _0805B618
- ldr r4, _0805B62C @ =gSaveBlock1
- ldrh r0, [r4]
- subs r1, r0, 0x2
- lsls r1, 16
- lsrs r1, 16
- adds r0, 0x11
- lsls r0, 16
- lsrs r0, 16
- str r0, [sp, 0x8]
- ldrh r2, [r4, 0x2]
- adds r0, r2, 0
- adds r0, 0x10
- lsls r0, 16
- lsrs r0, 16
- str r0, [sp, 0xC]
- ldrb r6, [r5]
- movs r5, 0
- cmp r5, r6
- bcs _0805B618
- lsls r0, r2, 16
- asrs r0, 16
- mov r10, r0
- adds r7, r4, 0
- lsls r0, r1, 16
- asrs r0, 16
- mov r9, r0
- lsls r3, 16
- mov r8, r3
-_0805B5B2:
- lsls r0, r5, 1
- adds r0, r5
- lsls r0, 3
- ldr r1, _0805B630 @ =gSaveBlock1 + 0xC20
- adds r4, r0, r1
- ldrh r0, [r4, 0x4]
- adds r0, 0x7
- lsls r0, 16
- lsrs r2, r0, 16
- ldrh r0, [r4, 0x6]
- adds r0, 0x7
- lsls r0, 16
- asrs r1, r0, 16
- cmp r10, r1
- bgt _0805B60E
- ldr r3, [sp, 0xC]
- lsls r0, r3, 16
- asrs r0, 16
- cmp r0, r1
- blt _0805B60E
- lsls r0, r2, 16
- asrs r1, r0, 16
- cmp r9, r1
- bgt _0805B60E
- ldr r2, [sp, 0x8]
- lsls r0, r2, 16
- asrs r0, 16
- cmp r0, r1
- blt _0805B60E
- ldrh r0, [r4, 0x14]
- bl FlagGet
- lsls r0, 24
- cmp r0, 0
- bne _0805B60E
- ldrb r1, [r7, 0x5]
- ldrb r2, [r7, 0x4]
- ldr r3, [sp, 0x4]
- lsls r0, r3, 16
- asrs r0, 16
- str r0, [sp]
- adds r0, r4, 0
- mov r4, r8
- asrs r3, r4, 16
- bl SpawnFieldObject
-_0805B60E:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, r6
- bcc _0805B5B2
-_0805B618:
- add sp, 0x10
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0805B628: .4byte gMapHeader
-_0805B62C: .4byte gSaveBlock1
-_0805B630: .4byte gSaveBlock1 + 0xC20
- thumb_func_end sub_805B55C
-
- thumb_func_start RemoveFieldObjectsOutsideView
-RemoveFieldObjectsOutsideView: @ 805B634
- push {r4-r6,lr}
- movs r3, 0
- ldr r6, _0805B688 @ =gLinkPlayerMapObjects
-_0805B63A:
- movs r2, 0
- movs r4, 0
- adds r5, r3, 0x1
-_0805B640:
- lsls r0, r2, 2
- adds r1, r0, r6
- ldrb r0, [r1]
- cmp r0, 0
- beq _0805B652
- ldrb r1, [r1, 0x2]
- cmp r3, r1
- bne _0805B652
- movs r4, 0x1
-_0805B652:
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x3
- bls _0805B640
- cmp r4, 0
- bne _0805B67A
- lsls r0, r3, 3
- adds r0, r3
- lsls r0, 2
- ldr r1, _0805B68C @ =gMapObjects
- adds r2, r0, r1
- ldr r0, [r2]
- ldr r1, _0805B690 @ =0x00010001
- ands r0, r1
- cmp r0, 0x1
- bne _0805B67A
- adds r0, r2, 0
- bl RemoveFieldObjectIfOutsideView
-_0805B67A:
- lsls r0, r5, 24
- lsrs r3, r0, 24
- cmp r3, 0xF
- bls _0805B63A
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0805B688: .4byte gLinkPlayerMapObjects
-_0805B68C: .4byte gMapObjects
-_0805B690: .4byte 0x00010001
- thumb_func_end RemoveFieldObjectsOutsideView
-
- thumb_func_start RemoveFieldObjectIfOutsideView
-RemoveFieldObjectIfOutsideView: @ 805B694
- push {r4-r7,lr}
- adds r3, r0, 0
- ldr r2, _0805B70C @ =gSaveBlock1
- ldrh r0, [r2]
- subs r1, r0, 0x2
- lsls r1, 16
- adds r0, 0x11
- lsls r0, 16
- lsrs r5, r0, 16
- ldrh r4, [r2, 0x2]
- adds r0, r4, 0
- adds r0, 0x10
- lsls r0, 16
- lsrs r6, r0, 16
- movs r0, 0x10
- ldrsh r2, [r3, r0]
- lsrs r7, r1, 16
- asrs r1, 16
- cmp r2, r1
- blt _0805B6D8
- lsls r0, r5, 16
- asrs r0, 16
- cmp r2, r0
- bgt _0805B6D8
- movs r0, 0x12
- ldrsh r1, [r3, r0]
- lsls r0, r4, 16
- asrs r0, 16
- cmp r1, r0
- blt _0805B6D8
- lsls r0, r6, 16
- asrs r0, 16
- cmp r1, r0
- ble _0805B706
-_0805B6D8:
- movs r0, 0xC
- ldrsh r1, [r3, r0]
- lsls r0, r7, 16
- asrs r0, 16
- cmp r1, r0
- blt _0805B700
- lsls r0, r5, 16
- asrs r0, 16
- cmp r1, r0
- bgt _0805B700
- movs r0, 0xE
- ldrsh r1, [r3, r0]
- lsls r0, r4, 16
- asrs r0, 16
- cmp r1, r0
- blt _0805B700
- lsls r0, r6, 16
- asrs r0, 16
- cmp r1, r0
- ble _0805B706
-_0805B700:
- adds r0, r3, 0
- bl RemoveFieldObject
-_0805B706:
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0805B70C: .4byte gSaveBlock1
- thumb_func_end RemoveFieldObjectIfOutsideView
-
- thumb_func_start sub_805B710
-sub_805B710: @ 805B710
- push {r4-r7,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- lsls r4, 16
- lsrs r4, 16
- lsls r5, 16
- lsrs r5, 16
- bl ClearPlayerAvatarInfo
- movs r6, 0
- ldr r7, _0805B758 @ =gMapObjects
- lsls r4, 16
- lsls r5, 16
-_0805B72A:
- lsls r0, r6, 3
- adds r0, r6
- lsls r0, 2
- adds r0, r7
- ldrb r0, [r0]
- lsls r0, 31
- cmp r0, 0
- beq _0805B744
- adds r0, r6, 0
- asrs r1, r4, 16
- asrs r2, r5, 16
- bl sub_805B75C
-_0805B744:
- adds r0, r6, 0x1
- lsls r0, 24
- lsrs r6, r0, 24
- cmp r6, 0xF
- bls _0805B72A
- bl sub_805AAB0
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0805B758: .4byte gMapObjects
- thumb_func_end sub_805B710
-
thumb_func_start sub_805B75C
sub_805B75C: @ 805B75C
push {r4-r7,lr}
diff --git a/include/asm.inc.h b/include/asm.inc.h
index 50d983852..f879f40c1 100644
--- a/include/asm.inc.h
+++ b/include/asm.inc.h
@@ -53,12 +53,13 @@ u8 GetFieldObjectIdByLocalIdAndMap(u8, u8, u8);
bool8 TryGetFieldObjectIdByLocalIdAndMap(u8, u8, u8, u8 *);
u8 GetFieldObjectIdByXY(s16, s16);
void RemoveFieldObjectByLocalIdAndMap(u8, u8, u8);
-u8 SpawnSpecialFieldObject(struct UnknownStruct_FPA *);
+u8 SpawnSpecialFieldObject(struct MapObjectTemplate *);
u8 show_sprite(u8, u8, u8);
-u8 AddPseudoFieldObject(u8 val, void (*player)(struct Sprite *), int i, int i1, int i2);
+u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 c, s16 d, u8 subpriority);
u8 sub_805B410(u8, u8, s16, s16, u8, u8);
-void sub_805B55C(int i, int i1);
-void sub_805B710(int i, int i1);
+//void sub_805B55C(int i, int i1);
+void sub_805B55C(s16 a, s16 b);
+void sub_805B710(u16 i, u16 i1);
void sub_805B980(struct MapObject *, u8);
void FieldObjectTurn(struct MapObject *, u8);
void FieldObjectTurnByLocalIdAndMap(u8, u8, u8, u8);
diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h
index 536e08cb3..c599e4278 100644
--- a/include/global.fieldmap.h
+++ b/include/global.fieldmap.h
@@ -67,7 +67,7 @@ struct MapObjectTemplate
{
/*0x00*/ u8 localId;
/*0x01*/ u8 graphicsId;
- /*0x02*/ u8 filler_2[0x2];
+ /*0x02*/ u8 unk2;
/*0x04*/ s16 x;
/*0x06*/ s16 y;
/*0x08*/ u8 elevation;
@@ -281,22 +281,22 @@ struct MapObject2
struct MapObjectGraphicsInfo
{
- u16 tileTag;
- u16 paletteTag1;
- u16 paletteTag2;
- u16 size;
- s16 width;
- s16 height;
- u8 paletteSlot:4;
- u8 shadowSize:2;
- u8 inanimate:1;
- u8 disableReflectionPaletteLoad:1;
- u8 tracks;
- struct OamData *oam;
- struct SubspriteTable *subspriteTables;
- union AnimCmd **anims;
- struct SpriteFrameImage *images;
- union AffineAnimCmd **affineAnims;
+ /*0x00*/ u16 tileTag;
+ /*0x02*/ u16 paletteTag1;
+ /*0x04*/ u16 paletteTag2;
+ /*0x06*/ u16 size;
+ /*0x08*/ s16 width;
+ /*0x0A*/ s16 height;
+ /*0x0C*/ u8 paletteSlot:4;
+ u8 shadowSize:2;
+ u8 inanimate:1;
+ u8 disableReflectionPaletteLoad:1;
+ /*0x0D*/ u8 tracks;
+ /*0x10*/ struct OamData *oam;
+ /*0x14*/ struct SubspriteTable *subspriteTables;
+ /*0x18*/ union AnimCmd **anims;
+ /*0x1C*/ struct SpriteFrameImage *images;
+ /*0x20*/ union AffineAnimCmd **affineAnims;
};
#define PLAYER_AVATAR_FLAG_ON_FOOT (1 << 0)
diff --git a/include/sprite.h b/include/sprite.h
index 447a8decb..54b0fd76b 100644
--- a/include/sprite.h
+++ b/include/sprite.h
@@ -194,7 +194,7 @@ void ResetSpriteData(void);
void AnimateSprites(void);
void BuildOamBuffer(void);
u8 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority);
-u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, u16 x, u16 y, u8 subpriority);
+u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority);
u8 CreateInvisibleSprite(void (*callback)(struct Sprite *));
u8 CreateSpriteAndAnimate(struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority);
void DestroySprite(struct Sprite *sprite);
diff --git a/src/field_map_obj.c b/src/field_map_obj.c
index 20c56a122..bd57e7abe 100644
--- a/src/field_map_obj.c
+++ b/src/field_map_obj.c
@@ -2,12 +2,17 @@
#include "asm.h"
#include "event_data.h"
#include "field_map_obj.h"
+#include "rom4.h"
#include "sprite.h"
extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[36];
extern void strange_npc_table_clear(void);
extern void ClearPlayerAvatarInfo(void);
+extern void npc_load_two_palettes__no_record();
+extern void npc_load_two_palettes__and_record();
+extern void sub_8060388(s16, s16, s16 *, s16 *);
+extern void sub_80634D0();
void sub_805AAB0(void);
u8 GetFieldObjectIdByLocalId(u8);
@@ -16,9 +21,16 @@ u8 GetAvailableFieldObjectSlot(u16, u8, u8, u8 *);
void FieldObjectHandleDynamicGraphicsId();
void RemoveFieldObjectInternal(struct MapObject *);
u16 GetFieldObjectFlagIdByFieldObjectId();
+void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, struct SubspriteTable **subspriteTables);
+struct MapObjectTemplate *GetFieldObjectTemplateByLocalIdAndMap();
+void GetFieldObjectMovingCameraOffset(s16 *, s16 *);
+void sub_805BDF8();
+
+extern struct LinkPlayerMapObject gLinkPlayerMapObjects[];
extern const u8 gUnknown_0836DBBC[];
extern const u8 gUnknown_0836DC09[];
+extern void (*const gUnknown_0836DA88[])(struct Sprite *);
void npc_clear_ids_and_state(struct MapObject *mapObj)
{
@@ -411,6 +423,290 @@ void npc_hide_all_but_player(void)
for (i = 0; i < 16; i++)
{
if (i != gPlayerAvatar.mapObjectId)
- RemoveFieldObject(&gFieldObjects[i]);
+ RemoveFieldObject(&gMapObjects[i]);
}
}
+
+u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f)
+{
+ u8 mapObjectId;
+ u8 spriteId;
+ struct MapObjectGraphicsInfo *gfxInfo;
+ struct MapObject *mapObject;
+ struct Sprite *sprite;
+
+ mapObjectId = InitFieldObjectStateFromTemplate(mapObjTemplate, c, d);
+ if (mapObjectId == 16)
+ return 16;
+
+ mapObject = &gMapObjects[mapObjectId];
+ gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
+ if (gfxInfo->paletteSlot == 0)
+ npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot);
+ else if (gfxInfo->paletteSlot == 10)
+ npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot);
+ if (mapObject->animPattern == 0x4C)
+ mapObject->mapobj_bit_13 = TRUE;
+
+#ifdef NONMATCHING
+ sprTemplate->paletteTag = 0xFFFF;
+#else
+ *(u16 *)&sprTemplate->paletteTag = 0xFFFF;
+#endif
+ spriteId = CreateSprite(sprTemplate, 0, 0, 0);
+ if (spriteId == 64)
+ {
+ gMapObjects[mapObjectId].active = FALSE;
+ return 16;
+ }
+ sprite = &gSprites[spriteId];
+ sub_8060388(e + mapObject->coords2.x, f + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->centerToCornerVecX = -(gfxInfo->width >> 1);
+ sprite->centerToCornerVecY = -(gfxInfo->height >> 1);
+ sprite->pos1.x += 8;
+ sprite->pos1.y += 16 + sprite->centerToCornerVecY;
+ sprite->oam.paletteNum = gfxInfo->paletteSlot;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->data0 = mapObjectId;
+ mapObject->spriteId = spriteId;
+ mapObject->mapobj_bit_12 = gfxInfo->inanimate;
+ if (!mapObject->mapobj_bit_12)
+ StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18));
+ SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1);
+ sub_80634D0(mapObject, sprite);
+ return mapObjectId;
+}
+
+u8 SpawnFieldObject(struct MapObjectTemplate *mapObjTemplate, u8 b, u8 c, s16 d, s16 e)
+{
+ struct SpriteTemplate spriteTemplate;
+ struct SubspriteTable *subspriteTables = NULL;
+ struct SpriteFrameImage spriteFrameImage;
+ struct MapObjectGraphicsInfo *gfxInfo;
+ u8 mapObjectId;
+
+ gfxInfo = GetFieldObjectGraphicsInfo(mapObjTemplate->graphicsId);
+ MakeObjectTemplateFromFieldObjectTemplate(mapObjTemplate, &spriteTemplate, &subspriteTables);
+ spriteFrameImage.size = gfxInfo->size;
+ spriteTemplate.images = &spriteFrameImage;
+ mapObjectId = sub_805AFCC(mapObjTemplate, &spriteTemplate, b, c, d, e);
+ if (mapObjectId == 16)
+ return 16;
+ gSprites[gMapObjects[mapObjectId].spriteId].images = gfxInfo->images;
+ if (subspriteTables != NULL)
+ SetSubspriteTables(&gSprites[gMapObjects[mapObjectId].spriteId], subspriteTables);
+ return mapObjectId;
+}
+
+u8 SpawnSpecialFieldObject(struct MapObjectTemplate *mapObjTemplate)
+{
+ s16 x;
+ s16 y;
+
+ GetFieldObjectMovingCameraOffset(&x, &y);
+ return SpawnFieldObject(mapObjTemplate, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, x, y);
+}
+
+u8 SpawnSpecialFieldObjectParametrized(u8 a, u8 b, u8 c, s16 d, s16 e, u8 f)
+{
+ struct MapObjectTemplate mapObjTemplate;
+
+ d -= 7;
+ e -= 7;
+ mapObjTemplate.localId = c;
+ mapObjTemplate.graphicsId = a;
+ mapObjTemplate.unk2 = 0;
+ mapObjTemplate.x = d;
+ mapObjTemplate.y = e;
+ mapObjTemplate.elevation = f;
+ mapObjTemplate.movementType = b;
+ mapObjTemplate.unkA_0 = 0;
+ mapObjTemplate.unkA_4 = 0;
+ mapObjTemplate.unkC = 0;
+ mapObjTemplate.unkE = 0;
+ return SpawnSpecialFieldObject(&mapObjTemplate);
+}
+
+u8 show_sprite(u8 a, u8 b, u8 c)
+{
+ struct MapObjectTemplate *r5;
+ s16 x;
+ s16 y;
+
+ r5 = GetFieldObjectTemplateByLocalIdAndMap(a, b, c);
+ if (r5 == NULL)
+ return 16;
+ GetFieldObjectMovingCameraOffset(&x, &y);
+ return SpawnFieldObject(r5, b, c, x, y);
+}
+
+void MakeObjectTemplateFromFieldObjectGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *sprTemplate, struct SubspriteTable **subspriteTables)
+{
+ struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(graphicsId);
+
+ sprTemplate->tileTag = gfxInfo->tileTag;
+ sprTemplate->paletteTag = gfxInfo->paletteTag1;
+ sprTemplate->oam = gfxInfo->oam;
+ sprTemplate->anims = gfxInfo->anims;
+ sprTemplate->images = gfxInfo->images;
+ sprTemplate->affineAnims = gfxInfo->affineAnims;
+ sprTemplate->callback = callback;
+ *subspriteTables = gfxInfo->subspriteTables;
+}
+
+void MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 callbackIndex, struct SpriteTemplate *sprTemplate, struct SubspriteTable **subspriteTables)
+{
+ MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, gUnknown_0836DA88[callbackIndex], sprTemplate, subspriteTables);
+}
+
+void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, struct SubspriteTable **subspriteTables)
+{
+ MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObjTemplate->graphicsId, mapObjTemplate->movementType, sprTemplate, subspriteTables);
+}
+
+u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 c, s16 d, u8 subpriority)
+{
+ struct SpriteTemplate spriteTemplate;
+ struct SubspriteTable *subspriteTables;
+ u8 spriteId;
+
+ MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, callback, &spriteTemplate, &subspriteTables);
+ if (spriteTemplate.paletteTag != 0xFFFF)
+ sub_805BDF8(spriteTemplate.paletteTag);
+ spriteId = CreateSprite(&spriteTemplate, c, d, subpriority);
+ if (spriteId != 64 && subspriteTables != NULL)
+ {
+ SetSubspriteTables(&gSprites[spriteId], subspriteTables);
+ gSprites[spriteId].subspriteMode = 2;
+ }
+ return spriteId;
+}
+
+extern void sub_8064970(struct Sprite *);
+extern void sub_8060470();
+extern void InitObjectPriorityByZCoord();
+
+u8 sub_805B410(u8 a, u8 b, s16 c, s16 d, u8 e, u8 f)
+{
+ struct MapObjectGraphicsInfo *gfxInfo;
+ struct SpriteTemplate spriteTemplate;
+ struct SubspriteTable *subspriteTables;
+ u8 spriteId;
+
+ gfxInfo = GetFieldObjectGraphicsInfo(a);
+ MakeObjectTemplateFromFieldObjectGraphicsInfo(a, sub_8064970, &spriteTemplate, &subspriteTables);
+#ifdef NONMATCHING
+ spriteTemplate.paletteTag = 0xFFFF;
+#else
+ *(u16 *)&spriteTemplate.paletteTag = 0xFFFF;
+#endif
+ c += 7;
+ d += 7;
+ sub_8060470(&c, &d, 8, 16);
+ spriteId = CreateSpriteAtEnd(&spriteTemplate, c, d, 0);
+ if (spriteId != 64)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+
+ sprite->centerToCornerVecX = -(gfxInfo->width >> 1);
+ sprite->centerToCornerVecY = -(gfxInfo->height >> 1);
+ sprite->pos1.y += sprite->centerToCornerVecY;
+ sprite->oam.paletteNum = gfxInfo->paletteSlot;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->data0 = b;
+ sprite->data1 = e;
+ if (gfxInfo->paletteSlot == 10)
+ npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot);
+ if (subspriteTables != NULL)
+ {
+ SetSubspriteTables(sprite, subspriteTables);
+ sprite->subspriteMode = 2;
+ }
+ InitObjectPriorityByZCoord(sprite, e);
+ SetObjectSubpriorityByZCoord(e, sprite, 1);
+ StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(f));
+ }
+ return spriteId;
+}
+
+void sub_805B55C(s16 a, s16 b)
+{
+ u8 i;
+
+ if (gMapHeader.events != NULL)
+ {
+ s16 r9 = gSaveBlock1.pos.x - 2;
+ s16 sp8 = gSaveBlock1.pos.x + 17;
+ s16 r10 = gSaveBlock1.pos.y;
+ s16 spC = gSaveBlock1.pos.y + 16;
+ u8 objectCount = gMapHeader.events->mapObjectCount;
+
+ for (i = 0; i < objectCount; i++)
+ {
+ struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i];
+ s16 foo = template->x + 7;
+ s16 bar = template->y + 7;
+
+ if (r10 <= bar && spC >= bar && r9 <= foo && sp8 >= foo
+ && !FlagGet(template->unk14))
+ SpawnFieldObject(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, a, b);
+ }
+ }
+}
+
+void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject);
+
+void RemoveFieldObjectsOutsideView(void)
+{
+ u8 i;
+ u8 j;
+
+ for (i = 0; i < 16; i++)
+ {
+ bool8 isActiveLinkPlayer;
+
+ for (j = 0, isActiveLinkPlayer = 0; j < 4; j++)
+ {
+ if (gLinkPlayerMapObjects[j].active && i == gLinkPlayerMapObjects[j].mapObjId)
+ isActiveLinkPlayer = TRUE;
+ }
+ if (!isActiveLinkPlayer)
+ {
+ struct MapObject *mapObject = &gMapObjects[i];
+
+ if (mapObject->active && !mapObject->mapobj_bit_16)
+ RemoveFieldObjectIfOutsideView(mapObject);
+ }
+ }
+}
+
+void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject)
+{
+ s16 r7 = gSaveBlock1.pos.x - 2;
+ s16 r5 = gSaveBlock1.pos.x + 17;
+ s16 r4 = gSaveBlock1.pos.y;
+ s16 r6 = gSaveBlock1.pos.y + 16;
+
+ if (mapObject->coords2.x >= r7 && mapObject->coords2.x <= r5
+ && mapObject->coords2.y >= r4 && mapObject->coords2.y <= r6)
+ return;
+ if (mapObject->coords1.x >= r7 && mapObject->coords1.x <= r5
+ && mapObject->coords1.y >= r4 && mapObject->coords1.y <= r6)
+ return;
+ RemoveFieldObject(mapObject);
+}
+
+void sub_805B75C(int, s16, s16);
+
+void sub_805B710(u16 a, u16 b)
+{
+ u8 i;
+
+ ClearPlayerAvatarInfo();
+ for (i = 0; i < 16; i++)
+ {
+ if (gMapObjects[i].active)
+ sub_805B75C(i, a, b);
+ }
+ sub_805AAB0();
+}
diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c
index bab172152..4a96187c1 100644
--- a/src/field_player_avatar.c
+++ b/src/field_player_avatar.c
@@ -1168,29 +1168,29 @@ void SetPlayerAvatarExtraStateTransition(u8 a, u8 b)
DoPlayerAvatarTransition();
}
-void InitPlayerAvatar(s16 a, s16 b, u8 c, u8 gender)
+void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender)
{
- struct UnknownStruct_FPA s;
+ struct MapObjectTemplate playerMapObjTemplate;
u8 mapObjectId;
struct MapObject *mapObject;
- s.unk0 = 0xFF;
- s.unk1 = GetPlayerAvatarGraphicsIdByStateIdAndGender(0, gender);
- s.unk4 = a - 7;
- s.unk6 = b - 7;
- s.unk8 = 0;
- s.unk9 = 11;
- s.unkA_0 = 0;
- s.unkA_4 = 0;
- s.unkC = 0;
- s.unkE = 0;
- s.unk10 = 0;
- s.unk14 = 0;
- mapObjectId = SpawnSpecialFieldObject(&s);
+ playerMapObjTemplate.localId = 0xFF;
+ playerMapObjTemplate.graphicsId = GetPlayerAvatarGraphicsIdByStateIdAndGender(0, gender);
+ playerMapObjTemplate.x = x - 7;
+ playerMapObjTemplate.y = y - 7;
+ playerMapObjTemplate.elevation = 0;
+ playerMapObjTemplate.movementType = 11;
+ playerMapObjTemplate.unkA_0 = 0;
+ playerMapObjTemplate.unkA_4 = 0;
+ playerMapObjTemplate.unkC = 0;
+ playerMapObjTemplate.unkE = 0;
+ playerMapObjTemplate.script = NULL;
+ playerMapObjTemplate.unk14 = 0;
+ mapObjectId = SpawnSpecialFieldObject(&playerMapObjTemplate);
mapObject = &gMapObjects[mapObjectId];
mapObject->mapobj_bit_16 = 1;
mapObject->mapobj_unk_1B = sub_8126B54();
- FieldObjectTurn(mapObject, c);
+ FieldObjectTurn(mapObject, direction);
ClearPlayerAvatarInfo();
gPlayerAvatar.running2 = 0;
gPlayerAvatar.running1 = 0;
diff --git a/src/sprite.c b/src/sprite.c
index fd8a5aaac..9e7e3c9ff 100644
--- a/src/sprite.c
+++ b/src/sprite.c
@@ -536,7 +536,7 @@ u8 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u8 subprior
return MAX_SPRITES;
}
-u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, u16 x, u16 y, u8 subpriority)
+u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority)
{
s16 i;