diff options
-rw-r--r-- | asm/field_specials.s | 6 | ||||
-rw-r--r-- | asm/macros.inc | 5 | ||||
-rw-r--r-- | asm/pokedex_area_markers.s | 357 | ||||
-rw-r--r-- | asm/pokedex_screen.s | 2 | ||||
-rw-r--r-- | asm/wild_encounter.s | 52 | ||||
-rw-r--r-- | asm/wild_pokemon_area.s | 380 | ||||
-rw-r--r-- | data/data_835B488.s | 2 | ||||
-rw-r--r-- | data/map_event_scripts.inc | 2 | ||||
-rw-r--r-- | data/maps/PalletTown_GarysHouse/scripts.inc | 2 | ||||
-rw-r--r-- | data/pokedex_area_markers.s | 14 | ||||
-rw-r--r-- | data/pokedex_area_markers/marker.png | bin | 0 -> 354 bytes | |||
-rw-r--r-- | data/wild_pokemon_area.s | 14 | ||||
-rw-r--r-- | include/constants/vars.h | 4 | ||||
-rw-r--r-- | include/field_specials.h | 1 | ||||
-rw-r--r-- | include/gba/types.h | 4 | ||||
-rw-r--r-- | include/pokedex_area_markers.h | 16 | ||||
-rw-r--r-- | include/roamer.h | 1 | ||||
-rw-r--r-- | include/wild_pokemon_area.h | 6 | ||||
-rw-r--r-- | ld_script.txt | 8 | ||||
-rw-r--r-- | src/pokedex_area_markers.c | 238 | ||||
-rw-r--r-- | src/wild_pokemon_area.c | 308 |
21 files changed, 615 insertions, 807 deletions
diff --git a/asm/field_specials.s b/asm/field_specials.s index 8d91064e8..c0294fcac 100644 --- a/asm/field_specials.s +++ b/asm/field_specials.s @@ -3665,8 +3665,8 @@ sub_80CC1E4: @ 80CC1E4 _080CC200: .4byte gSaveBlock2Ptr thumb_func_end sub_80CC1E4 - thumb_func_start sub_80CC204 -sub_80CC204: @ 80CC204 + thumb_func_start GetUnlockedSeviiAreas +GetUnlockedSeviiAreas: @ 80CC204 push {r4,lr} movs r4, 0 ldr r0, _080CC2A4 @ =0x0000089b @@ -3753,7 +3753,7 @@ _080CC2AC: .4byte 0x0000089d _080CC2B0: .4byte 0x0000089e _080CC2B4: .4byte 0x0000089f _080CC2B8: .4byte 0x000008a1 - thumb_func_end sub_80CC204 + thumb_func_end GetUnlockedSeviiAreas thumb_func_start sub_80CC2BC sub_80CC2BC: @ 80CC2BC diff --git a/asm/macros.inc b/asm/macros.inc index e6813d319..4eae2cccc 100644 --- a/asm/macros.inc +++ b/asm/macros.inc @@ -65,10 +65,9 @@ .endm .macro subsprite x, y, priority, tile_num_offset, size - .2byte \x - .2byte \y + .byte \x + .byte \y .2byte ((\priority) << 14) | ((\tile_num_offset) << 4) | SPRITE_SIZE_\size - .2byte 0 @ padding .endm .macro obj_image_anim_frame pic_id, duration, flags = 0 diff --git a/asm/pokedex_area_markers.s b/asm/pokedex_area_markers.s deleted file mode 100644 index d6ea7f251..000000000 --- a/asm/pokedex_area_markers.s +++ /dev/null @@ -1,357 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_8134200 -sub_8134200: @ 8134200 - lsls r0, 24 - lsrs r0, 24 - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - ldr r0, _08134228 @ =gTasks+0x8 - adds r1, r0 - ldr r2, _0813422C @ =gSprites - ldrb r1, [r1, 0xD] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - adds r0, 0x3E - ldrb r2, [r0] - movs r1, 0x5 - negs r1, r1 - ands r1, r2 - strb r1, [r0] - bx lr - .align 2, 0 -_08134228: .4byte gTasks+0x8 -_0813422C: .4byte gSprites - thumb_func_end sub_8134200 - - thumb_func_start sub_8134230 -sub_8134230: @ 8134230 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x28 - mov r9, r0 - mov r8, r2 - adds r6, r3, 0 - lsls r0, 16 - lsrs r0, 16 - mov r9, r0 - lsls r1, 16 - lsls r2, 24 - lsrs r2, 24 - mov r8, r2 - lsls r6, 24 - lsrs r6, 24 - ldr r0, _081343C4 @ =gUnknown_846343C - str r0, [sp, 0x20] - ldr r3, _081343C8 @ =0xffff0000 - add r0, sp, 0x20 - ldr r2, [r0, 0x4] - ands r2, r3 - movs r3, 0x94 - lsls r3, 3 - orrs r2, r3 - lsrs r7, r1, 16 - ldr r5, _081343CC @ =0x0000ffff - ands r2, r5 - orrs r2, r1 - str r2, [r0, 0x4] - bl LoadCompressedSpriteSheet - ldr r0, _081343D0 @ =gUnknown_846341C - mov r3, r8 - lsls r3, 4 - mov r8, r3 - movs r1, 0x80 - lsls r1, 1 - add r1, r8 - movs r2, 0x20 - bl LoadPalette - ldr r0, _081343D4 @ =sub_8134200 - movs r1, 0 - bl CreateTask - mov r10, r0 - mov r0, r10 - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - lsls r4, r0, 2 - add r4, r10 - lsls r4, 3 - ldr r0, _081343D8 @ =gTasks+0x8 - adds r4, r0 - movs r0, 0 - strb r0, [r4, 0xC] - strh r7, [r4, 0xE] - ldrh r0, [r4, 0x10] - orrs r5, r0 - strh r5, [r4, 0x10] - movs r0, 0xF0 - lsls r0, 1 - bl Alloc - adds r1, r0, 0 - str r1, [r4, 0x8] - str r1, [r4, 0x4] - mov r0, r9 - bl sub_813C9DC - strb r0, [r4] - movs r1, 0x80 - lsls r1, 8 - movs r0, 0 - bl SetGpuRegBits - ldr r1, _081343DC @ =0x00002f42 - movs r0, 0x50 - bl SetGpuReg - ldr r1, _081343E0 @ =0x0000080c - movs r0, 0x52 - bl SetGpuReg - movs r0, 0x54 - movs r1, 0 - bl SetGpuReg - ldr r1, _081343E4 @ =0x00001f1f - movs r0, 0x48 - bl SetGpuReg - ldr r1, _081343E8 @ =0x00002f3d - movs r0, 0x4A - bl SetGpuReg - add r1, sp, 0x8 - ldr r0, _081343EC @ =gDummySpriteTemplate - ldm r0!, {r2,r3,r5} - stm r1!, {r2,r3,r5} - ldm r0!, {r2,r3,r5} - stm r1!, {r2,r3,r5} - add r0, sp, 0x8 - strh r7, [r0] - adds r6, 0x20 - movs r1, 0x68 - adds r2, r6, 0 - movs r3, 0 - bl CreateSprite - strb r0, [r4, 0xD] - ldrb r1, [r4, 0xD] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - ldr r5, _081343F0 @ =gSprites - adds r0, r5 - adds r1, r4, 0 - bl SetSubspriteTables - ldrb r1, [r4, 0xD] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r5 - ldrb r2, [r0, 0x1] - movs r1, 0xD - negs r1, r1 - ands r1, r2 - movs r2, 0x8 - orrs r1, r2 - strb r1, [r0, 0x1] - ldrb r0, [r4, 0xD] - lsls r1, r0, 4 - adds r1, r0 - lsls r1, 2 - adds r1, r5 - ldrb r2, [r1, 0x5] - movs r0, 0xF - ands r0, r2 - mov r2, r8 - orrs r0, r2 - strb r0, [r1, 0x5] - ldrb r1, [r4, 0xD] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r5 - adds r0, 0x42 - ldrb r2, [r0] - movs r1, 0x40 - negs r1, r1 - ands r1, r2 - strb r1, [r0] - ldrb r1, [r4, 0xD] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r5 - adds r0, 0x3E - ldrb r1, [r0] - movs r2, 0x4 - orrs r1, r2 - strb r1, [r0] - movs r0, 0x1 - bl HideBg - movs r0, 0x1 - movs r1, 0x1 - movs r2, 0 - bl SetBgAttribute - movs r0, 0x1E - str r0, [sp] - movs r0, 0x14 - str r0, [sp, 0x4] - movs r0, 0x1 - movs r1, 0xF - movs r2, 0 - movs r3, 0 - bl FillBgTilemapBufferRect_Palette0 - movs r0, 0x1 - bl CopyBgTilemapBufferToVram - movs r0, 0x1 - bl ShowBg - mov r0, r10 - add sp, 0x28 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_081343C4: .4byte gUnknown_846343C -_081343C8: .4byte 0xffff0000 -_081343CC: .4byte 0x0000ffff -_081343D0: .4byte gUnknown_846341C -_081343D4: .4byte sub_8134200 -_081343D8: .4byte gTasks+0x8 -_081343DC: .4byte 0x00002f42 -_081343E0: .4byte 0x0000080c -_081343E4: .4byte 0x00001f1f -_081343E8: .4byte 0x00002f3d -_081343EC: .4byte gDummySpriteTemplate -_081343F0: .4byte gSprites - thumb_func_end sub_8134230 - - thumb_func_start sub_81343F4 -sub_81343F4: @ 81343F4 - push {r4,r5,lr} - sub sp, 0x8 - adds r5, r0, 0 - lsls r5, 24 - lsrs r5, 24 - lsls r4, r5, 2 - adds r4, r5 - lsls r4, 3 - ldr r0, _08134498 @ =gTasks+0x8 - adds r4, r0 - ldrh r0, [r4, 0xE] - bl FreeSpriteTilesByTag - ldrb r1, [r4, 0xD] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - ldr r1, _0813449C @ =gSprites - adds r0, r1 - bl DestroySprite - ldr r0, [r4, 0x8] - bl Free - movs r0, 0x50 - movs r1, 0 - bl SetGpuReg - movs r0, 0x52 - movs r1, 0 - bl SetGpuReg - movs r0, 0x54 - movs r1, 0 - bl SetGpuReg - ldr r4, _081344A0 @ =0x00001f1f - movs r0, 0x48 - adds r1, r4, 0 - bl SetGpuReg - movs r0, 0x4A - adds r1, r4, 0 - bl SetGpuReg - movs r1, 0x80 - lsls r1, 8 - movs r0, 0 - bl ClearGpuRegBits - movs r0, 0x1 - bl HideBg - movs r0, 0x1 - movs r1, 0x1 - movs r2, 0x2 - bl SetBgAttribute - movs r0, 0x1E - str r0, [sp] - movs r0, 0x14 - str r0, [sp, 0x4] - movs r0, 0x1 - movs r1, 0 - movs r2, 0 - movs r3, 0 - bl FillBgTilemapBufferRect_Palette0 - movs r0, 0x1 - bl CopyBgTilemapBufferToVram - movs r0, 0x1 - bl ShowBg - adds r0, r5, 0 - bl DestroyTask - add sp, 0x8 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08134498: .4byte gTasks+0x8 -_0813449C: .4byte gSprites -_081344A0: .4byte 0x00001f1f - thumb_func_end sub_81343F4 - - thumb_func_start sub_81344A4 -sub_81344A4: @ 81344A4 - push {r4,lr} - lsls r0, 2 - adds r0, r2 - ldr r4, _081344D8 @ =gUnknown_8463564 - ldr r3, _081344DC @ =gUnknown_8463580 - lsls r1, 2 - adds r2, r1, r3 - ldrb r2, [r2] - lsls r2, 24 - asrs r2, 24 - lsls r2, 2 - adds r2, r4 - ldr r2, [r2] - ldr r2, [r2] - str r2, [r0] - adds r2, r3, 0x1 - adds r2, r1, r2 - ldrb r2, [r2] - strb r2, [r0] - adds r3, 0x2 - adds r1, r3 - ldrb r1, [r1] - strb r1, [r0, 0x1] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_081344D8: .4byte gUnknown_8463564 -_081344DC: .4byte gUnknown_8463580 - thumb_func_end sub_81344A4 - - thumb_func_start sub_81344E0 -sub_81344E0: @ 81344E0 - lsls r0, 24 - lsrs r0, 24 - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - ldr r0, _081344F4 @ =gTasks+0x8 - adds r1, r0 - ldrb r0, [r1] - bx lr - .align 2, 0 -_081344F4: .4byte gTasks+0x8 - thumb_func_end sub_81344E0 - - .align 2, 0 @ Don't pad with nop. diff --git a/asm/pokedex_screen.s b/asm/pokedex_screen.s index 1a7cd0a2e..2f0682c94 100644 --- a/asm/pokedex_screen.s +++ b/asm/pokedex_screen.s @@ -7412,7 +7412,7 @@ sub_810603C: @ 810603C movs r2, 0 movs r3, 0 bl FillBgTilemapBufferRect_Palette0 - bl sub_80CC204 + bl GetUnlockedSeviiAreas ldr r1, [r6] adds r1, 0x64 strb r0, [r1] diff --git a/asm/wild_encounter.s b/asm/wild_encounter.s index e9fb8a630..c43ebf0a9 100644 --- a/asm/wild_encounter.s +++ b/asm/wild_encounter.s @@ -298,7 +298,7 @@ _0808290C: sub_8082934: @ 8082934 push {r4-r6,lr} movs r4, 0 - ldr r0, _08082990 @ =gUnknown_83C9CB8 + ldr r0, _08082990 @ =gWildMonHeaders ldrb r1, [r0] adds r5, r0, 0 cmp r1, 0xFF @@ -343,7 +343,7 @@ _08082980: adds r0, r4, 0 b _080829B6 .align 2, 0 -_08082990: .4byte gUnknown_83C9CB8 +_08082990: .4byte gWildMonHeaders _08082994: .4byte 0x00007a01 _08082998: .4byte gSaveBlock1Ptr _0808299C: .4byte 0x00004024 @@ -799,7 +799,7 @@ _08082CE4: bl sub_8058F1C cmp r0, 0x1 bne _08082D78 - ldr r1, _08082D4C @ =gUnknown_83C9CB8 + ldr r1, _08082D4C @ =gWildMonHeaders lsls r2, r4, 2 adds r0, r2, r4 lsls r0, 2 @@ -822,7 +822,7 @@ _08082D06: bne _08082D1E b _08082E46 _08082D1E: - ldr r1, _08082D4C @ =gUnknown_83C9CB8 + ldr r1, _08082D4C @ =gWildMonHeaders adds r0, r5, r4 lsls r0, 2 adds r1, 0x4 @@ -843,7 +843,7 @@ _08082D3A: .align 2, 0 _08082D44: .4byte gUnknown_20386DC _08082D48: .4byte 0x0000ffff -_08082D4C: .4byte gUnknown_83C9CB8 +_08082D4C: .4byte gWildMonHeaders _08082D50: bl TryStartRoamerEncounter lsls r0, 24 @@ -884,7 +884,7 @@ _08082D78: cmp r0, 0x1 bne _08082E46 _08082DA8: - ldr r1, _08082E18 @ =gUnknown_83C9CB8 + ldr r1, _08082E18 @ =gWildMonHeaders lsls r2, r4, 2 adds r0, r2, r4 lsls r0, 2 @@ -904,7 +904,7 @@ _08082DA8: cmp r0, 0 beq _08082E46 _08082DD2: - ldr r1, _08082E18 @ =gUnknown_83C9CB8 + ldr r1, _08082E18 @ =gWildMonHeaders adds r0, r5, r4 lsls r0, 2 adds r1, 0x8 @@ -936,7 +936,7 @@ _08082DFA: movs r0, 0x1 b _08082E48 .align 2, 0 -_08082E18: .4byte gUnknown_83C9CB8 +_08082E18: .4byte gWildMonHeaders _08082E1C: .4byte gSaveBlock1Ptr _08082E20: .4byte 0x000030d0 _08082E24: @@ -975,7 +975,7 @@ sub_8082E54: @ 8082E54 ldr r0, _08082EA4 @ =0x0000ffff cmp r2, r0 beq _08082EB0 - ldr r1, _08082EA8 @ =gUnknown_83C9CB8 + ldr r1, _08082EA8 @ =gWildMonHeaders lsls r0, r2, 2 adds r0, r2 lsls r0, 2 @@ -1006,7 +1006,7 @@ _08082E9C: b _08082EB6 .align 2, 0 _08082EA4: .4byte 0x0000ffff -_08082EA8: .4byte gUnknown_83C9CB8 +_08082EA8: .4byte gWildMonHeaders _08082EAC: .4byte gSpecialVar_Result _08082EB0: ldr r1, _08082EBC @ =gSpecialVar_Result @@ -1049,7 +1049,7 @@ SweetScentWildEncounter: @ 8082EC0 lsrs r0, 24 cmp r0, 0x1 beq _08082F3C - ldr r1, _08082F18 @ =gUnknown_83C9CB8 + ldr r1, _08082F18 @ =gWildMonHeaders lsls r0, r5, 2 adds r0, r5 lsls r0, 2 @@ -1062,7 +1062,7 @@ SweetScentWildEncounter: @ 8082EC0 b _08082F58 .align 2, 0 _08082F14: .4byte 0x0000ffff -_08082F18: .4byte gUnknown_83C9CB8 +_08082F18: .4byte gWildMonHeaders _08082F1C: mov r0, sp movs r1, 0 @@ -1083,7 +1083,7 @@ _08082F3C: movs r0, 0x1 b _08082F6E _08082F44: - ldr r1, _08082F68 @ =gUnknown_83C9CB8 + ldr r1, _08082F68 @ =gWildMonHeaders lsls r0, r5, 2 adds r0, r5 lsls r0, 2 @@ -1100,7 +1100,7 @@ _08082F58: movs r0, 0x1 b _08082F6E .align 2, 0 -_08082F68: .4byte gUnknown_83C9CB8 +_08082F68: .4byte gWildMonHeaders _08082F6C: movs r0, 0 _08082F6E: @@ -1119,7 +1119,7 @@ sub_8082F78: @ 8082F78 ldr r0, _08082FA0 @ =0x0000ffff cmp r2, r0 beq _08082FA8 - ldr r0, _08082FA4 @ =gUnknown_83C9CB8 + ldr r0, _08082FA4 @ =gWildMonHeaders lsls r1, r2, 2 adds r1, r2 lsls r1, 2 @@ -1132,7 +1132,7 @@ sub_8082F78: @ 8082F78 b _08082FAA .align 2, 0 _08082FA0: .4byte 0x0000ffff -_08082FA4: .4byte gUnknown_83C9CB8 +_08082FA4: .4byte gWildMonHeaders _08082FA8: movs r0, 0 _08082FAA: @@ -1146,7 +1146,7 @@ sub_8082FB0: @ 8082FB0 adds r5, r0, 0 lsls r5, 24 lsrs r5, 24 - ldr r4, _08082FE4 @ =gUnknown_83C9CB8 + ldr r4, _08082FE4 @ =gWildMonHeaders bl sub_8082934 lsls r0, 16 lsrs r0, 16 @@ -1165,7 +1165,7 @@ sub_8082FB0: @ 8082FB0 pop {r0} bx r0 .align 2, 0 -_08082FE4: .4byte gUnknown_83C9CB8 +_08082FE4: .4byte gWildMonHeaders thumb_func_end sub_8082FB0 thumb_func_start GetLocalWildMon @@ -1180,7 +1180,7 @@ GetLocalWildMon: @ 8082FE8 ldr r0, _08083020 @ =0x0000ffff cmp r3, r0 beq _0808301A - ldr r2, _08083024 @ =gUnknown_83C9CB8 + ldr r2, _08083024 @ =gWildMonHeaders lsls r1, r3, 2 adds r1, r3 lsls r1, 2 @@ -1199,7 +1199,7 @@ _0808301A: b _0808306E .align 2, 0 _08083020: .4byte 0x0000ffff -_08083024: .4byte gUnknown_83C9CB8 +_08083024: .4byte gWildMonHeaders _08083028: cmp r4, 0 bne _0808303C @@ -1250,7 +1250,7 @@ GetLocalWaterMon: @ 8083074 ldr r0, _080830A8 @ =0x0000ffff cmp r2, r0 beq _080830B0 - ldr r1, _080830AC @ =gUnknown_83C9CB8 + ldr r1, _080830AC @ =gWildMonHeaders lsls r0, r2, 2 adds r0, r2 lsls r0, 2 @@ -1268,7 +1268,7 @@ GetLocalWaterMon: @ 8083074 b _080830B2 .align 2, 0 _080830A8: .4byte 0x0000ffff -_080830AC: .4byte gUnknown_83C9CB8 +_080830AC: .4byte gWildMonHeaders _080830B0: movs r0, 0 _080830B2: @@ -1513,7 +1513,7 @@ sub_808324C: @ 808324C beq _080832CC cmp r4, 0x1 bne _0808328C - ldr r1, _08083288 @ =gUnknown_83C9CB8 + ldr r1, _08083288 @ =gWildMonHeaders lsls r0, r2, 2 adds r0, r2 lsls r0, 2 @@ -1530,11 +1530,11 @@ sub_808324C: @ 808324C b _080832B8 .align 2, 0 _08083284: .4byte 0x0000ffff -_08083288: .4byte gUnknown_83C9CB8 +_08083288: .4byte gWildMonHeaders _0808328C: cmp r5, 0x2 bne _080832CC - ldr r1, _080832AC @ =gUnknown_83C9CB8 + ldr r1, _080832AC @ =gWildMonHeaders lsls r0, r2, 2 adds r0, r2 lsls r0, 2 @@ -1550,7 +1550,7 @@ _080832A8: movs r0, 0 b _080832CE .align 2, 0 -_080832AC: .4byte gUnknown_83C9CB8 +_080832AC: .4byte gWildMonHeaders _080832B0: cmp r1, 0x9 bhi _080832B8 diff --git a/asm/wild_pokemon_area.s b/asm/wild_pokemon_area.s deleted file mode 100644 index 71d8ac8dc..000000000 --- a/asm/wild_pokemon_area.s +++ /dev/null @@ -1,380 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_813C9DC -sub_813C9DC: @ 813C9DC - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x24 - str r1, [sp, 0x10] - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0xC] - bl sub_813CB34 - cmp r0, 0 - blt _0813CA02 - ldr r0, [sp, 0xC] - ldr r1, [sp, 0x10] - bl sub_813CB5C - b _0813CB1A -_0813CA02: - bl sub_80CC204 - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x14] - movs r0, 0 - str r0, [sp, 0x18] - ldr r0, _0813CA74 @ =0x00004024 - bl VarGet - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0x1C] - cmp r0, 0x8 - ble _0813CA24 - movs r1, 0 - str r1, [sp, 0x1C] -_0813CA24: - movs r6, 0 - mov r8, r6 - ldr r1, _0813CA78 @ =gUnknown_83C9CB8 - ldrb r0, [r1] - cmp r0, 0xFF - beq _0813CB18 -_0813CA30: - lsls r0, r6, 2 - adds r0, r6 - lsls r0, 2 - adds r4, r0, r1 - adds r0, r4, 0 - bl sub_813CC44 - lsls r0, 16 - lsrs r5, r0, 16 - cmp r5, 0xB7 - bne _0813CA5A - ldr r2, [sp, 0x18] - adds r2, 0x1 - str r2, [sp, 0x18] - adds r0, r2, 0 - subs r0, 0x1 - adds r1, r6, 0x1 - str r1, [sp, 0x20] - ldr r2, [sp, 0x1C] - cmp r2, r0 - bne _0813CB06 -_0813CA5A: - adds r0, r4, 0 - ldr r1, [sp, 0xC] - bl sub_813CBD0 - adds r6, 0x1 - str r6, [sp, 0x20] - cmp r0, 0 - beq _0813CB06 - movs r0, 0 - str r0, [sp, 0x8] - lsls r7, r5, 16 - add r6, sp, 0x8 - b _0813CA94 - .align 2, 0 -_0813CA74: .4byte 0x00004024 -_0813CA78: .4byte gUnknown_83C9CB8 -_0813CA7C: - add r0, sp, 0x4 - ldrh r0, [r0] - cmp r0, 0 - beq _0813CA94 - mov r0, r8 - movs r1, 0x1 - add r8, r1 - add r1, sp, 0x4 - ldrh r1, [r1] - ldr r2, [sp, 0x10] - bl sub_81344A4 -_0813CA94: - lsrs r0, r7, 16 - add r2, sp, 0x4 - str r2, [sp] - ldr r1, _0813CAC8 @ =gUnknown_8464148 - movs r2, 0x37 - adds r3, r6, 0 - bl sub_813CC58 - cmp r0, 0 - bne _0813CA7C - movs r2, 0 - add r5, sp, 0x4 - ldr r0, _0813CACC @ =gUnknown_84642BC - mov r10, r0 -_0813CAB0: - ldr r0, [sp, 0x14] - asrs r0, r2 - movs r1, 0x1 - ands r0, r1 - adds r1, r2, 0x1 - mov r9, r1 - cmp r0, 0 - beq _0813CB00 - movs r0, 0 - str r0, [sp, 0x8] - lsls r4, r2, 3 - b _0813CAE4 - .align 2, 0 -_0813CAC8: .4byte gUnknown_8464148 -_0813CACC: .4byte gUnknown_84642BC -_0813CAD0: - ldrh r0, [r5] - cmp r0, 0 - beq _0813CAE4 - mov r0, r8 - movs r2, 0x1 - add r8, r2 - ldrh r1, [r5] - ldr r2, [sp, 0x10] - bl sub_81344A4 -_0813CAE4: - mov r1, r10 - adds r0, r4, r1 - ldr r1, [r0] - ldr r2, _0813CB2C @ =gUnknown_84642C0 - adds r0, r4, r2 - ldr r2, [r0] - add r0, sp, 0x4 - str r0, [sp] - lsrs r0, r7, 16 - adds r3, r6, 0 - bl sub_813CC58 - cmp r0, 0 - bne _0813CAD0 -_0813CB00: - mov r2, r9 - cmp r2, 0x6 - bls _0813CAB0 -_0813CB06: - ldr r6, [sp, 0x20] - ldr r1, _0813CB30 @ =gUnknown_83C9CB8 - lsls r0, r6, 2 - adds r0, r6 - lsls r0, 2 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0xFF - bne _0813CA30 -_0813CB18: - mov r0, r8 -_0813CB1A: - 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 -_0813CB2C: .4byte gUnknown_84642C0 -_0813CB30: .4byte gUnknown_83C9CB8 - thumb_func_end sub_813C9DC - - thumb_func_start sub_813CB34 -sub_813CB34: @ 813CB34 - push {lr} - lsls r0, 16 - lsrs r3, r0, 16 - movs r1, 0 - ldr r2, _0813CB48 @ =gUnknown_84642F4 -_0813CB3E: - ldrh r0, [r2] - cmp r0, r3 - bne _0813CB4C - adds r0, r1, 0 - b _0813CB58 - .align 2, 0 -_0813CB48: .4byte gUnknown_84642F4 -_0813CB4C: - adds r2, 0x4 - adds r1, 0x1 - cmp r1, 0x2 - bls _0813CB3E - movs r0, 0x1 - negs r0, r0 -_0813CB58: - pop {r1} - bx r1 - thumb_func_end sub_813CB34 - - thumb_func_start sub_813CB5C -sub_813CB5C: @ 813CB5C - push {r4,r5,lr} - sub sp, 0xC - adds r5, r1, 0 - lsls r0, 16 - lsrs r0, 16 - bl sub_813CB34 - adds r4, r0, 0 - cmp r4, 0 - blt _0813CBC4 - ldr r0, _0813CBBC @ =gUnknown_84642F4 - lsls r4, 2 - adds r4, r0 - bl ScrSpecial_GetStarter - ldrh r1, [r4, 0x2] - lsls r0, 16 - lsrs r0, 16 - cmp r1, r0 - bne _0813CBC4 - bl GetRoamerLocationMapSectionId - lsls r0, 16 - lsrs r0, 16 - movs r1, 0 - str r1, [sp, 0x8] - ldr r1, _0813CBC0 @ =gUnknown_8464148 - add r3, sp, 0x8 - add r2, sp, 0x4 - str r2, [sp] - movs r2, 0x37 - bl sub_813CC58 - cmp r0, 0 - beq _0813CBC4 - add r0, sp, 0x4 - ldrh r0, [r0] - cmp r0, 0 - beq _0813CBC4 - add r0, sp, 0x4 - ldrh r1, [r0] - movs r0, 0 - adds r2, r5, 0 - bl sub_81344A4 - movs r0, 0x1 - b _0813CBC6 - .align 2, 0 -_0813CBBC: .4byte gUnknown_84642F4 -_0813CBC0: .4byte gUnknown_8464148 -_0813CBC4: - movs r0, 0 -_0813CBC6: - add sp, 0xC - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_813CB5C - - thumb_func_start sub_813CBD0 -sub_813CBD0: @ 813CBD0 - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - ldr r0, [r4, 0x4] - movs r2, 0xC - bl sub_813CC18 - cmp r0, 0 - bne _0813CC10 - ldr r0, [r4, 0x8] - adds r1, r5, 0 - movs r2, 0x5 - bl sub_813CC18 - cmp r0, 0 - bne _0813CC10 - ldr r0, [r4, 0x10] - adds r1, r5, 0 - movs r2, 0xC - bl sub_813CC18 - cmp r0, 0 - bne _0813CC10 - ldr r0, [r4, 0xC] - adds r1, r5, 0 - movs r2, 0x5 - bl sub_813CC18 - cmp r0, 0 - bne _0813CC10 - movs r0, 0 - b _0813CC12 -_0813CC10: - movs r0, 0x1 -_0813CC12: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_813CBD0 - - thumb_func_start sub_813CC18 -sub_813CC18: @ 813CC18 - push {r4,lr} - adds r4, r1, 0 - cmp r0, 0 - beq _0813CC3A - movs r1, 0 - cmp r1, r2 - bge _0813CC3A - ldr r3, [r0, 0x4] -_0813CC28: - ldrh r0, [r3, 0x2] - cmp r0, r4 - bne _0813CC32 - movs r0, 0x1 - b _0813CC3C -_0813CC32: - adds r3, 0x4 - adds r1, 0x1 - cmp r1, r2 - blt _0813CC28 -_0813CC3A: - movs r0, 0 -_0813CC3C: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_813CC18 - - thumb_func_start sub_813CC44 -sub_813CC44: @ 813CC44 - push {lr} - ldrb r2, [r0] - ldrb r1, [r0, 0x1] - adds r0, r2, 0 - bl get_mapheader_by_bank_and_number - ldrb r0, [r0, 0x14] - pop {r1} - bx r1 - thumb_func_end sub_813CC44 - - thumb_func_start sub_813CC58 -sub_813CC58: @ 813CC58 - push {r4-r6,lr} - adds r4, r2, 0 - ldr r6, [sp, 0x10] - lsls r0, 16 - lsrs r5, r0, 16 - ldr r2, [r3] - cmp r2, r4 - bge _0813CC86 - lsls r0, r2, 2 - adds r1, r0, r1 -_0813CC6C: - ldrh r0, [r1] - cmp r0, r5 - bne _0813CC7E - ldrh r0, [r1, 0x2] - strh r0, [r6] - adds r0, r2, 0x1 - str r0, [r3] - movs r0, 0x1 - b _0813CC88 -_0813CC7E: - adds r1, 0x4 - adds r2, 0x1 - cmp r2, r4 - blt _0813CC6C -_0813CC86: - movs r0, 0 -_0813CC88: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_813CC58 - - .align 2, 0 @ Don't pad with nop. diff --git a/data/data_835B488.s b/data/data_835B488.s index c106c46c4..742224d2b 100644 --- a/data/data_835B488.s +++ b/data/data_835B488.s @@ -55,7 +55,7 @@ gUnknown_83C7294:: @ 83C7294 gUnknown_83C7388:: @ 83C7388 .incbin "baserom.gba", 0x3C7388, 0x2930 -gUnknown_83C9CB8:: @ 83C9CB8 +gWildMonHeaders:: @ 83C9CB8 .incbin "baserom.gba", 0x3C9CB8, 0xA64 gUnknown_83CA71C:: @ 83CA71C diff --git a/data/map_event_scripts.inc b/data/map_event_scripts.inc index 233b73349..c333c6336 100644 --- a/data/map_event_scripts.inc +++ b/data/map_event_scripts.inc @@ -1485,7 +1485,7 @@ gUnknown_81A6481:: @ 81A6481 setflag FLAG_0x09F setflag FLAG_0x0A0 setflag FLAG_0x0AE - setvar VAR_MIRAGE_RND_L, 500 + setvar VAR_0x4025, 500 end EventScript_1A651A:: @ 81A651A diff --git a/data/maps/PalletTown_GarysHouse/scripts.inc b/data/maps/PalletTown_GarysHouse/scripts.inc index dd3f05aa9..9f304b583 100644 --- a/data/maps/PalletTown_GarysHouse/scripts.inc +++ b/data/maps/PalletTown_GarysHouse/scripts.inc @@ -51,7 +51,7 @@ EventScript_168DB9:: @ 8168DB9 compare_var_to_value VAR_RESULT, 2 goto_if_eq EventScript_1A7AE0 special sub_8112364 - compare_var_to_value VAR_MIRAGE_RND_L, 500 + compare_var_to_value VAR_0x4025, 500 goto_if 0, EventScript_168E46 msgbox gUnknown_818D7D3, MSGBOX_YESNO compare_var_to_value VAR_RESULT, 0 diff --git a/data/pokedex_area_markers.s b/data/pokedex_area_markers.s deleted file mode 100644 index bf63a3210..000000000 --- a/data/pokedex_area_markers.s +++ /dev/null @@ -1,14 +0,0 @@ - .section .rodata - .align 2 - -gUnknown_846341C:: @ 846341C - .incbin "baserom.gba", 0x46341C, 0x20 - -gUnknown_846343C:: @ 846343C - .incbin "baserom.gba", 0x46343C, 0x128 - -gUnknown_8463564:: @ 8463564 - .incbin "baserom.gba", 0x463564, 0x1C - -gUnknown_8463580:: @ 8463580 - .incbin "baserom.gba", 0x463580, 0x140 diff --git a/data/pokedex_area_markers/marker.png b/data/pokedex_area_markers/marker.png Binary files differnew file mode 100644 index 000000000..d332c9f46 --- /dev/null +++ b/data/pokedex_area_markers/marker.png diff --git a/data/wild_pokemon_area.s b/data/wild_pokemon_area.s deleted file mode 100644 index 26913b7c6..000000000 --- a/data/wild_pokemon_area.s +++ /dev/null @@ -1,14 +0,0 @@ - .section .rodata - .align 2 - -gUnknown_8464148:: @ 8464148 - .incbin "baserom.gba", 0x464148, 0x174 - -gUnknown_84642BC:: @ 84642BC - .incbin "baserom.gba", 0x4642BC, 0x4 - -gUnknown_84642C0:: @ 84642C0 - .incbin "baserom.gba", 0x4642C0, 0x34 - -gUnknown_84642F4:: @ 84642F4 - .incbin "baserom.gba", 0x4642F4, 0xC diff --git a/include/constants/vars.h b/include/constants/vars.h index 989b27387..a354320c2 100644 --- a/include/constants/vars.h +++ b/include/constants/vars.h @@ -39,8 +39,8 @@ #define VAR_0x4021 0x4021 #define VAR_ICE_STEP_COUNT 0x4022 #define VAR_0x4023 0x4023 -#define VAR_MIRAGE_RND_H 0x4024 -#define VAR_MIRAGE_RND_L 0x4025 +#define VAR_0x4024 0x4024 +#define VAR_0x4025 0x4025 #define VAR_SECRET_BASE_MAP 0x4026 #define VAR_0x4027 0x4027 #define VAR_0x4028 0x4028 diff --git a/include/field_specials.h b/include/field_specials.h index b48dd34a5..2abe168e0 100644 --- a/include/field_specials.h +++ b/include/field_specials.h @@ -23,5 +23,6 @@ void set_unknown_box_id(u8); u16 get_unknown_box_id(void); bool8 sub_80CC7B4(void); u16 GetHiddenItemAttr(struct HiddenItemStruct hiddenItem, u8 attr); +u8 GetUnlockedSeviiAreas(void); #endif // GUARD_FIELD_SPECIALS_H diff --git a/include/gba/types.h b/include/gba/types.h index 9f2594703..7163f925f 100644 --- a/include/gba/types.h +++ b/include/gba/types.h @@ -68,6 +68,10 @@ struct OamData /*0x06*/ u16 affineParam; }; +#define ST_OAM_HFLIP 0x08 +#define ST_OAM_VFLIP 0x10 +#define ST_OAM_MNUM_FLIP_MASK 0x18 + #define ST_OAM_OBJ_NORMAL 0 #define ST_OAM_OBJ_BLEND 1 #define ST_OAM_OBJ_WINDOW 2 diff --git a/include/pokedex_area_markers.h b/include/pokedex_area_markers.h new file mode 100644 index 000000000..da73fd529 --- /dev/null +++ b/include/pokedex_area_markers.h @@ -0,0 +1,16 @@ +#ifndef GUARD_POKEDEX_AREA_MARKERS_H +#define GUARD_POKEDEX_AREA_MARKERS_H + +struct PAM_TaskData +{ + struct SubspriteTable subsprites; + void * buffer; + u8 unk_0C; + u8 spr_id; + u16 tilesTag; + u16 unk_10; +}; + +void SetAreaSubsprite(s32 i, s32 whichArea, struct Subsprite * subsprites); + +#endif //GUARD_POKEDEX_AREA_MARKERS_H diff --git a/include/roamer.h b/include/roamer.h index 5ec0a17fc..1d23ff605 100644 --- a/include/roamer.h +++ b/include/roamer.h @@ -15,5 +15,6 @@ u8 TryStartRoamerEncounter(void); void UpdateRoamerHPStatus(struct Pokemon *mon); void SetRoamerInactive(void); void GetRoamerLocation(u8 *mapGroup, u8 *mapNum); +u16 GetRoamerLocationMapSectionId(void); #endif // GUARD_ROAMER_H diff --git a/include/wild_pokemon_area.h b/include/wild_pokemon_area.h new file mode 100644 index 000000000..354683408 --- /dev/null +++ b/include/wild_pokemon_area.h @@ -0,0 +1,6 @@ +#ifndef GUARD_WILD_POKEMON_AREA_H +#define GUARD_WILD_POKEMON_AREA_H + +s32 BuildPokedexAreaSubspriteBuffer(u16 species, struct Subsprite * subsprites); + +#endif //GUARD_WILD_POKEMON_AREA_H diff --git a/ld_script.txt b/ld_script.txt index 03c79232b..49531d76a 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -246,10 +246,10 @@ SECTIONS { src/oak_speech.o(.text); src/tm_case.o(.text); src/menu_indicators.o(.text); - asm/pokedex_area_markers.o(.text); + src/pokedex_area_markers.o(.text); asm/pokemon_summary_screen.o(.text); src/help_system.o(.text); - asm/wild_pokemon_area.o(.text); + src/wild_pokemon_area.o(.text); src/dynamic_placeholder_text_util.o(.text); src/berry_pouch.o(.text); src/itemfinder.o(.text); @@ -461,10 +461,10 @@ SECTIONS { src/oak_speech.o(.rodata); src/tm_case.o(.rodata); src/menu_indicators.o(.rodata); - data/pokedex_area_markers.o(.rodata); + src/pokedex_area_markers.o(.rodata); data/pokemon_summary_screen.o(.rodata); src/help_system.o(.rodata); - data/wild_pokemon_area.o(.rodata); + src/wild_pokemon_area.o(.rodata); src/dynamic_placeholder_text_util.o(.rodata); src/berry_pouch.o(.rodata); src/itemfinder.o(.rodata); diff --git a/src/pokedex_area_markers.c b/src/pokedex_area_markers.c new file mode 100644 index 000000000..d3c36a83e --- /dev/null +++ b/src/pokedex_area_markers.c @@ -0,0 +1,238 @@ +#include "global.h" +#include "malloc.h" +#include "bg.h" +#include "decompress.h" +#include "gpu_regs.h" +#include "palette.h" +#include "task.h" +#include "wild_pokemon_area.h" +#include "pokedex_area_markers.h" + +static const u16 sMarkerPal[] = INCBIN_U16("data/pokedex_area_markers/marker.gbapal"); +static const u32 sMarkerTiles[] = INCBIN_U32("data/pokedex_area_markers/marker.4bpp.lz"); + +static const struct Subsprite sSubsprite0 = { + .size = ST_OAM_SIZE_0, + .shape = ST_OAM_SQUARE, + .priority = 1, + .tileOffset = 0 +}; + +static const struct Subsprite sSubsprite1 = { + .size = ST_OAM_SIZE_0, + .shape = ST_OAM_H_RECTANGLE, + .priority = 1, + .tileOffset = 1 +}; + +static const struct Subsprite sSubsprite2 = { + .size = ST_OAM_SIZE_0, + .shape = ST_OAM_V_RECTANGLE, + .priority = 1, + .tileOffset = 3 +}; + +static const struct Subsprite sSubsprite3 = { + .size = ST_OAM_SIZE_2, + .shape = ST_OAM_H_RECTANGLE, + .priority = 1, + .tileOffset = 5 +}; + +static const struct Subsprite sSubsprite4 = { + .size = ST_OAM_SIZE_2, + .shape = ST_OAM_V_RECTANGLE, + .priority = 1, + .tileOffset = 13 +}; + +static const struct Subsprite sSubsprite5 = { + .size = ST_OAM_SIZE_2, + .shape = ST_OAM_H_RECTANGLE, + .priority = 1, + .tileOffset = 21 +}; + +static const struct Subsprite sSubsprite6 = { + .size = ST_OAM_SIZE_2, + .shape = ST_OAM_V_RECTANGLE, + .priority = 1, + .tileOffset = 29 +}; + + +static const struct Subsprite *const sSubsprites[] = { + &sSubsprite0, + &sSubsprite1, + &sSubsprite2, + &sSubsprite3, + &sSubsprite4, + &sSubsprite5, + &sSubsprite6 +}; + +static const s8 sSubspriteLookupTable[][4] = { + { 0, 0x00, 0x00 }, + { 0, 0x36, 0x2c }, + { 0, 0x36, 0x1c }, + { 0, 0x36, 0x0c }, + { 0, 0x5c, 0x0c }, + { 0, 0x6e, 0x18 }, + { 0, 0x5c, 0x24 }, + { 0, 0x4c, 0x18 }, + { 0, 0x4e, 0x34 }, + { 0, 0x36, 0x3e }, + { 0, 0x2a, 0x02 }, + { 0, 0x5c, 0x18 }, + { 2, 0x36, 0x20 }, + { 2, 0x36, 0x10 }, + { 1, 0x3d, 0x0c }, + { 1, 0x4d, 0x0c }, + { 0, 0x5c, 0x12 }, + { 0, 0x5c, 0x1e }, + { 0, 0x54, 0x18 }, + { 1, 0x62, 0x18 }, + { 1, 0x62, 0x0c }, + { 2, 0x6e, 0x0c }, + { 1, 0x62, 0x24 }, + { 4, 0x6a, 0x19 }, + { 1, 0x64, 0x2e }, + { 2, 0x5e, 0x2d }, + { 1, 0x55, 0x34 }, + { 0, 0x44, 0x18 }, + { 4, 0x3e, 0x1a }, + { 1, 0x40, 0x34 }, + { 0, 0x4e, 0x3c }, + { 3, 0x37, 0x3a }, + { 2, 0x36, 0x32 }, + { 1, 0x28, 0x1c }, + { 4, 0x26, 0x04 }, + { 0, 0x5c, 0x04 }, + { 3, 0x5a, 0xfe }, + { 0, 0x33, 0x14 }, + { 1, 0x3d, 0x12 }, + { 0, 0x48, 0x08 }, + { 0, 0x57, 0x08 }, + { 0, 0x70, 0x0e }, + { 0, 0x71, 0x14 }, + { 0, 0x71, 0x19 }, + { 1, 0x4e, 0x2c }, + { 0, 0x41, 0x3c }, + { 0, 0x34, 0x3e }, + { 0, 0x2d, 0x07 }, + { 0, 0x0a, 0x0a }, + { 0, 0x0c, 0x23 }, + { 0, 0x0e, 0x34 }, + { 0, 0x0c, 0x54 }, + { 0, 0x2d, 0x51 }, + { 0, 0x4c, 0x54 }, + { 0, 0x68, 0x52 }, + { 2, 0x0e, 0x02 }, + { 0, 0x0a, 0x0f }, + { 0, 0x0c, 0x1d }, + { 1, 0x02, 0x34 }, + { 1, 0x0c, 0x38 }, + { 1, 0x2c, 0x4a }, + { 1, 0x24, 0x4e }, + { 2, 0x30, 0x50 }, + { 2, 0x34, 0x56 }, + { 0, 0x48, 0x4a }, + { 1, 0x48, 0x4e }, + { 2, 0x51, 0x50 }, + { 0, 0x4c, 0x5c }, + { 0, 0x68, 0x4b }, + { 0, 0x68, 0x56 }, + { 2, 0x6c, 0x53 }, + { 3, 0x60, 0x5a }, + { 0, 0x0e, 0x01 }, + { 0, 0x05, 0x34 }, + { 0, 0x0d, 0x50 }, + { 0, 0x36, 0x4a }, + { 0, 0x45, 0x49 }, + { 0, 0x4c, 0x4d }, + { 0, 0x49, 0x5f }, + { 3, 0x60, 0x5a } +}; + +static void Task_ShowAreaMarkers(u8 taskId) +{ + struct PAM_TaskData * data = (void *)gTasks[taskId].data; + gSprites[data->spr_id].invisible = FALSE; +} + +u8 sub_8134230(u16 species, u16 tilesTag, u8 palIdx, u8 y) +{ + struct SpriteTemplate spriteTemplate; + struct CompressedSpriteSheet spriteSheet; + u8 taskId; + struct PAM_TaskData * data; + struct Subsprite * subsprites; + + spriteSheet.data = sMarkerTiles; + spriteSheet.size = 0x4A0; + spriteSheet.tag = tilesTag; + LoadCompressedSpriteSheet(&spriteSheet); + LoadPalette(sMarkerPal, 0x100 + 16 * palIdx, 0x20); + taskId = CreateTask(Task_ShowAreaMarkers, 0); + data = (void *)gTasks[taskId].data; + data->unk_0C = 0; + data->tilesTag = tilesTag; + data->unk_10 = 0xFFFF; + subsprites = Alloc(120 * sizeof(struct Subsprite)); + data->buffer = subsprites; + data->subsprites.subsprites = subsprites; + data->subsprites.subspriteCount = BuildPokedexAreaSubspriteBuffer(species, subsprites); + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_BD); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 8)); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_WININ, 0x1F1F); + SetGpuReg(REG_OFFSET_WINOUT, 0x2F3D); + spriteTemplate = gDummySpriteTemplate; + spriteTemplate.tileTag = tilesTag; + data->spr_id = CreateSprite(&spriteTemplate, 104, y + 32, 0); + SetSubspriteTables(&gSprites[data->spr_id], &data->subsprites); + gSprites[data->spr_id].oam.objMode = ST_OAM_OBJ_WINDOW; + gSprites[data->spr_id].oam.paletteNum = palIdx; + gSprites[data->spr_id].subspriteTableNum = 0; + gSprites[data->spr_id].invisible = TRUE; + HideBg(1); + SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); + FillBgTilemapBufferRect_Palette0(1, 0x00F, 0, 0, 30, 20); + CopyBgTilemapBufferToVram(1); + ShowBg(1); + return taskId; +} + +void sub_81343F4(u8 taskId) +{ + struct PAM_TaskData * data = (void *)gTasks[taskId].data; + FreeSpriteTilesByTag(data->tilesTag); + DestroySprite(&gSprites[data->spr_id]); + Free(data->buffer); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_WININ, 0x1F1F); + SetGpuReg(REG_OFFSET_WINOUT, 0x1F1F); + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON); + HideBg(1); + SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 2); + FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); + CopyBgTilemapBufferToVram(1); + ShowBg(1); + DestroyTask(taskId); +} + +void SetAreaSubsprite(s32 i, s32 whichArea, struct Subsprite * subsprites) +{ + subsprites[i] = *sSubsprites[sSubspriteLookupTable[whichArea][0]]; + subsprites[i].x = sSubspriteLookupTable[whichArea][1]; + subsprites[i].y = sSubspriteLookupTable[whichArea][2]; +} + +u8 sub_81344E0(u8 taskId) +{ + struct PAM_TaskData * data = (void *)gTasks[taskId].data; + return data->subsprites.subspriteCount; +} diff --git a/src/wild_pokemon_area.c b/src/wild_pokemon_area.c new file mode 100644 index 000000000..8654f41f1 --- /dev/null +++ b/src/wild_pokemon_area.c @@ -0,0 +1,308 @@ +#include "global.h" +#include "field_specials.h" +#include "event_data.h" +#include "wild_encounter.h" +#include "roamer.h" +#include "overworld.h" +#include "pokedex_area_markers.h" +#include "constants/vars.h" +#include "constants/region_map.h" +#include "constants/species.h" + +struct SeviiDexArea +{ + const u16 (* lut)[2]; + s32 count; +}; + +struct RoamerPair +{ + u16 roamer; + u16 starter; +}; + +static s32 GetRoamerIndex(u16 species); +static s32 CountRoamerNests(u16 species, struct Subsprite * subsprites); +static bool32 PokemonInAnyEncounterTableInMap(const struct WildPokemonHeader * data, s32 species); +static bool32 PokemonInEncounterTable(const struct WildPokemonInfo * pokemon, s32 species, s32 count); +static u16 GetMapSecIdFromWildMonHeader(const struct WildPokemonHeader * header); +static bool32 TryGetMapSecPokedexAreaEntry(u16 mapSecId, const u16 (*lut)[2], s32 count, s32 * lut_i_p, u16 * table_idx_p); + +static const u16 sDexAreas_Kanto[][2] = { + { MAPSEC_PALLET_TOWN, 1 }, + { MAPSEC_VIRIDIAN_CITY, 2 }, + { MAPSEC_PEWTER_CITY, 3 }, + { MAPSEC_CERULEAN_CITY, 4 }, + { MAPSEC_LAVENDER_TOWN, 5 }, + { MAPSEC_VERMILION_CITY, 6 }, + { MAPSEC_CELADON_CITY, 7 }, + { MAPSEC_FUCHSIA_CITY, 8 }, + { MAPSEC_CINNABAR_ISLAND, 9 }, + { MAPSEC_INDIGO_PLATEAU, 10 }, + { MAPSEC_SAFFRON_CITY, 11 }, + { MAPSEC_ROUTE_4_FLYDUP, 15 }, + { MAPSEC_ROUTE_10_FLYDUP, 21 }, + { MAPSEC_ROUTE_1, 12 }, + { MAPSEC_ROUTE_2, 13 }, + { MAPSEC_ROUTE_3, 14 }, + { MAPSEC_ROUTE_4, 15 }, + { MAPSEC_ROUTE_5, 16 }, + { MAPSEC_ROUTE_6, 17 }, + { MAPSEC_ROUTE_7, 18 }, + { MAPSEC_ROUTE_8, 19 }, + { MAPSEC_ROUTE_9, 20 }, + { MAPSEC_ROUTE_10, 21 }, + { MAPSEC_ROUTE_11, 22 }, + { MAPSEC_ROUTE_12, 23 }, + { MAPSEC_ROUTE_13, 24 }, + { MAPSEC_ROUTE_14, 25 }, + { MAPSEC_ROUTE_15, 26 }, + { MAPSEC_ROUTE_16, 27 }, + { MAPSEC_ROUTE_17, 28 }, + { MAPSEC_ROUTE_18, 29 }, + { MAPSEC_ROUTE_19, 30 }, + { MAPSEC_ROUTE_20, 31 }, + { MAPSEC_ROUTE_21, 32 }, + { MAPSEC_ROUTE_22, 33 }, + { MAPSEC_ROUTE_23, 34 }, + { MAPSEC_ROUTE_24, 35 }, + { MAPSEC_ROUTE_25, 36 }, + { MAPSEC_VIRIDIAN_FOREST, 37 }, + { MAPSEC_MT_MOON, 39 }, + { MAPSEC_S_S_ANNE, 6 }, + { MAPSEC_UNDERGROUND_PATH, 11 }, + { MAPSEC_UNDERGROUND_PATH_2, 11 }, + { MAPSEC_DIGLETTS_CAVE, 38 }, + { MAPSEC_KANTO_VICTORY_ROAD, 47 }, + { MAPSEC_ROCKET_HIDEOUT, 7 }, + { MAPSEC_SILPH_CO, 11 }, + { MAPSEC_POKEMON_MANSION, 46 }, + { MAPSEC_KANTO_SAFARI_ZONE, 44 }, + { MAPSEC_POKEMON_LEAGUE, 47 }, + { MAPSEC_ROCK_TUNNEL, 41 }, + { MAPSEC_SEAFOAM_ISLANDS, 45 }, + { MAPSEC_POKEMON_TOWER, 43 }, + { MAPSEC_CERULEAN_CAVE, 40 }, + { MAPSEC_POWER_PLANT, 42 } +}; + +static const u16 sDexAreas_Sevii1[][2] = { + { MAPSEC_KINDLE_ROAD, 55 }, + { MAPSEC_TREASURE_BEACH, 56 }, + { MAPSEC_ONE_ISLAND, 48 }, + { MAPSEC_MT_EMBER, 72 } +}; + +static const u16 sDexAreas_Sevii2[][2] = { + { MAPSEC_CAPE_BRINK, 57 }, + { MAPSEC_TWO_ISLAND, 49 } +}; + +static const u16 sDexAreas_Sevii3[][2] = { + { MAPSEC_BOND_BRIDGE, 58 }, + { MAPSEC_THREE_ISLE_PORT, 59 }, + { MAPSEC_THREE_ISLAND, 50 }, + { MAPSEC_BERRY_FOREST, 73 }, + { MAPSEC_THREE_ISLE_PATH, 59 } +}; + +static const u16 sDexAreas_Sevii4[][2] = { + { MAPSEC_FOUR_ISLAND, 51 }, + { MAPSEC_ICEFALL_CAVE, 74 } +}; + +static const u16 sDexAreas_Sevii5[][2] = { + { MAPSEC_RESORT_GORGEOUS, 60 }, + { MAPSEC_WATER_LABYRINTH, 61 }, + { MAPSEC_FIVE_ISLE_MEADOW, 62 }, + { MAPSEC_MEMORIAL_PILLAR, 63 }, + { MAPSEC_FIVE_ISLAND, 52 }, + { MAPSEC_ROCKET_WAREHOUSE, 62 }, + { MAPSEC_LOST_CAVE, 75 } +}; + +static const u16 sDexAreas_Sevii6[][2] = { + { MAPSEC_OUTCAST_ISLAND, 64 }, + { MAPSEC_GREEN_PATH, 65 }, + { MAPSEC_WATER_PATH, 66 }, + { MAPSEC_RUIN_VALLEY, 67 }, + { MAPSEC_DOTTED_HOLE, 78 }, + { MAPSEC_PATTERN_BUSH, 77 }, + { MAPSEC_ALTERING_CAVE, 76 } +}; + +static const u16 sDexAreas_Sevii7[][2] = { + { MAPSEC_TRAINER_TOWER, 68 }, + { MAPSEC_CANYON_ENTRANCE, 69 }, + { MAPSEC_SEVAULT_CANYON, 70 }, + { MAPSEC_TANOBY_RUINS, 71 }, + { MAPSEC_MONEAN_CHAMBER, 79 }, + { MAPSEC_LIPTOO_CHAMBER, 79 }, + { MAPSEC_WEEPTH_CHAMBER, 79 }, + { MAPSEC_DILFORD_CHAMBER, 79 }, + { MAPSEC_SCUFIB_CHAMBER, 79 }, + { MAPSEC_RIXY_CHAMBER, 79 }, + { MAPSEC_VIAPOIS_CHAMBER, 79 } +}; + +static const struct SeviiDexArea sSeviiDexAreas[] = { + { sDexAreas_Sevii1, 4 }, + { sDexAreas_Sevii2, 2 }, + { sDexAreas_Sevii3, 5 }, + { sDexAreas_Sevii4, 2 }, + { sDexAreas_Sevii5, 7 }, + { sDexAreas_Sevii6, 7 }, + { sDexAreas_Sevii7, 11 } +}; + +static const struct RoamerPair sRoamerPairs[] = { + { SPECIES_ENTEI, SPECIES_BULBASAUR }, + { SPECIES_SUICUNE, SPECIES_CHARMANDER }, + { SPECIES_RAIKOU, SPECIES_SQUIRTLE } +}; + +s32 BuildPokedexAreaSubspriteBuffer(u16 species, struct Subsprite * subsprites) +{ + s32 areaCount; + s32 j; + s32 mapSecId; + u16 dexAreaSubspriteIdx; + s32 dexAreaEntryLUTidx; + s32 seviiAreas; + s32 alteringCaveCount; + s32 alteringCaveNum; + s32 i; + + if (GetRoamerIndex(species) >= SPECIES_NONE) + { + return CountRoamerNests(species, subsprites); + } + + seviiAreas = GetUnlockedSeviiAreas(); + alteringCaveCount = 0; + alteringCaveNum = VarGet(VAR_0x4024); + if (alteringCaveNum > 8) + alteringCaveNum = 0; + for (i = 0, areaCount = 0; gWildMonHeaders[i].mapGroup != 0xFF; i++) + { + mapSecId = GetMapSecIdFromWildMonHeader(&gWildMonHeaders[i]); + if (mapSecId == MAPSEC_ALTERING_CAVE) + { + alteringCaveCount++; + if (alteringCaveNum != alteringCaveCount - 1) + continue; + } + if (PokemonInAnyEncounterTableInMap(&gWildMonHeaders[i], species)) + { + dexAreaEntryLUTidx = 0; + while (TryGetMapSecPokedexAreaEntry(mapSecId, sDexAreas_Kanto, 55, &dexAreaEntryLUTidx, &dexAreaSubspriteIdx)) + { + if (dexAreaSubspriteIdx != 0) + { + SetAreaSubsprite(areaCount++, dexAreaSubspriteIdx, subsprites); + } + } + for (j = 0; j < NELEMS(sSeviiDexAreas); j++) + { + if ((seviiAreas >> j) & 1) + { + dexAreaEntryLUTidx = 0; + while (TryGetMapSecPokedexAreaEntry(mapSecId, sSeviiDexAreas[j].lut, sSeviiDexAreas[j].count, &dexAreaEntryLUTidx, &dexAreaSubspriteIdx)) + { + if (dexAreaSubspriteIdx != 0) + { + SetAreaSubsprite(areaCount++, dexAreaSubspriteIdx, subsprites); + } + } + } + } + } + } + + return areaCount; +} + +static s32 GetRoamerIndex(u16 species) +{ + s32 i; + for (i = 0; i < 3u; i++) + { + if (sRoamerPairs[i].roamer == species) + return i; + } + + return -1; +} + +static s32 CountRoamerNests(u16 species, struct Subsprite * subsprites) +{ + u16 roamerLocation; + s32 roamerIdx; + u16 dexAreaSubspriteIdx; + s32 dexAreaEntryLUTidx; + + roamerIdx = GetRoamerIndex(species); + if (roamerIdx < 0) + return 0; + if (sRoamerPairs[roamerIdx].starter != ScrSpecial_GetStarter()) + return 0; + roamerLocation = GetRoamerLocationMapSectionId(); + dexAreaEntryLUTidx = 0; + if (TryGetMapSecPokedexAreaEntry(roamerLocation, sDexAreas_Kanto, 55, &dexAreaEntryLUTidx, &dexAreaSubspriteIdx)) + { + if (dexAreaSubspriteIdx != 0) + { + SetAreaSubsprite(0, dexAreaSubspriteIdx, subsprites); + return 1; + } + } + return 0; +} + +static bool32 PokemonInAnyEncounterTableInMap(const struct WildPokemonHeader * data, s32 species) +{ + if (PokemonInEncounterTable(data->landMonsInfo, species, 12)) + return TRUE; + if (PokemonInEncounterTable(data->waterMonsInfo, species, 5)) + return TRUE; + if (PokemonInEncounterTable(data->fishingMonsInfo, species, 12)) + return TRUE; + if (PokemonInEncounterTable(data->rockSmashMonsInfo, species, 5)) + return TRUE; + + return FALSE; +} + +static bool32 PokemonInEncounterTable(const struct WildPokemonInfo * info, s32 species, s32 count) +{ + s32 i; + if (info != NULL) + { + for (i = 0; i < count; i++) + { + if (info->wildPokemon[i].species == species) + return TRUE; + } + } + return FALSE; +} + +static u16 GetMapSecIdFromWildMonHeader(const struct WildPokemonHeader * header) +{ + return get_mapheader_by_bank_and_number(header->mapGroup, header->mapNum)->regionMapSectionId; +} + +static bool32 TryGetMapSecPokedexAreaEntry(u16 mapSecId, const u16 (*lut)[2], s32 count, s32 * lut_i_p, u16 * table_idx_p) +{ + s32 i; + for (i = *lut_i_p; i < count; i++) + { + if (lut[i][0] == mapSecId) + { + *table_idx_p = lut[i][1]; + *lut_i_p = i + 1; + return TRUE; + } + } + return FALSE; +} |