diff options
-rw-r--r-- | asm/pokedex_area_screen.s | 183 | ||||
-rw-r--r-- | src/pokedex_area_screen.c | 72 |
2 files changed, 67 insertions, 188 deletions
diff --git a/asm/pokedex_area_screen.s b/asm/pokedex_area_screen.s index 2868cabac..f6b6f4e7e 100644 --- a/asm/pokedex_area_screen.s +++ b/asm/pokedex_area_screen.s @@ -5,189 +5,6 @@ .text - thumb_func_start SetSpecialMapHasMon -SetSpecialMapHasMon: @ 8110AE4 - push {r4-r6,lr} - lsls r0, 16 - lsrs r2, r0, 16 - lsls r1, 16 - lsrs r1, 16 - ldr r0, _08110B9C @ =gSharedMem - movs r3, 0x89 - lsls r3, 1 - adds r0, r3 - ldrh r0, [r0] - cmp r0, 0x1F - bhi _08110B96 - adds r0, r2, 0 - bl Overworld_GetMapHeaderByGroupAndId - adds r6, r0, 0 - ldrb r0, [r6, 0x14] - cmp r0, 0x57 - bhi _08110B96 - movs r4, 0 - ldr r1, _08110BA0 @ =gUnknown_083F857A - ldrh r0, [r1] - cmp r0, 0x58 - beq _08110B42 - adds r5, r1, 0 -_08110B16: - lsls r2, r4, 2 - adds r1, r2, r5 - ldrb r0, [r6, 0x14] - ldrh r1, [r1] - cmp r0, r1 - bne _08110B32 - adds r0, r5, 0x2 - adds r0, r2, r0 - ldrh r0, [r0] - bl FlagGet - lsls r0, 24 - cmp r0, 0 - beq _08110B96 -_08110B32: - adds r0, r4, 0x1 - lsls r0, 16 - lsrs r4, r0, 16 - lsls r0, r4, 2 - adds r0, r5 - ldrh r0, [r0] - cmp r0, 0x58 - bne _08110B16 -_08110B42: - movs r4, 0 - ldr r0, _08110B9C @ =gSharedMem - movs r1, 0x89 - lsls r1, 1 - adds r2, r0, r1 - ldrh r3, [r2] - adds r1, r0, 0 - cmp r4, r3 - bcs _08110B76 - movs r0, 0xC4 - lsls r0, 3 - adds r5, r1, r0 - ldrh r0, [r5] - ldrb r2, [r6, 0x14] - cmp r0, r2 - beq _08110B76 -_08110B62: - adds r0, r4, 0x1 - lsls r0, 16 - lsrs r4, r0, 16 - cmp r4, r3 - bcs _08110B76 - lsls r0, r4, 1 - adds r0, r5 - ldrh r0, [r0] - cmp r0, r2 - bne _08110B62 -_08110B76: - movs r3, 0x89 - lsls r3, 1 - adds r2, r1, r3 - ldrh r0, [r2] - cmp r4, r0 - bne _08110B96 - lsls r0, r4, 1 - movs r3, 0xC4 - lsls r3, 3 - adds r1, r3 - adds r0, r1 - ldrb r1, [r6, 0x14] - strh r1, [r0] - ldrh r0, [r2] - adds r0, 0x1 - strh r0, [r2] -_08110B96: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08110B9C: .4byte gSharedMem -_08110BA0: .4byte gUnknown_083F857A - thumb_func_end SetSpecialMapHasMon - - thumb_func_start MapHasMon -MapHasMon: @ 8110BA4 - push {r4-r6,lr} - adds r5, r0, 0 - lsls r1, 16 - lsrs r4, r1, 16 - adds r6, r4, 0 - ldr r0, [r5, 0x4] - adds r1, r4, 0 - movs r2, 0xC - bl MonListHasMon - lsls r0, 24 - cmp r0, 0 - bne _08110BF2 - ldr r0, [r5, 0x8] - adds r1, r4, 0 - movs r2, 0x5 - bl MonListHasMon - lsls r0, 24 - cmp r0, 0 - bne _08110BF2 - ldr r0, [r5, 0x10] - adds r1, r4, 0 - movs r2, 0xC - bl MonListHasMon - lsls r0, 24 - cmp r0, 0 - bne _08110BF2 - ldr r0, [r5, 0xC] - adds r1, r6, 0 - movs r2, 0x5 - bl MonListHasMon - lsls r0, 24 - cmp r0, 0 - bne _08110BF2 - movs r0, 0 - b _08110BF4 -_08110BF2: - movs r0, 0x1 -_08110BF4: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end MapHasMon - - thumb_func_start MonListHasMon -MonListHasMon: @ 8110BFC - push {r4,lr} - lsls r1, 16 - lsrs r4, r1, 16 - lsls r2, 16 - lsrs r2, 16 - cmp r0, 0 - beq _08110C2A - movs r3, 0 - cmp r3, r2 - bcs _08110C2A - ldr r1, [r0, 0x4] -_08110C12: - lsls r0, r3, 2 - adds r0, r1 - ldrh r0, [r0, 0x2] - cmp r0, r4 - bne _08110C20 - movs r0, 0x1 - b _08110C2C -_08110C20: - adds r0, r3, 0x1 - lsls r0, 16 - lsrs r3, r0, 16 - cmp r3, r2 - bcc _08110C12 -_08110C2A: - movs r0, 0 -_08110C2C: - pop {r4} - pop {r1} - bx r1 - thumb_func_end MonListHasMon - thumb_func_start BuildAreaGlowTilemap BuildAreaGlowTilemap: @ 8110C34 push {r4-r7,lr} diff --git a/src/pokedex_area_screen.c b/src/pokedex_area_screen.c index 078ae556a..8a57ea99b 100644 --- a/src/pokedex_area_screen.c +++ b/src/pokedex_area_screen.c @@ -9,11 +9,13 @@ #include "task.h" #include "sprite.h" #include "region_map.h" +#include "region_map_sections.h" #include "string_util.h" #include "text.h" #include "wild_encounter.h" #include "roamer.h" #include "overworld.h" +#include "event_data.h" // Static type declarations @@ -36,7 +38,9 @@ struct PokedexAreaScreenEwramStruct u16 unk0112; u16 unk0114; u8 unk0116[0x500]; - u8 filler_0616[0xD2]; + u8 filler_0616[0x0A]; + u16 unk0620[0x20]; + u8 filler_0660[0x88]; struct RegionMap unk06E8; u8 unk0F68[16]; }; @@ -61,13 +65,14 @@ void sub_8110814(void (*func)(void)); void sub_8110824(void); bool8 DrawAreaGlow(void); void FindMapsWithMon(u16 mon); +void SetAreaHasMon(u16 mapGroup, u16 mapNum); +void SetSpecialMapHasMon(u16 mapGroup, u16 mapNum); +bool8 MapHasMon(const struct WildPokemonHeader *header, u16 mon); +bool8 MonListHasMon(const struct WildPokemonInfo *info, u16 mon, u16 size); +void BuildAreaGlowTilemap(void); void sub_8111084(void); void sub_8111110(void); void sub_8111288(void); -void BuildAreaGlowTilemap(void); -bool8 MapHasMon(const struct WildPokemonHeader *header, u16 mon); -void SetAreaHasMon(u16 mapGroup, u16 mapNum); -void SetSpecialMapHasMon(u16 mapGroup, u16 mapNum); // .rodata @@ -75,6 +80,7 @@ extern const u16 gUnknown_083F8418[]; extern const u8 gUnknown_083F8438[]; extern const u16 gUnknown_083F856C[]; extern const u16 gUnknown_083F856E[][3]; +extern const u16 gUnknown_083F857A[][2]; // .text @@ -266,3 +272,59 @@ void SetAreaHasMon(u16 mapGroup, u16 mapNum) ePokedexAreaScreen.unk0110++; } } + +void SetSpecialMapHasMon(u16 mapGroup, u16 mapNum) +{ + const struct MapHeader *mapHeader; + u16 i; + + if (ePokedexAreaScreen.unk0112 < 0x20) + { + mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); + if (mapHeader->regionMapSectionId < MAPSEC_Nothing) + { + for (i = 0; gUnknown_083F857A[i][0] != MAPSEC_Nothing; i++) + { + if (mapHeader->regionMapSectionId == gUnknown_083F857A[i][0] && !FlagGet(gUnknown_083F857A[i][1])) + return; + } + for (i = 0; i < ePokedexAreaScreen.unk0112; i++) + { + if (ePokedexAreaScreen.unk0620[i] == mapHeader->regionMapSectionId) + break; + } + if (i == ePokedexAreaScreen.unk0112) + { + ePokedexAreaScreen.unk0620[i] = mapHeader->regionMapSectionId; + ePokedexAreaScreen.unk0112++; + } + } + } +} + +bool8 MapHasMon(const struct WildPokemonHeader *header, u16 mon) +{ + if (MonListHasMon(header->landMonsInfo, mon, 12)) + return TRUE; + if (MonListHasMon(header->waterMonsInfo, mon, 5)) + return TRUE; + if (MonListHasMon(header->fishingMonsInfo, mon, 12)) + return TRUE; + if (MonListHasMon(header->rockSmashMonsInfo, mon, 5)) + return TRUE; + return FALSE; +} + +bool8 MonListHasMon(const struct WildPokemonInfo *info, u16 mon, u16 size) +{ + u16 i; + if (info != NULL) + { + for (i = 0; i < size; i++) + { + if (info->wildPokemon[i].species == mon) + return TRUE; + } + } + return FALSE; +} |