diff options
-rw-r--r-- | asm/fieldmap.s | 1998 | ||||
-rw-r--r-- | include/gba/macro.h | 2 | ||||
-rw-r--r-- | include/global.fieldmap.h | 16 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/fieldmap.c | 939 | ||||
-rw-r--r-- | sym_ewram.txt | 12 |
6 files changed, 951 insertions, 2018 deletions
diff --git a/asm/fieldmap.s b/asm/fieldmap.s deleted file mode 100644 index 5d914c422..000000000 --- a/asm/fieldmap.s +++ /dev/null @@ -1,1998 +0,0 @@ - .include "constants/gba_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start mapconnection_get_mapheader -mapconnection_get_mapheader: @ 8055F90 - push {lr} - ldrb r2, [r0, 0x8] - ldrb r1, [r0, 0x9] - adds r0, r2, 0 - bl get_mapheader_by_bank_and_number - pop {r1} - bx r1 - thumb_func_end mapconnection_get_mapheader - - thumb_func_start not_trainer_hill_battle_pyramid -not_trainer_hill_battle_pyramid: @ 8055FA0 - push {r4,lr} - ldr r4, _08055FBC @ =gMapHeader - adds r0, r4, 0 - bl mapheader_copy_mapdata_with_padding - ldr r0, [r4, 0x4] - bl sub_80BB970 - bl mapheader_run_script_with_tag_x1 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08055FBC: .4byte gMapHeader - thumb_func_end not_trainer_hill_battle_pyramid - - thumb_func_start sub_8055FC0 -sub_8055FC0: @ 8055FC0 - push {r4,lr} - ldr r4, _08055FF0 @ =gMapHeader - adds r0, r4, 0 - bl mapheader_copy_mapdata_with_padding - movs r0, 0 - bl sub_80BBCCC - ldr r0, [r4, 0x4] - bl sub_80BB970 - bl sub_8056670 - bl mapheader_run_script_with_tag_x1 - ldr r1, _08055FF4 @ =gUnknown_03004870 - ldr r0, [r1] - ldr r1, [r1, 0x4] - bl UpdateTVScreensOnMap - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08055FF0: .4byte gMapHeader -_08055FF4: .4byte gUnknown_03004870 - thumb_func_end sub_8055FC0 - - thumb_func_start mapheader_copy_mapdata_with_padding -mapheader_copy_mapdata_with_padding: @ 8055FF8 - push {r4-r6,lr} - sub sp, 0x4 - adds r6, r0, 0 - ldr r5, [r6] - ldr r0, _08056044 @ =0x03ff03ff - str r0, [sp] - ldr r4, _08056048 @ =gUnknown_02029828 - ldr r2, _0805604C @ =0x01001400 - mov r0, sp - adds r1, r4, 0 - bl CpuFastSet - ldr r2, _08056050 @ =gUnknown_03004870 - str r4, [r2, 0x8] - ldr r1, [r5] - adds r1, 0xF - str r1, [r2] - ldr r0, [r5, 0x4] - adds r0, 0xE - str r0, [r2, 0x4] - muls r1, r0 - movs r0, 0xA0 - lsls r0, 6 - cmp r1, r0 - bgt _0805603A - ldr r0, [r5, 0xC] - ldrh r1, [r5] - ldrh r2, [r5, 0x4] - bl map_copy_with_padding - adds r0, r6, 0 - bl sub_80560AC -_0805603A: - add sp, 0x4 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08056044: .4byte 0x03ff03ff -_08056048: .4byte gUnknown_02029828 -_0805604C: .4byte 0x01001400 -_08056050: .4byte gUnknown_03004870 - thumb_func_end mapheader_copy_mapdata_with_padding - - thumb_func_start map_copy_with_padding -map_copy_with_padding: @ 8056054 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - adds r7, r0, 0 - lsls r1, 16 - lsrs r1, 16 - mov r8, r1 - lsls r2, 16 - lsrs r2, 16 - ldr r0, _080560A8 @ =gUnknown_03004870 - ldr r4, [r0, 0x8] - ldr r1, [r0] - lsls r0, r1, 3 - subs r0, r1 - lsls r0, 1 - adds r0, 0xE - adds r4, r0 - cmp r2, 0 - beq _0805609C - mov r0, r8 - lsls r6, r0, 1 - adds r5, r2, 0 - movs r0, 0x1E - adds r0, r6 - mov r9, r0 -_08056088: - adds r0, r7, 0 - adds r1, r4, 0 - mov r2, r8 - bl CpuSet - add r4, r9 - adds r7, r6 - subs r5, 0x1 - cmp r5, 0 - bne _08056088 -_0805609C: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080560A8: .4byte gUnknown_03004870 - thumb_func_end map_copy_with_padding - - thumb_func_start sub_80560AC -sub_80560AC: @ 80560AC - push {r4-r7,lr} - adds r6, r0, 0 - ldr r0, [r6, 0xC] - ldr r1, [r0] - ldr r5, [r0, 0x4] - ldr r2, _080560E0 @ =gUnknown_0202E850 - ldr r0, _080560E4 @ =gUnknown_08308E28 - ldr r0, [r0] - str r0, [r2] - cmp r1, 0 - ble _0805612C - adds r4, r2, 0 - adds r7, r1, 0 -_080560C6: - adds r0, r5, 0 - bl mapconnection_get_mapheader - adds r1, r0, 0 - ldr r2, [r5, 0x4] - ldrb r0, [r5] - cmp r0, 0x2 - beq _080560FE - cmp r0, 0x2 - bgt _080560E8 - cmp r0, 0x1 - beq _080560F2 - b _08056124 - .align 2, 0 -_080560E0: .4byte gUnknown_0202E850 -_080560E4: .4byte gUnknown_08308E28 -_080560E8: - cmp r0, 0x3 - beq _0805610A - cmp r0, 0x4 - beq _08056116 - b _08056124 -_080560F2: - adds r0, r6, 0 - bl sub_8056198 - ldrb r0, [r4] - movs r1, 0x1 - b _08056120 -_080560FE: - adds r0, r6, 0 - bl sub_8056200 - ldrb r0, [r4] - movs r1, 0x2 - b _08056120 -_0805610A: - adds r0, r6, 0 - bl sub_8056260 - ldrb r0, [r4] - movs r1, 0x4 - b _08056120 -_08056116: - adds r0, r6, 0 - bl sub_80562C0 - ldrb r0, [r4] - movs r1, 0x8 -_08056120: - orrs r0, r1 - strb r0, [r4] -_08056124: - subs r7, 0x1 - adds r5, 0xC - cmp r7, 0 - bne _080560C6 -_0805612C: - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_80560AC - - thumb_func_start sub_8056134 -sub_8056134: @ 8056134 - push {r4-r7,lr} - mov r7, r8 - push {r7} - ldr r5, [sp, 0x18] - ldr r4, [r2] - ldr r7, [r4] - adds r2, r7, 0 - muls r2, r5 - adds r2, r3 - lsls r2, 1 - ldr r3, [r4, 0xC] - adds r6, r3, r2 - ldr r3, _08056190 @ =gUnknown_03004870 - ldr r2, [r3] - muls r1, r2 - adds r1, r0 - lsls r1, 1 - ldr r0, [r3, 0x8] - adds r5, r0, r1 - ldr r0, [sp, 0x20] - cmp r0, 0 - ble _08056186 - adds r4, r0, 0 - ldr r3, _08056194 @ =0x001fffff - mov r8, r3 -_08056166: - adds r0, r6, 0 - adds r1, r5, 0 - ldr r2, [sp, 0x1C] - mov r3, r8 - ands r2, r3 - bl CpuSet - ldr r0, _08056190 @ =gUnknown_03004870 - ldr r0, [r0] - lsls r0, 1 - adds r5, r0 - lsls r0, r7, 1 - adds r6, r0 - subs r4, 0x1 - cmp r4, 0 - bne _08056166 -_08056186: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08056190: .4byte gUnknown_03004870 -_08056194: .4byte 0x001fffff - thumb_func_end sub_8056134 - - thumb_func_start sub_8056198 -sub_8056198: @ 8056198 - push {r4-r7,lr} - sub sp, 0xC - adds r3, r0, 0 - adds r5, r1, 0 - cmp r5, 0 - beq _080561F2 - ldr r0, [r5] - ldr r4, [r0] - adds r2, 0x7 - ldr r0, [r3] - ldr r0, [r0, 0x4] - adds r7, r0, 0x7 - cmp r2, 0 - bge _080561CC - negs r6, r2 - adds r2, r4 - ldr r0, _080561C8 @ =gUnknown_03004870 - ldr r3, [r0] - cmp r2, r3 - bge _080561C2 - adds r3, r2, 0 -_080561C2: - movs r2, 0 - b _080561DC - .align 2, 0 -_080561C8: .4byte gUnknown_03004870 -_080561CC: - movs r6, 0 - adds r0, r2, r4 - ldr r1, _080561FC @ =gUnknown_03004870 - ldr r1, [r1] - subs r3, r1, r2 - cmp r0, r1 - bge _080561DC - adds r3, r4, 0 -_080561DC: - movs r0, 0 - str r0, [sp] - str r3, [sp, 0x4] - movs r0, 0x7 - str r0, [sp, 0x8] - adds r0, r2, 0 - adds r1, r7, 0 - adds r2, r5, 0 - adds r3, r6, 0 - bl sub_8056134 -_080561F2: - add sp, 0xC - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080561FC: .4byte gUnknown_03004870 - thumb_func_end sub_8056198 - - thumb_func_start sub_8056200 -sub_8056200: @ 8056200 - push {r4-r7,lr} - sub sp, 0xC - adds r5, r1, 0 - cmp r5, 0 - beq _08056254 - ldr r0, [r5] - ldr r4, [r0] - ldr r0, [r0, 0x4] - adds r2, 0x7 - subs r7, r0, 0x7 - cmp r2, 0 - bge _08056230 - negs r6, r2 - adds r2, r4 - ldr r0, _0805622C @ =gUnknown_03004870 - ldr r3, [r0] - cmp r2, r3 - bge _08056226 - adds r3, r2, 0 -_08056226: - movs r2, 0 - b _08056240 - .align 2, 0 -_0805622C: .4byte gUnknown_03004870 -_08056230: - movs r6, 0 - adds r0, r2, r4 - ldr r1, _0805625C @ =gUnknown_03004870 - ldr r1, [r1] - subs r3, r1, r2 - cmp r0, r1 - bge _08056240 - adds r3, r4, 0 -_08056240: - str r7, [sp] - str r3, [sp, 0x4] - movs r0, 0x7 - str r0, [sp, 0x8] - adds r0, r2, 0 - movs r1, 0 - adds r2, r5, 0 - adds r3, r6, 0 - bl sub_8056134 -_08056254: - add sp, 0xC - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0805625C: .4byte gUnknown_03004870 - thumb_func_end sub_8056200 - - thumb_func_start sub_8056260 -sub_8056260: @ 8056260 - push {r4-r7,lr} - sub sp, 0xC - adds r5, r1, 0 - cmp r5, 0 - beq _080562B4 - ldr r0, [r5] - ldr r1, [r0] - ldr r4, [r0, 0x4] - adds r2, 0x7 - subs r7, r1, 0x7 - cmp r2, 0 - bge _08056290 - negs r6, r2 - adds r1, r2, r4 - ldr r0, _0805628C @ =gUnknown_03004870 - ldr r3, [r0, 0x4] - cmp r1, r3 - bge _08056286 - adds r3, r1, 0 -_08056286: - movs r2, 0 - b _080562A0 - .align 2, 0 -_0805628C: .4byte gUnknown_03004870 -_08056290: - movs r6, 0 - adds r0, r2, r4 - ldr r1, _080562BC @ =gUnknown_03004870 - ldr r1, [r1, 0x4] - subs r3, r1, r2 - cmp r0, r1 - bge _080562A0 - adds r3, r4, 0 -_080562A0: - str r6, [sp] - movs r0, 0x7 - str r0, [sp, 0x4] - str r3, [sp, 0x8] - movs r0, 0 - adds r1, r2, 0 - adds r2, r5, 0 - adds r3, r7, 0 - bl sub_8056134 -_080562B4: - add sp, 0xC - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080562BC: .4byte gUnknown_03004870 - thumb_func_end sub_8056260 - - thumb_func_start sub_80562C0 -sub_80562C0: @ 80562C0 - push {r4-r7,lr} - sub sp, 0xC - adds r3, r0, 0 - adds r5, r1, 0 - cmp r5, 0 - beq _08056318 - ldr r0, [r5] - ldr r4, [r0, 0x4] - ldr r0, [r3] - ldr r0, [r0] - adds r7, r0, 0x7 - adds r2, 0x7 - cmp r2, 0 - bge _080562F4 - negs r6, r2 - adds r1, r2, r4 - ldr r0, _080562F0 @ =gUnknown_03004870 - ldr r3, [r0, 0x4] - cmp r1, r3 - bge _080562EA - adds r3, r1, 0 -_080562EA: - movs r2, 0 - b _08056304 - .align 2, 0 -_080562F0: .4byte gUnknown_03004870 -_080562F4: - movs r6, 0 - adds r0, r2, r4 - ldr r1, _08056320 @ =gUnknown_03004870 - ldr r1, [r1, 0x4] - subs r3, r1, r2 - cmp r0, r1 - bge _08056304 - adds r3, r4, 0 -_08056304: - str r6, [sp] - movs r0, 0x8 - str r0, [sp, 0x4] - str r3, [sp, 0x8] - adds r0, r7, 0 - adds r1, r2, 0 - adds r2, r5, 0 - movs r3, 0 - bl sub_8056134 -_08056318: - add sp, 0xC - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08056320: .4byte gUnknown_03004870 - thumb_func_end sub_80562C0 - - thumb_func_start MapGridGetZCoordAt -MapGridGetZCoordAt: @ 8056324 - push {r4,lr} - adds r2, r0, 0 - adds r4, r1, 0 - cmp r2, 0 - blt _08056354 - ldr r1, _08056350 @ =gUnknown_03004870 - ldr r3, [r1] - cmp r2, r3 - bge _08056354 - cmp r4, 0 - blt _08056354 - ldr r0, [r1, 0x4] - cmp r4, r0 - bge _08056354 - adds r0, r3, 0 - muls r0, r4 - adds r0, r2, r0 - ldr r1, [r1, 0x8] - lsls r0, 1 - adds r0, r1 - ldrh r1, [r0] - b _08056376 - .align 2, 0 -_08056350: .4byte gUnknown_03004870 -_08056354: - ldr r0, _08056380 @ =gMapHeader - ldr r3, [r0] - adds r1, r2, 0x1 - movs r2, 0x1 - ands r1, r2 - adds r0, r4, 0x1 - ands r0, r2 - lsls r0, 1 - adds r1, r0 - ldr r0, [r3, 0x8] - lsls r1, 1 - adds r1, r0 - ldrh r1, [r1] - movs r2, 0xC0 - lsls r2, 4 - adds r0, r2, 0 - orrs r1, r0 -_08056376: - ldr r0, _08056384 @ =0x000003ff - cmp r1, r0 - beq _08056388 - lsrs r0, r1, 12 - b _0805638A - .align 2, 0 -_08056380: .4byte gMapHeader -_08056384: .4byte 0x000003ff -_08056388: - movs r0, 0 -_0805638A: - pop {r4} - pop {r1} - bx r1 - thumb_func_end MapGridGetZCoordAt - - thumb_func_start MapGridIsImpassableAt -MapGridIsImpassableAt: @ 8056390 - push {r4,lr} - adds r2, r0, 0 - adds r4, r1, 0 - cmp r2, 0 - blt _080563C0 - ldr r1, _080563BC @ =gUnknown_03004870 - ldr r3, [r1] - cmp r2, r3 - bge _080563C0 - cmp r4, 0 - blt _080563C0 - ldr r0, [r1, 0x4] - cmp r4, r0 - bge _080563C0 - adds r0, r3, 0 - muls r0, r4 - adds r0, r2, r0 - ldr r1, [r1, 0x8] - lsls r0, 1 - adds r0, r1 - ldrh r1, [r0] - b _080563E2 - .align 2, 0 -_080563BC: .4byte gUnknown_03004870 -_080563C0: - ldr r0, _080563F4 @ =gMapHeader - ldr r3, [r0] - adds r1, r2, 0x1 - movs r2, 0x1 - ands r1, r2 - adds r0, r4, 0x1 - ands r0, r2 - lsls r0, 1 - adds r1, r0 - ldr r0, [r3, 0x8] - lsls r1, 1 - adds r1, r0 - ldrh r1, [r1] - movs r2, 0xC0 - lsls r2, 4 - adds r0, r2, 0 - orrs r1, r0 -_080563E2: - ldr r0, _080563F8 @ =0x000003ff - cmp r1, r0 - beq _080563FC - movs r0, 0xC0 - lsls r0, 4 - ands r1, r0 - lsrs r0, r1, 10 - b _080563FE - .align 2, 0 -_080563F4: .4byte gMapHeader -_080563F8: .4byte 0x000003ff -_080563FC: - movs r0, 0x1 -_080563FE: - pop {r4} - pop {r1} - bx r1 - thumb_func_end MapGridIsImpassableAt - - thumb_func_start MapGridGetMetatileIdAt -MapGridGetMetatileIdAt: @ 8056404 - push {r4-r6,lr} - adds r5, r0, 0 - adds r6, r1, 0 - cmp r5, 0 - blt _08056434 - ldr r1, _08056430 @ =gUnknown_03004870 - ldr r2, [r1] - cmp r5, r2 - bge _08056434 - cmp r6, 0 - blt _08056434 - ldr r0, [r1, 0x4] - cmp r6, r0 - bge _08056434 - adds r0, r2, 0 - muls r0, r6 - adds r0, r5, r0 - ldr r1, [r1, 0x8] - lsls r0, 1 - adds r0, r1 - ldrh r4, [r0] - b _08056458 - .align 2, 0 -_08056430: .4byte gUnknown_03004870 -_08056434: - ldr r0, _08056464 @ =gMapHeader - ldr r3, [r0] - adds r1, r5, 0x1 - movs r2, 0x1 - ands r1, r2 - adds r0, r6, 0x1 - ands r0, r2 - lsls r0, 1 - adds r1, r0 - ldr r0, [r3, 0x8] - lsls r1, 1 - adds r1, r0 - ldrh r1, [r1] - movs r2, 0xC0 - lsls r2, 4 - adds r0, r2, 0 - adds r4, r0, 0 - orrs r4, r1 -_08056458: - ldr r0, _08056468 @ =0x000003ff - cmp r4, r0 - beq _0805646C - ands r4, r0 - adds r0, r4, 0 - b _08056490 - .align 2, 0 -_08056464: .4byte gMapHeader -_08056468: .4byte 0x000003ff -_0805646C: - ldr r0, _08056498 @ =gMapHeader - ldr r3, [r0] - adds r1, r5, 0x1 - movs r2, 0x1 - ands r1, r2 - adds r0, r6, 0x1 - ands r0, r2 - lsls r0, 1 - adds r1, r0 - ldr r0, [r3, 0x8] - lsls r1, 1 - adds r1, r0 - ldrh r0, [r1] - movs r2, 0xC0 - lsls r2, 4 - adds r1, r2, 0 - orrs r0, r1 - ands r0, r4 -_08056490: - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_08056498: .4byte gMapHeader - thumb_func_end MapGridGetMetatileIdAt - - thumb_func_start MapGridGetMetatileBehaviorAt -MapGridGetMetatileBehaviorAt: @ 805649C - push {lr} - bl MapGridGetMetatileIdAt - lsls r0, 16 - lsrs r0, 16 - bl GetBehaviorByMetatileId - adds r1, r0, 0 - movs r0, 0xFF - ands r0, r1 - pop {r1} - bx r1 - thumb_func_end MapGridGetMetatileBehaviorAt - - thumb_func_start MapGridGetMetatileLayerTypeAt -MapGridGetMetatileLayerTypeAt: @ 80564B4 - push {lr} - bl MapGridGetMetatileIdAt - lsls r0, 16 - lsrs r0, 16 - bl GetBehaviorByMetatileId - adds r1, r0, 0 - movs r0, 0xF0 - lsls r0, 8 - ands r0, r1 - lsrs r0, 12 - pop {r1} - bx r1 - thumb_func_end MapGridGetMetatileLayerTypeAt - - thumb_func_start MapGridSetMetatileIdAt -MapGridSetMetatileIdAt: @ 80564D0 - push {r4,r5,lr} - adds r3, r0, 0 - lsls r2, 16 - lsrs r5, r2, 16 - cmp r3, 0 - blt _08056508 - ldr r2, _08056510 @ =gUnknown_03004870 - ldr r4, [r2] - cmp r3, r4 - bge _08056508 - cmp r1, 0 - blt _08056508 - ldr r0, [r2, 0x4] - cmp r1, r0 - bge _08056508 - muls r1, r4 - adds r1, r3, r1 - ldr r0, [r2, 0x8] - lsls r1, 1 - adds r1, r0 - ldrh r0, [r1] - movs r2, 0xF0 - lsls r2, 8 - ands r2, r0 - ldr r0, _08056514 @ =0x00000fff - ands r0, r5 - orrs r2, r0 - strh r2, [r1] -_08056508: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08056510: .4byte gUnknown_03004870 -_08056514: .4byte 0x00000fff - thumb_func_end MapGridSetMetatileIdAt - - thumb_func_start MapGridSetMetatileEntryAt -MapGridSetMetatileEntryAt: @ 8056518 - push {r4,r5,lr} - adds r3, r0, 0 - lsls r2, 16 - lsrs r5, r2, 16 - cmp r3, 0 - blt _08056544 - ldr r2, _0805654C @ =gUnknown_03004870 - ldr r4, [r2] - cmp r3, r4 - bge _08056544 - cmp r1, 0 - blt _08056544 - ldr r0, [r2, 0x4] - cmp r1, r0 - bge _08056544 - adds r0, r4, 0 - muls r0, r1 - adds r0, r3, r0 - ldr r1, [r2, 0x8] - lsls r0, 1 - adds r0, r1 - strh r5, [r0] -_08056544: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0805654C: .4byte gUnknown_03004870 - thumb_func_end MapGridSetMetatileEntryAt - - thumb_func_start GetBehaviorByMetatileId -GetBehaviorByMetatileId: @ 8056550 - push {lr} - lsls r0, 16 - lsrs r2, r0, 16 - adds r3, r2, 0 - ldr r0, _0805656C @ =0x000001ff - cmp r2, r0 - bhi _08056574 - ldr r0, _08056570 @ =gMapHeader - ldr r0, [r0] - ldr r0, [r0, 0x10] - ldr r1, [r0, 0x10] - lsls r0, r2, 1 - b _08056592 - .align 2, 0 -_0805656C: .4byte 0x000001ff -_08056570: .4byte gMapHeader -_08056574: - ldr r0, _08056580 @ =0x000003ff - cmp r2, r0 - bls _08056584 - movs r0, 0xFF - b _08056596 - .align 2, 0 -_08056580: .4byte 0x000003ff -_08056584: - ldr r0, _0805659C @ =gMapHeader - ldr r0, [r0] - ldr r0, [r0, 0x14] - ldr r1, [r0, 0x10] - lsls r0, r3, 1 - adds r0, r1 - ldr r1, _080565A0 @ =0xfffffc00 -_08056592: - adds r0, r1 - ldrh r0, [r0] -_08056596: - pop {r1} - bx r1 - .align 2, 0 -_0805659C: .4byte gMapHeader -_080565A0: .4byte 0xfffffc00 - thumb_func_end GetBehaviorByMetatileId - - thumb_func_start save_serialize_map -save_serialize_map: @ 80565A4 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - ldr r5, _0805660C @ =gSaveBlock1 + 0x34 - ldr r0, _08056610 @ =gUnknown_03004870 - ldr r0, [r0] - mov r8, r0 - adds r0, r5, 0 - subs r0, 0x34 - movs r1, 0 - ldrsh r6, [r0, r1] - movs r2, 0x2 - ldrsh r0, [r0, r2] - adds r1, r0, 0 - adds r1, 0xE - cmp r0, r1 - bge _080565FE - mov r12, r1 - ldr r1, _08056614 @ =gUnknown_02029828 - mov r9, r1 - lsls r7, r6, 1 -_080565D0: - adds r1, r6, 0 - adds r3, r1, 0 - adds r3, 0xF - adds r4, r0, 0x1 - cmp r1, r3 - bge _080565F8 - mov r2, r8 - muls r2, r0 - adds r0, r2, 0 - lsls r0, 1 - add r0, r9 - adds r2, r7, r0 - subs r1, r3, r1 -_080565EA: - ldrh r0, [r2] - strh r0, [r5] - adds r5, 0x2 - adds r2, 0x2 - subs r1, 0x1 - cmp r1, 0 - bne _080565EA -_080565F8: - adds r0, r4, 0 - cmp r0, r12 - blt _080565D0 -_080565FE: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0805660C: .4byte gSaveBlock1 + 0x34 -_08056610: .4byte gUnknown_03004870 -_08056614: .4byte gUnknown_02029828 - thumb_func_end save_serialize_map - - thumb_func_start sub_8056618 -sub_8056618: @ 8056618 - push {r4,lr} - movs r2, 0 - movs r1, 0 - ldr r4, _0805663C @ =gSaveBlock1 + 0x34 - ldr r3, _08056640 @ =0x000001ff -_08056622: - lsls r0, r1, 1 - adds r0, r4 - ldrh r0, [r0] - orrs r2, r0 - adds r0, r1, 0x1 - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, r3 - bls _08056622 - cmp r2, 0 - beq _08056644 - movs r0, 0 - b _08056646 - .align 2, 0 -_0805663C: .4byte gSaveBlock1 + 0x34 -_08056640: .4byte 0x000001ff -_08056644: - movs r0, 0x1 -_08056646: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_8056618 - - thumb_func_start sav2_mapdata_clear -sav2_mapdata_clear: @ 805664C - push {lr} - sub sp, 0x4 - mov r1, sp - movs r0, 0 - strh r0, [r1] - ldr r1, _08056668 @ =gSaveBlock1 + 0x34 - ldr r2, _0805666C @ =0x01000100 - mov r0, sp - bl CpuSet - add sp, 0x4 - pop {r0} - bx r0 - .align 2, 0 -_08056668: .4byte gSaveBlock1 + 0x34 -_0805666C: .4byte 0x01000100 - thumb_func_end sav2_mapdata_clear - - thumb_func_start sub_8056670 -sub_8056670: @ 8056670 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - ldr r5, _080566E4 @ =gSaveBlock1 + 0x34 - bl sub_8056618 - cmp r0, 0 - bne _080566D6 - ldr r0, _080566E8 @ =gUnknown_03004870 - ldr r0, [r0] - mov r8, r0 - adds r0, r5, 0 - subs r0, 0x34 - movs r1, 0 - ldrsh r6, [r0, r1] - movs r2, 0x2 - ldrsh r0, [r0, r2] - adds r1, r0, 0 - adds r1, 0xE - cmp r0, r1 - bge _080566D2 - mov r12, r1 - ldr r1, _080566EC @ =gUnknown_02029828 - mov r9, r1 - lsls r7, r6, 1 -_080566A4: - adds r1, r6, 0 - adds r3, r1, 0 - adds r3, 0xF - adds r4, r0, 0x1 - cmp r1, r3 - bge _080566CC - mov r2, r8 - muls r2, r0 - adds r0, r2, 0 - lsls r0, 1 - add r0, r9 - adds r2, r7, r0 - subs r1, r3, r1 -_080566BE: - ldrh r0, [r5] - strh r0, [r2] - adds r5, 0x2 - adds r2, 0x2 - subs r1, 0x1 - cmp r1, 0 - bne _080566BE -_080566CC: - adds r0, r4, 0 - cmp r0, r12 - blt _080566A4 -_080566D2: - bl sav2_mapdata_clear -_080566D6: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080566E4: .4byte gSaveBlock1 + 0x34 -_080566E8: .4byte gUnknown_03004870 -_080566EC: .4byte gUnknown_02029828 - thumb_func_end sub_8056670 - - thumb_func_start sub_80566F0 -sub_80566F0: @ 80566F0 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - lsls r0, 24 - lsrs r1, r0, 24 - adds r2, r1, 0 - ldr r0, _08056734 @ =gSaveBlock1 + 0x34 - mov r10, r0 - ldr r0, _08056738 @ =gUnknown_03004870 - ldr r0, [r0] - str r0, [sp] - movs r3, 0 - mov r9, r3 - mov r8, r3 - mov r0, r10 - subs r0, 0x34 - movs r6, 0 - ldrsh r4, [r0, r6] - str r4, [sp, 0x4] - movs r3, 0x2 - ldrsh r5, [r0, r3] - movs r7, 0xF - movs r4, 0xE - mov r12, r4 - cmp r1, 0x2 - beq _08056746 - cmp r1, 0x2 - bgt _0805673C - cmp r1, 0x1 - beq _0805674E - b _08056766 - .align 2, 0 -_08056734: .4byte gSaveBlock1 + 0x34 -_08056738: .4byte gUnknown_03004870 -_0805673C: - cmp r2, 0x3 - beq _08056758 - cmp r2, 0x4 - beq _08056760 - b _08056766 -_08056746: - adds r5, 0x1 - movs r6, 0xD - mov r12, r6 - b _08056766 -_0805674E: - movs r0, 0x1 - mov r8, r0 - movs r1, 0xD - mov r12, r1 - b _08056766 -_08056758: - ldr r3, [sp, 0x4] - adds r3, 0x1 - str r3, [sp, 0x4] - b _08056764 -_08056760: - movs r4, 0x1 - mov r9, r4 -_08056764: - movs r7, 0xE -_08056766: - movs r1, 0 - cmp r1, r12 - bge _080567A8 -_0805676C: - adds r4, r1, 0x1 - cmp r7, 0 - beq _080567A2 - adds r0, r1, r5 - ldr r6, [sp] - adds r2, r6, 0 - muls r2, r0 - add r1, r8 - lsls r0, r1, 4 - subs r0, r1 - add r0, r9 - ldr r1, [sp, 0x4] - adds r2, r1, r2 - adds r3, r7, 0 - lsls r2, 1 - ldr r6, _080567BC @ =gUnknown_02029828 - adds r2, r6 - lsls r0, 1 - mov r6, r10 - adds r1, r0, r6 -_08056794: - ldrh r0, [r1] - strh r0, [r2] - adds r1, 0x2 - adds r2, 0x2 - subs r3, 0x1 - cmp r3, 0 - bne _08056794 -_080567A2: - adds r1, r4, 0 - cmp r1, r12 - blt _0805676C -_080567A8: - bl sav2_mapdata_clear - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080567BC: .4byte gUnknown_02029828 - thumb_func_end sub_80566F0 - - thumb_func_start GetMapBorderIdAt -GetMapBorderIdAt: @ 80567C0 - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - cmp r4, 0 - blt _080567FC - ldr r1, _080567F4 @ =gUnknown_03004870 - ldr r2, [r1] - cmp r4, r2 - bge _080567FC - cmp r5, 0 - blt _080567FC - ldr r0, [r1, 0x4] - cmp r5, r0 - bge _080567FC - adds r0, r2, 0 - muls r0, r5 - adds r0, r4, r0 - ldr r1, [r1, 0x8] - lsls r0, 1 - adds r0, r1 - ldrh r1, [r0] - ldr r0, _080567F8 @ =0x000003ff - cmp r1, r0 - beq _08056894 - b _08056824 - .align 2, 0 -_080567F4: .4byte gUnknown_03004870 -_080567F8: .4byte 0x000003ff -_080567FC: - ldr r0, _08056840 @ =gMapHeader - ldr r3, [r0] - adds r1, r4, 0x1 - movs r2, 0x1 - ands r1, r2 - adds r0, r5, 0x1 - ands r0, r2 - lsls r0, 1 - adds r1, r0 - ldr r0, [r3, 0x8] - lsls r1, 1 - adds r1, r0 - ldrh r1, [r1] - movs r2, 0xC0 - lsls r2, 4 - adds r0, r2, 0 - orrs r0, r1 - ldr r1, _08056844 @ =0x000003ff - cmp r0, r1 - beq _08056894 -_08056824: - ldr r1, _08056848 @ =gUnknown_03004870 - ldr r0, [r1] - subs r0, 0x8 - cmp r4, r0 - blt _08056850 - ldr r0, _0805684C @ =gUnknown_0202E850 - ldrb r1, [r0] - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - beq _08056894 - movs r0, 0x4 - b _080568A6 - .align 2, 0 -_08056840: .4byte gMapHeader -_08056844: .4byte 0x000003ff -_08056848: .4byte gUnknown_03004870 -_0805684C: .4byte gUnknown_0202E850 -_08056850: - cmp r4, 0x6 - bgt _08056868 - ldr r0, _08056864 @ =gUnknown_0202E850 - ldrb r1, [r0] - movs r0, 0x4 - ands r0, r1 - cmp r0, 0 - beq _08056894 - movs r0, 0x3 - b _080568A6 - .align 2, 0 -_08056864: .4byte gUnknown_0202E850 -_08056868: - ldr r0, [r1, 0x4] - subs r0, 0x7 - cmp r5, r0 - blt _08056884 - ldr r0, _08056880 @ =gUnknown_0202E850 - ldrb r1, [r0] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08056894 - movs r0, 0x1 - b _080568A6 - .align 2, 0 -_08056880: .4byte gUnknown_0202E850 -_08056884: - cmp r5, 0x6 - bgt _080568A4 - ldr r0, _0805689C @ =gUnknown_0202E850 - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _080568A0 -_08056894: - movs r0, 0x1 - negs r0, r0 - b _080568A6 - .align 2, 0 -_0805689C: .4byte gUnknown_0202E850 -_080568A0: - movs r0, 0x2 - b _080568A6 -_080568A4: - movs r0, 0 -_080568A6: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end GetMapBorderIdAt - - thumb_func_start GetPostCameraMoveMapBorderId -GetPostCameraMoveMapBorderId: @ 80568AC - push {r4,lr} - adds r3, r1, 0 - ldr r1, _080568D0 @ =gSaveBlock1 - movs r4, 0 - ldrsh r2, [r1, r4] - adds r0, 0x7 - adds r2, r0 - movs r0, 0x2 - ldrsh r1, [r1, r0] - adds r3, 0x7 - adds r1, r3 - adds r0, r2, 0 - bl GetMapBorderIdAt - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_080568D0: .4byte gSaveBlock1 - thumb_func_end GetPostCameraMoveMapBorderId - - thumb_func_start CanCameraMoveInDirection -CanCameraMoveInDirection: @ 80568D4 - push {r4,r5,lr} - ldr r4, _08056908 @ =gSaveBlock1 - movs r1, 0 - ldrsh r3, [r4, r1] - ldr r2, _0805690C @ =gUnknown_0821664C - lsls r0, 3 - adds r1, r0, r2 - ldr r1, [r1] - adds r1, 0x7 - adds r3, r1 - movs r5, 0x2 - ldrsh r1, [r4, r5] - adds r2, 0x4 - adds r0, r2 - ldr r0, [r0] - adds r0, 0x7 - adds r1, r0 - adds r0, r3, 0 - bl GetMapBorderIdAt - movs r1, 0x1 - negs r1, r1 - cmp r0, r1 - beq _08056910 - movs r0, 0x1 - b _08056912 - .align 2, 0 -_08056908: .4byte gSaveBlock1 -_0805690C: .4byte gUnknown_0821664C -_08056910: - movs r0, 0 -_08056912: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end CanCameraMoveInDirection - - thumb_func_start sub_8056918 -sub_8056918: @ 8056918 - push {r4-r7,lr} - adds r5, r0, 0 - adds r4, r1, 0 - adds r6, r2, 0 - adds r7, r3, 0 - bl mapconnection_get_mapheader - adds r3, r0, 0 - cmp r4, 0x2 - beq _08056978 - cmp r4, 0x2 - bgt _08056936 - cmp r4, 0x1 - beq _08056964 - b _08056988 -_08056936: - cmp r4, 0x3 - beq _08056950 - cmp r4, 0x4 - bne _08056988 - ldr r1, _0805694C @ =gSaveBlock1 - negs r0, r6 - strh r0, [r1] - ldr r2, [r5, 0x4] - ldrh r0, [r1, 0x2] - subs r0, r2 - b _08056986 - .align 2, 0 -_0805694C: .4byte gSaveBlock1 -_08056950: - ldr r1, _08056960 @ =gSaveBlock1 - ldr r0, [r3] - ldr r0, [r0] - strh r0, [r1] - ldr r2, [r5, 0x4] - ldrh r0, [r1, 0x2] - subs r0, r2 - b _08056986 - .align 2, 0 -_08056960: .4byte gSaveBlock1 -_08056964: - ldr r1, _08056974 @ =gSaveBlock1 - ldr r2, [r5, 0x4] - ldrh r0, [r1] - subs r0, r2 - strh r0, [r1] - negs r0, r7 - b _08056986 - .align 2, 0 -_08056974: .4byte gSaveBlock1 -_08056978: - ldr r1, _08056990 @ =gSaveBlock1 - ldr r2, [r5, 0x4] - ldrh r0, [r1] - subs r0, r2 - strh r0, [r1] - ldr r0, [r3] - ldr r0, [r0, 0x4] -_08056986: - strh r0, [r1, 0x2] -_08056988: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08056990: .4byte gSaveBlock1 - thumb_func_end sub_8056918 - - thumb_func_start CameraMove -CameraMove: @ 8056994 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - mov r10, r0 - str r1, [sp] - ldr r1, _080569D4 @ =gUnknown_0202E844 - ldrb r0, [r1] - movs r1, 0x2 - negs r1, r1 - ands r1, r0 - ldr r2, _080569D4 @ =gUnknown_0202E844 - strb r1, [r2] - mov r0, r10 - ldr r1, [sp] - bl GetPostCameraMoveMapBorderId - adds r7, r0, 0 - adds r0, r7, 0x1 - cmp r0, 0x1 - bhi _080569DC - ldr r0, _080569D8 @ =gSaveBlock1 - ldrh r1, [r0] - add r1, r10 - strh r1, [r0] - ldrh r1, [r0, 0x2] - ldr r2, [sp] - adds r1, r2 - strh r1, [r0, 0x2] - b _08056A42 - .align 2, 0 -_080569D4: .4byte gUnknown_0202E844 -_080569D8: .4byte gSaveBlock1 -_080569DC: - bl save_serialize_map - ldr r5, _08056A5C @ =gSaveBlock1 - movs r0, 0 - ldrsh r6, [r5, r0] - movs r2, 0x2 - ldrsh r1, [r5, r2] - mov r8, r1 - lsls r0, r7, 24 - lsrs r0, 24 - mov r9, r0 - adds r1, r6, 0 - mov r2, r8 - bl sub_8056A64 - adds r4, r0, 0 - adds r1, r7, 0 - mov r2, r10 - ldr r3, [sp] - bl sub_8056918 - ldrb r0, [r4, 0x8] - ldrb r1, [r4, 0x9] - bl sub_80538F0 - ldr r1, _08056A60 @ =gUnknown_0202E844 - ldrb r0, [r1] - movs r1, 0x1 - orrs r0, r1 - ldr r2, _08056A60 @ =gUnknown_0202E844 - strb r0, [r2] - movs r1, 0 - ldrsh r0, [r5, r1] - subs r6, r0 - str r6, [r2, 0x4] - movs r2, 0x2 - ldrsh r0, [r5, r2] - mov r1, r8 - subs r1, r0 - ldr r2, _08056A60 @ =gUnknown_0202E844 - str r1, [r2, 0x8] - ldrh r0, [r5] - add r0, r10 - strh r0, [r5] - ldrh r0, [r5, 0x2] - ldr r1, [sp] - adds r0, r1 - strh r0, [r5, 0x2] - mov r0, r9 - bl sub_80566F0 -_08056A42: - ldr r0, _08056A60 @ =gUnknown_0202E844 - ldrb r0, [r0] - lsls r0, 31 - lsrs r0, 31 - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08056A5C: .4byte gSaveBlock1 -_08056A60: .4byte gUnknown_0202E844 - thumb_func_end CameraMove - - thumb_func_start sub_8056A64 -sub_8056A64: @ 8056A64 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - mov r9, r1 - mov r8, r2 - lsls r0, 24 - lsrs r6, r0, 24 - ldr r0, _08056AA0 @ =gMapHeader - ldr r0, [r0, 0xC] - ldr r7, [r0] - ldr r4, [r0, 0x4] - movs r5, 0 - cmp r5, r7 - bge _08056AAC -_08056A82: - ldrb r0, [r4] - cmp r0, r6 - bne _08056AA4 - adds r0, r6, 0 - mov r1, r9 - mov r2, r8 - adds r3, r4, 0 - bl sub_8056ABC - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08056AA4 - adds r0, r4, 0 - b _08056AAE - .align 2, 0 -_08056AA0: .4byte gMapHeader -_08056AA4: - adds r5, 0x1 - adds r4, 0xC - cmp r5, r7 - blt _08056A82 -_08056AAC: - movs r0, 0 -_08056AAE: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8056A64 - - thumb_func_start sub_8056ABC -sub_8056ABC: @ 8056ABC - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r7, r1, 0 - mov r8, r2 - adds r5, r3, 0 - lsls r0, 24 - lsrs r4, r0, 24 - adds r6, r4, 0 - adds r0, r5, 0 - bl mapconnection_get_mapheader - adds r2, r0, 0 - cmp r4, 0x1 - blt _08056B14 - cmp r4, 0x2 - bgt _08056AF4 - ldr r0, _08056AF0 @ =gMapHeader - ldr r0, [r0] - ldr r1, [r0] - ldr r0, [r2] - ldr r2, [r0] - ldr r3, [r5, 0x4] - adds r0, r7, 0 - b _08056B06 - .align 2, 0 -_08056AF0: .4byte gMapHeader -_08056AF4: - cmp r6, 0x4 - bgt _08056B14 - ldr r0, _08056B10 @ =gMapHeader - ldr r0, [r0] - ldr r1, [r0, 0x4] - ldr r0, [r2] - ldr r2, [r0, 0x4] - ldr r3, [r5, 0x4] - mov r0, r8 -_08056B06: - bl sub_8056B20 - lsls r0, 24 - lsrs r0, 24 - b _08056B16 - .align 2, 0 -_08056B10: .4byte gMapHeader -_08056B14: - movs r0, 0 -_08056B16: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8056ABC - - thumb_func_start sub_8056B20 -sub_8056B20: @ 8056B20 - push {r4,lr} - adds r4, r0, 0 - adds r0, r2, 0 - adds r2, r3, 0 - cmp r3, 0 - bge _08056B2E - movs r3, 0 -_08056B2E: - adds r2, r0, r2 - cmp r2, r1 - bge _08056B36 - adds r1, r2, 0 -_08056B36: - cmp r3, r4 - bgt _08056B42 - cmp r4, r1 - bgt _08056B42 - movs r0, 0x1 - b _08056B44 -_08056B42: - movs r0, 0 -_08056B44: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_8056B20 - - thumb_func_start sub_8056B4C -sub_8056B4C: @ 8056B4C - push {lr} - cmp r0, 0 - blt _08056B5A - cmp r0, r1 - bge _08056B5A - movs r0, 0x1 - b _08056B5C -_08056B5A: - movs r0, 0 -_08056B5C: - pop {r1} - bx r1 - thumb_func_end sub_8056B4C - - thumb_func_start sub_8056B60 -sub_8056B60: @ 8056B60 - push {r4-r6,lr} - adds r4, r0, 0 - adds r5, r1, 0 - adds r6, r2, 0 - bl mapconnection_get_mapheader - adds r1, r0, 0 - ldrb r0, [r4] - cmp r0, 0x1 - blt _08056B98 - cmp r0, 0x2 - bgt _08056B86 - ldr r0, [r4, 0x4] - subs r0, r5, r0 - ldr r1, [r1] - ldr r1, [r1] - bl sub_8056B4C - b _08056B9A -_08056B86: - cmp r0, 0x4 - bgt _08056B98 - ldr r0, [r4, 0x4] - subs r0, r6, r0 - ldr r1, [r1] - ldr r1, [r1, 0x4] - bl sub_8056B4C - b _08056B9A -_08056B98: - movs r0, 0 -_08056B9A: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_8056B60 - - thumb_func_start sub_8056BA0 -sub_8056BA0: @ 8056BA0 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - lsls r0, 16 - lsrs r0, 16 - mov r8, r0 - lsls r1, 16 - lsrs r1, 16 - ldr r2, _08056BC0 @ =gMapHeader - ldr r0, [r2, 0xC] - cmp r0, 0 - bne _08056BC8 - b _08056C3E - .align 2, 0 -_08056BC0: .4byte gMapHeader -_08056BC4: - adds r0, r4, 0 - b _08056C40 -_08056BC8: - ldr r7, [r0] - ldr r4, [r0, 0x4] - movs r6, 0 - cmp r6, r7 - bge _08056C3E - lsls r0, r1, 16 - asrs r5, r0, 16 - mov r9, r2 - mov r1, r8 - lsls r0, r1, 16 - asrs r0, 16 - mov r10, r0 -_08056BE0: - ldrb r1, [r4] - adds r3, r1, 0 - subs r0, r1, 0x5 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bls _08056C36 - cmp r1, 0x2 - bne _08056BF6 - cmp r5, 0x6 - bgt _08056C36 -_08056BF6: - cmp r1, 0x1 - bne _08056C06 - mov r2, r9 - ldr r0, [r2] - ldr r0, [r0, 0x4] - adds r0, 0x7 - cmp r5, r0 - blt _08056C36 -_08056C06: - mov r0, r8 - lsls r2, r0, 16 - cmp r1, 0x3 - bne _08056C14 - mov r1, r10 - cmp r1, 0x6 - bgt _08056C36 -_08056C14: - cmp r3, 0x4 - bne _08056C26 - asrs r1, r2, 16 - mov r3, r9 - ldr r0, [r3] - ldr r0, [r0] - adds r0, 0x7 - cmp r1, r0 - blt _08056C36 -_08056C26: - asrs r1, r2, 16 - subs r1, 0x7 - adds r0, r4, 0 - subs r2, r5, 0x7 - bl sub_8056B60 - cmp r0, 0x1 - beq _08056BC4 -_08056C36: - adds r6, 0x1 - adds r4, 0xC - cmp r6, r7 - blt _08056BE0 -_08056C3E: - movs r0, 0 -_08056C40: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8056BA0 - - thumb_func_start sub_8056C50 -sub_8056C50: @ 8056C50 - lsls r0, 16 - lsrs r0, 16 - lsls r1, 16 - lsrs r1, 16 - ldr r2, _08056C64 @ =gSaveBlock1 - subs r0, 0x7 - strh r0, [r2] - subs r1, 0x7 - strh r1, [r2, 0x2] - bx lr - .align 2, 0 -_08056C64: .4byte gSaveBlock1 - thumb_func_end sub_8056C50 - - thumb_func_start sav1_camera_get_focus_coords -sav1_camera_get_focus_coords: @ 8056C68 - ldr r3, _08056C78 @ =gSaveBlock1 - ldrh r2, [r3] - adds r2, 0x7 - strh r2, [r0] - ldrh r0, [r3, 0x2] - adds r0, 0x7 - strh r0, [r1] - bx lr - .align 2, 0 -_08056C78: .4byte gSaveBlock1 - thumb_func_end sav1_camera_get_focus_coords - - thumb_func_start unref_sub_8056C7C -unref_sub_8056C7C: @ 8056C7C - ldr r2, _08056C84 @ =gSaveBlock1 - strh r0, [r2] - strh r1, [r2, 0x2] - bx lr - .align 2, 0 -_08056C84: .4byte gSaveBlock1 - thumb_func_end unref_sub_8056C7C - - thumb_func_start GetCameraCoords -GetCameraCoords: @ 8056C88 - ldr r3, _08056C94 @ =gSaveBlock1 - ldrh r2, [r3] - strh r2, [r0] - ldrh r0, [r3, 0x2] - strh r0, [r1] - bx lr - .align 2, 0 -_08056C94: .4byte gSaveBlock1 - thumb_func_end GetCameraCoords - - thumb_func_start sub_8056C98 -sub_8056C98: @ 8056C98 - push {lr} - adds r2, r0, 0 - cmp r2, 0 - beq _08056CB8 - ldrb r0, [r2] - cmp r0, 0 - bne _08056CB2 - ldr r0, [r2, 0x4] - movs r2, 0x80 - lsls r2, 5 - bl CpuFastSet - b _08056CB8 -_08056CB2: - ldr r0, [r2, 0x4] - bl LZ77UnCompVram -_08056CB8: - pop {r0} - bx r0 - thumb_func_end sub_8056C98 - - thumb_func_start sub_8056CBC -sub_8056CBC: @ 8056CBC - push {r4-r6,lr} - sub sp, 0x4 - adds r4, r0, 0 - adds r5, r1, 0 - adds r6, r2, 0 - cmp r4, 0 - beq _08056D1E - ldrb r1, [r4, 0x1] - cmp r1, 0 - bne _08056CEE - mov r0, sp - strh r1, [r0] - lsls r1, r5, 16 - lsrs r1, 16 - movs r2, 0x2 - bl LoadPalette - ldr r0, [r4, 0x8] - adds r0, 0x2 - adds r1, r5, 0x1 - lsls r1, 16 - lsrs r1, 16 - subs r2, r6, 0x2 - lsls r2, 16 - b _08056CFC -_08056CEE: - cmp r1, 0x1 - bne _08056D04 - ldr r0, [r4, 0x8] - adds r0, 0xC0 - lsls r1, r5, 16 - lsrs r1, 16 - lsls r2, r6, 16 -_08056CFC: - lsrs r2, 16 - bl LoadPalette - b _08056D1E -_08056D04: - ldr r0, [r4, 0x8] - movs r4, 0x80 - lsls r4, 18 - adds r1, r4, 0 - bl LZ77UnCompVram - lsls r1, r5, 16 - lsrs r1, 16 - lsls r2, r6, 16 - lsrs r2, 16 - adds r0, r4, 0 - bl LoadPalette -_08056D1E: - add sp, 0x4 - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end sub_8056CBC - - thumb_func_start sub_8056D28 -sub_8056D28: @ 8056D28 - push {lr} - movs r1, 0xC0 - lsls r1, 19 - ldr r0, [r0, 0x10] - bl sub_8056C98 - pop {r0} - bx r0 - thumb_func_end sub_8056D28 - - thumb_func_start sub_8056D38 -sub_8056D38: @ 8056D38 - push {lr} - ldr r1, _08056D48 @ =0x06004000 - ldr r0, [r0, 0x14] - bl sub_8056C98 - pop {r0} - bx r0 - .align 2, 0 -_08056D48: .4byte 0x06004000 - thumb_func_end sub_8056D38 - - thumb_func_start apply_map_tileset1_palette -apply_map_tileset1_palette: @ 8056D4C - push {lr} - ldr r0, [r0, 0x10] - movs r1, 0 - movs r2, 0xC0 - bl sub_8056CBC - pop {r0} - bx r0 - thumb_func_end apply_map_tileset1_palette - - thumb_func_start apply_map_tileset2_palette -apply_map_tileset2_palette: @ 8056D5C - push {lr} - ldr r0, [r0, 0x14] - movs r1, 0x60 - movs r2, 0xC0 - bl sub_8056CBC - pop {r0} - bx r0 - thumb_func_end apply_map_tileset2_palette - - thumb_func_start copy_map_tileset1_tileset2_to_vram -copy_map_tileset1_tileset2_to_vram: @ 8056D6C - push {r4,lr} - adds r4, r0, 0 - cmp r4, 0 - beq _08056D7E - bl sub_8056D28 - adds r0, r4, 0 - bl sub_8056D38 -_08056D7E: - pop {r4} - pop {r0} - bx r0 - thumb_func_end copy_map_tileset1_tileset2_to_vram - - thumb_func_start apply_map_tileset1_tileset2_palette -apply_map_tileset1_tileset2_palette: @ 8056D84 - push {r4,lr} - adds r4, r0, 0 - cmp r4, 0 - beq _08056D96 - bl apply_map_tileset1_palette - adds r0, r4, 0 - bl apply_map_tileset2_palette -_08056D96: - pop {r4} - pop {r0} - bx r0 - thumb_func_end apply_map_tileset1_tileset2_palette - - .align 2, 0 @ Don't pad with nop. diff --git a/include/gba/macro.h b/include/gba/macro.h index 62d3e73fa..230fb4383 100644 --- a/include/gba/macro.h +++ b/include/gba/macro.h @@ -25,6 +25,8 @@ CPU_FAST_SET_SRC_FIXED | ((size)/(32/8) & 0x1FFFFF)); \ } +#define CpuFastFill16(value, dest, size) CpuFastFill(((value) << 16) | (value), (dest), (size)) + #define CpuFastCopy(src, dest, size) CpuFastSet(src, dest, ((size)/(32/8) & 0x1FFFFF)) #define DmaSet(dmaNum, src, dest, control) \ diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 68a4f9322..9bcd9c3e7 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -3,10 +3,10 @@ enum { - CONNECTION_DOWN = 1, - CONNECTION_UP, - CONNECTION_LEFT, - CONNECTION_RIGHT, + CONNECTION_SOUTH = 1, + CONNECTION_NORTH, + CONNECTION_WEST, + CONNECTION_EAST, CONNECTION_DIVE, CONNECTION_EMERGE }; @@ -28,8 +28,8 @@ struct MapData { s32 width; s32 height; - void *border; - void *map; + u16 *border; + u16 *map; struct Tileset *primaryTileset; struct Tileset *secondaryTileset; }; @@ -91,8 +91,8 @@ struct MapConnection { u8 direction; u32 offset; - s8 mapGroup; - s8 mapNum; + u8 mapGroup; + u8 mapNum; }; struct MapConnections diff --git a/ld_script.txt b/ld_script.txt index 1a3878824..716e0563e 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -66,7 +66,7 @@ SECTIONS { src/play_time.o(.text); src/new_game.o(.text); src/rom4.o(.text); - asm/fieldmap.o(.text); + src/fieldmap.o(.text); asm/metatile_behavior.o(.text); src/field_camera.o(.text); src/field_door.o(.text); diff --git a/src/fieldmap.c b/src/fieldmap.c new file mode 100644 index 000000000..b6d451525 --- /dev/null +++ b/src/fieldmap.c @@ -0,0 +1,939 @@ +#include "global.h" +#include "palette.h" + +struct BackupMapData +{ + s32 width; + s32 height; + u16 *map; +}; + +extern struct MapHeader * const get_mapheader_by_bank_and_number(u8, u8); +extern void mapheader_run_script_with_tag_x1(void); +extern void sub_80BB970(struct MapEvents *); +extern void sub_80BBCCC(); +extern void sub_8056670(); +extern void UpdateTVScreensOnMap(); +extern void sub_80538F0(u8 mapGroup, u8 mapNum); + +struct Camera { + bool8 field_0:1; + s32 x; + s32 y; +}; + +struct ConnectionFlags { + u8 south:1; + u8 north:1; + u8 west:1; + u8 east:1; +}; + +struct Coords32 { + s32 x; + s32 y; +}; + +extern const struct Coords32 gUnknown_0821664C[]; +extern struct BackupMapData gUnknown_03004870; + +EWRAM_DATA static u16 gUnknown_02029828[0x2800] = {0}; +EWRAM_DATA struct MapHeader gMapHeader = {0}; +EWRAM_DATA struct Camera gUnknown_0202E844 = {0}; +EWRAM_DATA static struct ConnectionFlags gUnknown_0202E850 = {0}; + +extern const struct ConnectionFlags gUnknown_08308E28; + +void mapheader_copy_mapdata_with_padding(struct MapHeader *mapHeader); +void sub_80560AC(struct MapHeader *); +void map_copy_with_padding(u16 *map, u16 width, u16 height); +void fillSouthConnection(struct MapHeader *, struct MapHeader *, s32); +void fillNorthConnection(struct MapHeader *, struct MapHeader *, s32); +void fillWestConnection(struct MapHeader *, struct MapHeader *, s32); +void fillEastConnection(struct MapHeader *, struct MapHeader *, s32); +u32 GetBehaviorByMetatileId(u16 metatile); +struct MapConnection *sub_8056A64(u8 direction, int x, int y); +bool8 sub_8056ABC(u8 direction, int x, int y, struct MapConnection *connection); +bool8 sub_8056B20(int x, int src_width, int dest_width, int offset); + +struct MapHeader *mapconnection_get_mapheader(struct MapConnection *connection) { + return get_mapheader_by_bank_and_number(connection->mapGroup, connection->mapNum); +} + +void not_trainer_hill_battle_pyramid(void) { + mapheader_copy_mapdata_with_padding(&gMapHeader); + sub_80BB970(gMapHeader.events); + mapheader_run_script_with_tag_x1(); +} + +void sub_8055FC0(void) { + mapheader_copy_mapdata_with_padding(&gMapHeader); + sub_80BBCCC(0); + sub_80BB970(gMapHeader.events); + sub_8056670(); + mapheader_run_script_with_tag_x1(); + UpdateTVScreensOnMap(gUnknown_03004870.width, gUnknown_03004870.height); +} + +void mapheader_copy_mapdata_with_padding(struct MapHeader *mapHeader) { + struct MapData *mapData; + int width; + int height; + mapData = mapHeader->mapData; + CpuFastFill16(0x03ff, gUnknown_02029828, sizeof(gUnknown_02029828)); + gUnknown_03004870.map = gUnknown_02029828; + width = mapData->width + 15; + gUnknown_03004870.width = width; + height = mapData->height + 14; + gUnknown_03004870.height = height; + if (width * height <= 0x2800) { + map_copy_with_padding(mapData->map, mapData->width, mapData->height); + sub_80560AC(mapHeader); + } +} + +void map_copy_with_padding(u16 *map, u16 width, u16 height) { + u16 *dest; + int y; + dest = gUnknown_03004870.map; + dest += gUnknown_03004870.width * 7 + 7; + for (y = 0; y < height; y++) { + CpuCopy16(map, dest, width * 2); + dest += width + 0xf; + map += width; + } +} + +void sub_80560AC(struct MapHeader *mapHeader) { + int i; + struct MapConnection *connection; + struct MapHeader *cMap; + u32 offset; + int count; + count = mapHeader->connections->count; + connection = mapHeader->connections->connections; + gUnknown_0202E850 = gUnknown_08308E28; + for (i = 0; i < count; i++, connection++) { + cMap = mapconnection_get_mapheader(connection); + offset = connection->offset; + switch (connection->direction) { + case CONNECTION_SOUTH: + fillSouthConnection(mapHeader, cMap, offset); + gUnknown_0202E850.south = 1; + break; + case CONNECTION_NORTH: + fillNorthConnection(mapHeader, cMap, offset); + gUnknown_0202E850.north = 1; + break; + case CONNECTION_WEST: + fillWestConnection(mapHeader, cMap, offset); + gUnknown_0202E850.west = 1; + break; + case CONNECTION_EAST: + fillEastConnection(mapHeader, cMap, offset); + gUnknown_0202E850.east = 1; + break; + } + } +} + +void sub_8056134(int x, int y, struct MapHeader *mapHeader, int x2, int y2, int width, int height) { + int i; + u16 *src; + u16 *dest; + int mapWidth; + + mapWidth = mapHeader->mapData->width; + src = &mapHeader->mapData->map[mapWidth * y2 + x2]; + dest = &gUnknown_03004870.map[gUnknown_03004870.width * y + x]; + + for (i = 0; i < height; i++) { + CpuCopy16(src, dest, width * 2); + dest += gUnknown_03004870.width; + src += mapWidth; + } +} + +void fillSouthConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) { + int x, y; + int x2, y2; + int width, height; + int cWidth; + + if (connectedMapHeader) { + cWidth = connectedMapHeader->mapData->width; + x = offset + 7; + y = mapHeader->mapData->height + 7; + if (x < 0) { + x2 = -x; + x += cWidth; + if (x < gUnknown_03004870.width) { + width = x; + } else { + width = gUnknown_03004870.width; + } + x = 0; + } else { + x2 = 0; + if (x + cWidth < gUnknown_03004870.width) { + width = cWidth; + } else { + width = gUnknown_03004870.width - x; + } + } + sub_8056134( + x, y, + connectedMapHeader, + x2, /*y2*/ 0, + width, /*height*/ 7); + } +} + +void fillNorthConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) { + int x, y; + int x2, y2; + int width, height; + int cWidth, cHeight; + + if (connectedMapHeader) { + cWidth = connectedMapHeader->mapData->width; + cHeight = connectedMapHeader->mapData->height; + x = offset + 7; + y2 = cHeight - 7; + if (x < 0) { + x2 = -x; + x += cWidth; + if (x < gUnknown_03004870.width) { + width = x; + } else { + width = gUnknown_03004870.width; + } + x = 0; + } else { + x2 = 0; + if (x + cWidth < gUnknown_03004870.width) { + width = cWidth; + } else { + width = gUnknown_03004870.width - x; + } + } + + sub_8056134( + x, /*y*/ 0, + connectedMapHeader, + x2, y2, + width, /*height*/ 7); + + } +} + + +void fillWestConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) { + int x, y; + int x2, y2; + int width, height; + int cWidth, cHeight; + if (connectedMapHeader) { + cWidth = connectedMapHeader->mapData->width; + cHeight = connectedMapHeader->mapData->height; + y = offset + 7; + x2 = cWidth - 7; + if (y < 0) { + y2 = -y; + if (y + cHeight < gUnknown_03004870.height) { + height = y + cHeight; + } else { + height = gUnknown_03004870.height; + } + y = 0; + } else { + y2 = 0; + if (y + cHeight < gUnknown_03004870.height) { + height = cHeight; + } else { + height = gUnknown_03004870.height - y; + } + } + + sub_8056134( + /*x*/ 0, y, + connectedMapHeader, + x2, y2, + /*width*/ 7, height); + } +} + +void fillEastConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) { + int x, y; + int x2, y2; + int width, height; + int cWidth, cHeight; + if (connectedMapHeader) { + cHeight = connectedMapHeader->mapData->height; + x = mapHeader->mapData->width + 7; + y = offset + 7; + if (y < 0) { + y2 = -y; + if (y + cHeight < gUnknown_03004870.height) { + height = y + cHeight; + } else { + height = gUnknown_03004870.height; + } + y = 0; + } else { + y2 = 0; + if (y + cHeight < gUnknown_03004870.height) { + height = cHeight; + } else { + height = gUnknown_03004870.height - y; + } + } + + sub_8056134( + x, y, + connectedMapHeader, + /*x2*/ 0, y2, + /*width*/ 8, height); + } +} + +union Block { + struct { + u16 block:10; + u16 collision:2; + u16 elevation:4; + } block; + u16 value; +}; + +u16 MapGridGetZCoordAt(int x, int y) { + u16 block; + int i; + u16 *border; + + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) { + block = gUnknown_03004870.map[x + gUnknown_03004870.width * y]; + } else { + border = gMapHeader.mapData->border; + i = (x + 1) & 1; + i += ((y + 1) & 1) * 2; + block = gMapHeader.mapData->border[i]; + block |= 0xc00; + } + if (block == 0x3ff) { + return 0; + } + return block >> 12; +} + +u16 MapGridIsImpassableAt(int x, int y) { + u16 block; + int i; + u16 *border; + + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) { + block = gUnknown_03004870.map[x + gUnknown_03004870.width * y]; + } else { + border = gMapHeader.mapData->border; + i = (x + 1) & 1; + i += ((y + 1) & 1) * 2; + block = gMapHeader.mapData->border[i]; + block |= 0xc00; + } + if (block == 0x3ff) { + return 1; + } + return (block & 0xc00) >> 10; +} + +u16 MapGridGetMetatileIdAt(int x, int y) { + u16 block; + int i; + int j; + struct MapData *mapData; + u16 *border; + u16 block2; + + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) { + block = gUnknown_03004870.map[x + gUnknown_03004870.width * y]; + } else { + mapData = gMapHeader.mapData; + i = (x + 1) & 1; + i += ((y + 1) & 1) * 2; + block = mapData->border[i] | 0xc00; + } + if (block == 0x3ff) { + border = gMapHeader.mapData->border; + j = (x + 1) & 1; + j += ((y + 1) & 1) * 2; + block2 = gMapHeader.mapData->border[j]; + block2 |= 0xc00; + return block2 & block; + } + return block & 0x3ff; +} + +u32 MapGridGetMetatileBehaviorAt(int x, int y) { + u16 metatile; + metatile = MapGridGetMetatileIdAt(x, y); + return GetBehaviorByMetatileId(metatile) & 0xff; +} + +u16 MapGridGetMetatileLayerTypeAt(int x, int y) { + u16 metatile; + metatile = MapGridGetMetatileIdAt(x, y); + return (GetBehaviorByMetatileId(metatile) & 0xf000) >> 12; +} + +void MapGridSetMetatileIdAt(int x, int y, u16 metatile) { + int i; + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) { + i = x + y * gUnknown_03004870.width; + gUnknown_03004870.map[i] = (gUnknown_03004870.map[i] & 0xf000) | (metatile & 0xfff); + } +} + +void MapGridSetMetatileEntryAt(int x, int y, u16 metatile) { + int i; + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) { + i = x + gUnknown_03004870.width * y; + gUnknown_03004870.map[i] = metatile; + } +} + +u32 GetBehaviorByMetatileId(u16 metatile) { + u16 *attributes; + if (metatile <= 0x1ff) { + attributes = gMapHeader.mapData->primaryTileset->metatileAttributes; + return attributes[metatile]; + } else if (metatile <= 0x3ff) { + attributes = gMapHeader.mapData->secondaryTileset->metatileAttributes; + return attributes[metatile - 0x200]; + } else { + return 0xff; + } +} + +void save_serialize_map(void) { + int i, j; + int x, y; + u16 *mapView; + int width; + mapView = gSaveBlock1.mapView; + width = gUnknown_03004870.width; + x = gSaveBlock1.pos.x; + y = gSaveBlock1.pos.y; + for (i = y; i < y + 14; i++) + for (j = x; j < x + 15; j++) { + *mapView++ = gUnknown_02029828[width * i + j]; + } +} + +int sub_8056618(void) { + u16 i; + u32 r2; + r2 = 0; + for (i = 0; i < 0x200; i++) { + r2 |= gSaveBlock1.mapView[i]; + } + if (r2 == 0) { + return 1; + } + return 0; +} + +void sav2_mapdata_clear(void) { + CpuFill16(0, gSaveBlock1.mapView, sizeof(gSaveBlock1.mapView)); +} + +void sub_8056670(void) { + int i, j; + int x, y; + u16 *mapView; + int width; + mapView = gSaveBlock1.mapView; + if (!sub_8056618()) { + width = gUnknown_03004870.width; + x = gSaveBlock1.pos.x; + y = gSaveBlock1.pos.y; + for (i = y; i < y + 14; i++) + for (j = x; j < x + 15; j++) { + gUnknown_02029828[width * i + j] = *mapView++; + } + sav2_mapdata_clear(); + } +} + +void sub_80566F0(u8 a1) { + u16 *mapView; + int width; + int x0, y0; + int x2, y2; + u16 *src, *dest; + int srci, desti; + int r9, r8; + int x, y; + int i, j; + mapView = gSaveBlock1.mapView; + width = gUnknown_03004870.width; + r9 = 0; + r8 = 0; + x0 = gSaveBlock1.pos.x; + y0 = gSaveBlock1.pos.y; + x2 = 15; + y2 = 14; + switch (a1) { + case 2: + y0 += 1; + y2 = 13; + break; + case 1: + r8 = 1; + y2 = 13; + break; + case 3: + x0 += 1; + x2 = 14; + break; + case 4: + r9 = 1; + x2 = 14; + break; + } + for (y = 0; y < y2; y++) { + i = 0; + j = 0; + for (x = 0; x < x2; x++) { + desti = width * (y + y0); + srci = (y + r8) * 15 + r9; + src = &mapView[srci + i]; + dest = &gUnknown_02029828[x0 + desti + j]; + *dest = *src; + i++; + j++; + } + } + sav2_mapdata_clear(); +} + +#ifdef NONMATCHING +// TODO FIXME returns are in the wrong order +int GetMapBorderIdAt(int x, int y) { + struct MapData *mapData; + u16 block, block2; + int i, j; + if (x >= 0 && x < gUnknown_03004870.width + && y >= 0 && y < gUnknown_03004870.height) { + i = gUnknown_03004870.width; + i *= y; + block = gUnknown_03004870.map[x + i]; + if (block == 0x3ff) { + return -1; + } + } else { + mapData = gMapHeader.mapData; + j = (x + 1) & 1; + j += ((y + 1) & 1) * 2; + block2 = 0xc00 | mapData->border[j]; + if (block2 == 0x3ff) { + return -1; + } + } + if (x >= (gUnknown_03004870.width - 8)) { + if (gUnknown_0202E850.east) { + return CONNECTION_EAST; + } else { + return -1; + } + } else if (x < 7) { + if (gUnknown_0202E850.west) { + return CONNECTION_WEST; + } else { + return -1; + } + } else if (y >= (gUnknown_03004870.height - 7)) { + if (gUnknown_0202E850.south) { + return CONNECTION_SOUTH; + } else { + return -1; + } + } else if (y < 7) { + if (gUnknown_0202E850.north) { + return CONNECTION_NORTH; + } else { + return -1; + } + } + return 0; +} +#else +__attribute__((naked)) +int GetMapBorderIdAt(int x, int y) { +asm( +" .syntax unified\n" +"\n" +" push {r4,r5,lr}\n" +" adds r4, r0, 0\n" +" adds r5, r1, 0\n" +" cmp r4, 0\n" +" blt _080567FC\n" +" ldr r1, _080567F4 @ =gUnknown_03004870\n" +" ldr r2, [r1]\n" +" cmp r4, r2\n" +" bge _080567FC\n" +" cmp r5, 0\n" +" blt _080567FC\n" +" ldr r0, [r1, 0x4]\n" +" cmp r5, r0\n" +" bge _080567FC\n" +" adds r0, r2, 0\n" +" muls r0, r5\n" +" adds r0, r4, r0\n" +" ldr r1, [r1, 0x8]\n" +" lsls r0, 1\n" +" adds r0, r1\n" +" ldrh r1, [r0]\n" +" ldr r0, _080567F8 @ =0x000003ff\n" +" cmp r1, r0\n" +" beq _08056894\n" +" b _08056824\n" +" .align 2, 0\n" +"_080567F4: .4byte gUnknown_03004870\n" +"_080567F8: .4byte 0x000003ff\n" +"_080567FC:\n" +" ldr r0, _08056840 @ =gMapHeader\n" +" ldr r3, [r0]\n" +" adds r1, r4, 0x1\n" +" movs r2, 0x1\n" +" ands r1, r2\n" +" adds r0, r5, 0x1\n" +" ands r0, r2\n" +" lsls r0, 1\n" +" adds r1, r0\n" +" ldr r0, [r3, 0x8]\n" +" lsls r1, 1\n" +" adds r1, r0\n" +" ldrh r1, [r1]\n" +" movs r2, 0xC0\n" +" lsls r2, 4\n" +" adds r0, r2, 0\n" +" orrs r0, r1\n" +" ldr r1, _08056844 @ =0x000003ff\n" +" cmp r0, r1\n" +" beq _08056894\n" +"_08056824:\n" +" ldr r1, _08056848 @ =gUnknown_03004870\n" +" ldr r0, [r1]\n" +" subs r0, 0x8\n" +" cmp r4, r0\n" +" blt _08056850\n" +" ldr r0, _0805684C @ =gUnknown_0202E850\n" +" ldrb r1, [r0]\n" +" movs r0, 0x8\n" +" ands r0, r1\n" +" cmp r0, 0\n" +" beq _08056894\n" +" movs r0, 0x4\n" +" b _080568A6\n" +" .align 2, 0\n" +"_08056840: .4byte gMapHeader\n" +"_08056844: .4byte 0x000003ff\n" +"_08056848: .4byte gUnknown_03004870\n" +"_0805684C: .4byte gUnknown_0202E850\n" +"_08056850:\n" +" cmp r4, 0x6\n" +" bgt _08056868\n" +" ldr r0, _08056864 @ =gUnknown_0202E850\n" +" ldrb r1, [r0]\n" +" movs r0, 0x4\n" +" ands r0, r1\n" +" cmp r0, 0\n" +" beq _08056894\n" +" movs r0, 0x3\n" +" b _080568A6\n" +" .align 2, 0\n" +"_08056864: .4byte gUnknown_0202E850\n" +"_08056868:\n" +" ldr r0, [r1, 0x4]\n" +" subs r0, 0x7\n" +" cmp r5, r0\n" +" blt _08056884\n" +" ldr r0, _08056880 @ =gUnknown_0202E850\n" +" ldrb r1, [r0]\n" +" movs r0, 0x1\n" +" ands r0, r1\n" +" cmp r0, 0\n" +" beq _08056894\n" +" movs r0, 0x1\n" +" b _080568A6\n" +" .align 2, 0\n" +"_08056880: .4byte gUnknown_0202E850\n" +"_08056884:\n" +" cmp r5, 0x6\n" +" bgt _080568A4\n" +" ldr r0, _0805689C @ =gUnknown_0202E850\n" +" ldrb r1, [r0]\n" +" movs r0, 0x2\n" +" ands r0, r1\n" +" cmp r0, 0\n" +" bne _080568A0\n" +"_08056894:\n" +" movs r0, 0x1\n" +" negs r0, r0\n" +" b _080568A6\n" +" .align 2, 0\n" +"_0805689C: .4byte gUnknown_0202E850\n" +"_080568A0:\n" +" movs r0, 0x2\n" +" b _080568A6\n" +"_080568A4:\n" +" movs r0, 0\n" +"_080568A6:\n" +" pop {r4,r5}\n" +" pop {r1}\n" +" bx r1\n" +" .syntax divided\n" +); +} +#endif + +int GetPostCameraMoveMapBorderId(int x, int y) { + return GetMapBorderIdAt(gSaveBlock1.pos.x + 7 + x, gSaveBlock1.pos.y + 7 + y); +} + +int CanCameraMoveInDirection(int direction) { + int x, y; + x = gSaveBlock1.pos.x + 7 + gUnknown_0821664C[direction].x; + y = gSaveBlock1.pos.y + 7 + gUnknown_0821664C[direction].y; + if (GetMapBorderIdAt(x, y) == -1) { + return 0; + } + return 1; +} + +void sub_8056918(struct MapConnection *connection, int direction, int x, int y) { + struct MapHeader *mapHeader; + mapHeader = mapconnection_get_mapheader(connection); + switch (direction) { + case CONNECTION_EAST: + gSaveBlock1.pos.x = -x; + gSaveBlock1.pos.y -= connection->offset; + break; + case CONNECTION_WEST: + gSaveBlock1.pos.x = mapHeader->mapData->width; + gSaveBlock1.pos.y -= connection->offset; + break; + case CONNECTION_SOUTH: + gSaveBlock1.pos.x -= connection->offset; + gSaveBlock1.pos.y = -y; + break; + case CONNECTION_NORTH: + gSaveBlock1.pos.x -= connection->offset; + gSaveBlock1.pos.y = mapHeader->mapData->height; + break; + } +} + +bool8 CameraMove(int x, int y) { + unsigned int direction; + struct MapConnection *connection; + int old_x, old_y; + gUnknown_0202E844.field_0 = FALSE; + direction = GetPostCameraMoveMapBorderId(x, y); + if (direction + 1 <= 1) { + gSaveBlock1.pos.x += x; + gSaveBlock1.pos.y += y; + } else { + save_serialize_map(); + old_x = gSaveBlock1.pos.x; + old_y = gSaveBlock1.pos.y; + connection = sub_8056A64(direction, gSaveBlock1.pos.x, gSaveBlock1.pos.y); + sub_8056918(connection, direction, x, y); + sub_80538F0(connection->mapGroup, connection->mapNum); + gUnknown_0202E844.field_0 = TRUE; + gUnknown_0202E844.x = old_x - gSaveBlock1.pos.x; + gUnknown_0202E844.y = old_y - gSaveBlock1.pos.y; + gSaveBlock1.pos.x += x; + gSaveBlock1.pos.y += y; + sub_80566F0(direction); + } + return gUnknown_0202E844.field_0; +} + +struct MapConnection *sub_8056A64(u8 direction, int x, int y) { + int count; + struct MapConnection *connection; + int i; + count = gMapHeader.connections->count; + connection = gMapHeader.connections->connections; + for (i = 0; i < count; i++, connection++) { + if (connection->direction == direction) { + if (sub_8056ABC(direction, x, y, connection) == TRUE) { + return connection; + } + } + } + return NULL; +} + +bool8 sub_8056ABC(u8 direction, int x, int y, struct MapConnection *connection) { + struct MapHeader *mapHeader; + mapHeader = mapconnection_get_mapheader(connection); + switch (direction) { + case CONNECTION_SOUTH: + case CONNECTION_NORTH: + return sub_8056B20(x, gMapHeader.mapData->width, mapHeader->mapData->width, connection->offset); + case CONNECTION_WEST: + case CONNECTION_EAST: + return sub_8056B20(y, gMapHeader.mapData->height, mapHeader->mapData->height, connection->offset); + } + return FALSE; +} + +bool8 sub_8056B20(int x, int src_width, int dest_width, int offset) { + int offset2; + offset2 = offset; + if (offset2 < 0) { + offset2 = 0; + } + if (dest_width + offset < src_width) { + src_width = dest_width + offset; + } + if (offset2 <= x && x <= src_width) { + return TRUE; + } + return FALSE; +} + +int sub_8056B4C(int x, int width) { + if (x >= 0 && x < width) { + return TRUE; + } + return FALSE; +} + +int sub_8056B60(struct MapConnection *connection, int x, int y) { + struct MapHeader *mapHeader; + mapHeader = mapconnection_get_mapheader(connection); + switch (connection->direction) { + case CONNECTION_SOUTH: + case CONNECTION_NORTH: + return sub_8056B4C(x - connection->offset, mapHeader->mapData->width); + case CONNECTION_WEST: + case CONNECTION_EAST: + return sub_8056B4C(y - connection->offset, mapHeader->mapData->height); + } + return FALSE; +} + +struct MapConnection *sub_8056BA0(s16 x, s16 y) { + int count; + struct MapConnection *connection; + int i; + u8 direction; + if (!gMapHeader.connections) { + return NULL; + } else { + count = gMapHeader.connections->count; + connection = gMapHeader.connections->connections; + for (i = 0; i < count; i++, connection++) { + direction = connection->direction; + if ( + (direction == CONNECTION_DIVE || direction == CONNECTION_EMERGE) + || (direction == CONNECTION_NORTH && y > 6) + || (direction == CONNECTION_SOUTH && y < gMapHeader.mapData->height + 7) + || (direction == CONNECTION_WEST && x > 6) + || (direction == CONNECTION_EAST && x < gMapHeader.mapData->width + 7) + ) { + continue; + } + if (sub_8056B60(connection, x - 7, y - 7) == TRUE) { + return connection; + } + } + } + return NULL; +} + +void sub_8056C50(u16 x, u16 y) { + gSaveBlock1.pos.x = x - 7; + gSaveBlock1.pos.y = y - 7; +} + +void sav1_camera_get_focus_coords(u16 *x, u16 *y) { + *x = gSaveBlock1.pos.x + 7; + *y = gSaveBlock1.pos.y + 7; +} + +void unref_sub_8056C7C(u16 x, u16 y) { + gSaveBlock1.pos.x = x; + gSaveBlock1.pos.y = y; +} + +void GetCameraCoords(u16 *x, u16 *y) { + *x = gSaveBlock1.pos.x; + *y = gSaveBlock1.pos.y; +} + +void sub_8056C98(struct Tileset *tileset, void *src) { + if (tileset) { + if (!tileset->isCompressed) { + CpuFastSet(tileset->tiles, src, 0x1000); + } else { + LZ77UnCompVram(tileset->tiles, src); + } + } +} + +void sub_8056CBC(struct Tileset *tileset, int offset, int size) { + u16 black; + if (tileset) { + if (tileset->isSecondary == FALSE) { + black = 0; + LoadPalette(&black, offset, 2); + LoadPalette(tileset->palettes + 2, offset + 1, size - 2); + } else if (tileset->isSecondary == TRUE) { + LoadPalette(tileset->palettes + 0xc0, offset, size); + } else { + LZ77UnCompVram(tileset->palettes, (void*)0x2000000); + LoadPalette((void*)0x2000000, offset, size); + } + } +} + +void sub_8056D28(struct MapData *mapData) { + void *src = (void*)(BG_VRAM); + sub_8056C98(mapData->primaryTileset, src); +} + +void sub_8056D38(struct MapData *mapData) { + void *src = (void*)(BG_VRAM + 0x4000); + sub_8056C98(mapData->secondaryTileset, src); +} + +void apply_map_tileset1_palette(struct MapData *mapData) { + sub_8056CBC(mapData->primaryTileset, 0, 0xc0); +} + +void apply_map_tileset2_palette(struct MapData *mapData) { + sub_8056CBC(mapData->secondaryTileset, 0x60, 0xc0); +} + +void copy_map_tileset1_tileset2_to_vram(struct MapData *mapData) { + if (mapData) { + sub_8056D28(mapData); + sub_8056D38(mapData); + } +} + +void apply_map_tileset1_tileset2_palette(struct MapData *mapData) { + if (mapData) { + apply_map_tileset1_palette(mapData); + apply_map_tileset2_palette(mapData); + } +} diff --git a/sym_ewram.txt b/sym_ewram.txt index eb71c9938..842903712 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -364,17 +364,7 @@ gUnknown_02029816: @ 2029816 gLinkPlayerMapObjects: @ 2029818 .space 0x10 -gUnknown_02029828: @ 2029828 - .space 0x5000 - -gMapHeader: @ 202E828 - .space 0x1C - -gUnknown_0202E844: @ 202E844 - .space 0xC - -gUnknown_0202E850: @ 202E850 - .space 0x4 + .include "src/fieldmap.o" gUnknown_0202E854: @ 202E854 .space 0x4 |