summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/pokedex_area_screen.s183
-rw-r--r--src/pokedex_area_screen.c72
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;
+}