summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pokedex_area_screen.c166
-rw-r--r--src/roamer.c6
2 files changed, 162 insertions, 10 deletions
diff --git a/src/pokedex_area_screen.c b/src/pokedex_area_screen.c
index 020f0e9b2..078ae556a 100644
--- a/src/pokedex_area_screen.c
+++ b/src/pokedex_area_screen.c
@@ -1,6 +1,8 @@
// Includes
#include "global.h"
+#include "constants/species.h"
+#include "constants/maps.h"
#include "ewram.h"
#include "main.h"
#include "palette.h"
@@ -9,17 +11,32 @@
#include "region_map.h"
#include "string_util.h"
#include "text.h"
+#include "wild_encounter.h"
+#include "roamer.h"
+#include "overworld.h"
// Static type declarations
+struct PokedexAreaScreenSubstruct0010
+{
+ u8 mapGroup;
+ u8 mapNum;
+ u16 regionMapSectionId;
+};
+
struct PokedexAreaScreenEwramStruct
{
- u8 filler_0000[4];
+ void (*unk0000)(void);
u32 unk0004;
u32 unk0008;
- u8 filler_000C[2];
+ u16 unk000C;
u16 unk000E;
- u8 filler_0010[0x6d8];
+ struct PokedexAreaScreenSubstruct0010 unk0010[0x40];
+ u16 unk0110;
+ u16 unk0112;
+ u16 unk0114;
+ u8 unk0116[0x500];
+ u8 filler_0616[0xD2];
struct RegionMap unk06E8;
u8 unk0F68[16];
};
@@ -42,12 +59,23 @@ void sub_81107DC(void);
void sub_81107F0(void);
void sub_8110814(void (*func)(void));
void sub_8110824(void);
-void sub_8111084(void);
bool8 DrawAreaGlow(void);
+void FindMapsWithMon(u16 mon);
+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
+extern const u16 gUnknown_083F8418[];
+extern const u8 gUnknown_083F8438[];
+extern const u16 gUnknown_083F856C[];
+extern const u16 gUnknown_083F856E[][3];
+
// .text
void UnusedPokedexAreaScreen(u16 a0, u32 a1, u32 a2)
@@ -108,3 +136,133 @@ void CB2_UnusedPokedexAreaScreen(void)
}
gMain.state++;
}
+
+void sub_81107DC(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void sub_81107F0(void)
+{
+ ePokedexAreaScreen.unk0000();
+ sub_8111110();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void sub_8110814(void (*func)(void))
+{
+ ePokedexAreaScreen.unk0000 = func;
+ ePokedexAreaScreen.unk000C = 0;
+}
+
+void sub_8110824(void)
+{
+ ePokedexAreaScreen.unk0114 = 0;
+}
+
+bool8 DrawAreaGlow(void)
+{
+ switch (ePokedexAreaScreen.unk0114)
+ {
+ case 0:
+ FindMapsWithMon(ePokedexAreaScreen.unk000E);
+ break;
+ case 1:
+ BuildAreaGlowTilemap();
+ break;
+ case 2:
+ LZ77UnCompVram(gUnknown_083F8438, BG_CHAR_ADDR(3));
+ break;
+ case 3:
+ DmaCopy16(3, ePokedexAreaScreen.unk0116, BG_SCREEN_ADDR(30), 0x500);
+ break;
+ case 4:
+ LoadPalette(gUnknown_083F8418, 0, 32);
+ break;
+ case 5:
+ REG_BG0CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(3) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT256x256;
+ ePokedexAreaScreen.unk0114++;
+ return FALSE;
+ default:
+ return FALSE;
+ }
+ ePokedexAreaScreen.unk0114++;
+ return TRUE;
+}
+
+void FindMapsWithMon(u16 mon)
+{
+ u16 i;
+ struct Roamer *roamer;
+
+ if (mon != ROAMER_SPECIES)
+ {
+ ePokedexAreaScreen.unk0110 = 0;
+ ePokedexAreaScreen.unk0112 = 0;
+ for (i = 0; i < 1; i++)
+ {
+ if (gUnknown_083F856C[i] == mon)
+ return;
+ }
+ for (i = 0; gUnknown_083F856E[i][0] != NUM_SPECIES; i++)
+ {
+ if (mon == gUnknown_083F856E[i][0])
+ {
+ switch (gUnknown_083F856E[i][1])
+ {
+ case MAP_GROUP(PETALBURG_CITY):
+ SetAreaHasMon(gUnknown_083F856E[i][1], gUnknown_083F856E[i][2]);
+ break;
+ case MAP_GROUP(METEOR_FALLS_1F_1R):
+ case MAP_GROUP(SAFARI_ZONE_NORTHWEST):
+ SetSpecialMapHasMon(gUnknown_083F856E[i][1], gUnknown_083F856E[i][2]);
+ break;
+ }
+ }
+ }
+ for (i = 0; gWildMonHeaders[i].mapGroup != 0xFF; i++)
+ {
+ if (MapHasMon(gWildMonHeaders + i, mon))
+ {
+ switch (gWildMonHeaders[i].mapGroup)
+ {
+ case MAP_GROUP(PETALBURG_CITY):
+ SetAreaHasMon(gWildMonHeaders[i].mapGroup, gWildMonHeaders[i].mapNum);
+ break;
+ case MAP_GROUP(METEOR_FALLS_1F_1R):
+ case MAP_GROUP(SAFARI_ZONE_NORTHWEST):
+ SetSpecialMapHasMon(gWildMonHeaders[i].mapGroup, gWildMonHeaders[i].mapNum);
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ ePokedexAreaScreen.unk0112 = 0;
+ roamer = &gSaveBlock1.roamer;
+ if (roamer->active)
+ {
+ GetRoamerLocation(&ePokedexAreaScreen.unk0010[0].mapGroup, &ePokedexAreaScreen.unk0010[0].mapNum);
+ ePokedexAreaScreen.unk0010[0].regionMapSectionId = Overworld_GetMapHeaderByGroupAndId(ePokedexAreaScreen.unk0010[0].mapGroup, ePokedexAreaScreen.unk0010[0].mapNum)->regionMapSectionId;
+ ePokedexAreaScreen.unk0110 = 1;
+ }
+ else
+ ePokedexAreaScreen.unk0110 = 0;
+ }
+}
+
+void SetAreaHasMon(u16 mapGroup, u16 mapNum)
+{
+ if (ePokedexAreaScreen.unk0110 < 0x40)
+ {
+ ePokedexAreaScreen.unk0010[ePokedexAreaScreen.unk0110].mapGroup = mapGroup;
+ ePokedexAreaScreen.unk0010[ePokedexAreaScreen.unk0110].mapNum = mapNum;
+ ePokedexAreaScreen.unk0010[ePokedexAreaScreen.unk0110].regionMapSectionId = sub_80FBA04(Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum)->regionMapSectionId);
+ ePokedexAreaScreen.unk0110++;
+ }
+}
diff --git a/src/roamer.c b/src/roamer.c
index 459082e42..57dd0745b 100644
--- a/src/roamer.c
+++ b/src/roamer.c
@@ -6,12 +6,6 @@
#include "region_map.h"
#include "constants/species.h"
-#ifdef SAPPHIRE
-#define ROAMER_SPECIES SPECIES_LATIAS
-#else
-#define ROAMER_SPECIES SPECIES_LATIOS
-#endif
-
enum
{
MAP_GRP = 0, // map group