Decompile pokedex_area_screen.c (#412)

This commit is contained in:
Marcus Huderle 2018-11-30 10:41:03 -06:00 committed by GitHub
parent 275ce5deff
commit 9dd7f8f214
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 763 additions and 2028 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,92 +0,0 @@
#include "constants/flags.h"
#include "constants/region_map_sections.h"
#include "constants/species.h"
.include "asm/macros.inc"
.include "constants/constants.inc"
.section .rodata
.align 2
gUnknown_085B3D94:: @ 85B3D94
.incbin "graphics/pokedex/area_glow.gbapal"
.align 2
gUnknown_085B3DB4:: @ 85B3DB4
.incbin "graphics/pokedex/area_glow.4bpp.lz"
.align 1
gUnknown_085B3EE8:: @ 85B3EE8
.2byte 0x0168
.align 1
gUnknown_085B3EEA:: @ 85B3EEA
.2byte MAPSEC_MARINE_CAVE, MAPSEC_UNDERWATER_MARINE_CAVE, MAPSEC_TERRA_CAVE
.align 1
gUnknown_085B3EF0:: @ 85B3EF0
.2byte SPECIES_FEEBAS, 0x0000, 0x0022
.2byte SPECIES_EGG, 0x0000, 0x0000
.align 1
gUnknown_085B3EFC:: @ 85B3EFC
.2byte MAPSEC_SKY_PILLAR, FLAG_LANDMARK_SKY_PILLAR
.2byte MAPSEC_SEAFLOOR_CAVERN, FLAG_LANDMARK_SEAFLOOR_CAVERN
.2byte MAPSEC_ALTERING_CAVE_2, FLAG_LANDMARK_ALTERING_CAVE
.2byte MAPSEC_MIRAGE_TOWER, FLAG_LANDMARK_MIRAGE_TOWER
.2byte MAPSEC_DESERT_UNDERPASS, FLAG_LANDMARK_DESERT_UNDERPASS
.2byte MAPSEC_ARTISAN_CAVE, FLAG_0x8DF
.2byte MAPSEC_NONE, 0x0000
gUnknown_085B3F18:: @ 85B3F18
.byte 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11, 0x20, 0x02, 0x03, 0x27, 0x2d, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
.byte 0x12, 0x21, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x2a, 0x2e, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x13, 0x22, 0x02, 0x03, 0x27, 0x2d, 0x06, 0x07, 0x2a, 0x2e, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
.byte 0x14, 0x01, 0x23, 0x03, 0x26, 0x05, 0x2c, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x15, 0x20, 0x23, 0x03, 0x28, 0x2d, 0x2c, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
.byte 0x16, 0x21, 0x23, 0x03, 0x26, 0x05, 0x2c, 0x07, 0x2a, 0x2e, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x17, 0x22, 0x23, 0x03, 0x28, 0x2d, 0x2c, 0x07, 0x2a, 0x2e, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
.byte 0x18, 0x01, 0x24, 0x03, 0x04, 0x05, 0x06, 0x07, 0x29, 0x09, 0x2f, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x19, 0x20, 0x24, 0x03, 0x27, 0x2d, 0x06, 0x07, 0x29, 0x09, 0x2f, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
.byte 0x1a, 0x21, 0x24, 0x03, 0x04, 0x05, 0x06, 0x07, 0x2b, 0x2e, 0x2f, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x1b, 0x22, 0x24, 0x03, 0x27, 0x2d, 0x06, 0x07, 0x2b, 0x2e, 0x2f, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
.byte 0x1c, 0x01, 0x25, 0x03, 0x26, 0x05, 0x2c, 0x07, 0x29, 0x09, 0x2f, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x1d, 0x20, 0x25, 0x03, 0x28, 0x2d, 0x2c, 0x07, 0x29, 0x09, 0x2f, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
.byte 0x1e, 0x21, 0x25, 0x03, 0x26, 0x05, 0x2c, 0x07, 0x2b, 0x2e, 0x2f, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x1f, 0x22, 0x25, 0x03, 0x28, 0x2d, 0x2c, 0x07, 0x2b, 0x2e, 0x2f, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
.align 2
gUnknown_085B4018:: @ 85B4018
.4byte 0x00002003
.align 2
gUnknown_085B401C:: @ 85B401C
obj_tiles AreaMarkerTiles, 0x0080, 0x0002
.align 2
gUnknown_085B4024:: @ 85B4024
obj_pal AreaMarkerPalette, 0x0002
.align 2
gUnknown_085B402C:: @ 85B402C
.2byte 0x0000
.2byte 0x4000
.2byte 0x0400
.align 2
gUnknown_085B4034:: @ 85B4034
spr_template 0x0002, 0x0002, gUnknown_085B402C, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
.align 2
AreaMarkerPalette:: @ 85B404C
.incbin "graphics/pokedex/area_marker.gbapal"
.align 2
AreaMarkerTiles:: @ 85B406C
.incbin "graphics/pokedex/area_marker.4bpp"
.align 2
gUnknown_085B40EC:: @ 85B40EC
obj_pal gPokedexAreaScreenAreaUnknown_Pal, 0x0003
.align 2
gOamData_85B40F4:: @ 85B40F4
.2byte 0x0000
.2byte 0x8000
.2byte 0x0400
.align 2
gSpriteTemplate_85B40FC:: @ 85B40FC
spr_template 0x0003, 0x0003, gOamData_85B40F4, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy

View File

@ -4736,4 +4736,8 @@ extern const u32 gSlotMachineReelTime_Gfx[];
extern const u32 gUnknown_08D8D410[];
extern const u32 gUnknown_08D8D58C[];
// Pokedex Area Screen
extern const u32 gPokedexAreaScreenAreaUnknown_Gfx[];
extern const u16 gPokedexAreaScreenAreaUnknown_Pal[];
#endif //GUARD_GRAPHICS_H

View File

@ -1,6 +1,6 @@
#ifndef GUARD_POKEDEX_AREA_SCREEN_H
#define GUARD_POKEDEX_AREA_SCREEN_H
void sub_813D3D8(u16, u8*);
void ShowPokedexAreaScreen(u16, u8*);
#endif // GUARD_POKEDEX_AREA_SCREEN_H

View File

@ -78,6 +78,15 @@ struct RegionMap {
/*0x284*/ u8 cursorLargeImage[0x600];
}; // size = 0x884
struct RegionMapLocation
{
u8 x;
u8 y;
u8 width;
u8 height;
const u8 *name;
};
// Exported RAM declarations
// Exported ROM declarations
@ -95,5 +104,10 @@ u8 *GetMapName(u8 *, u16, u16);
bool32 sub_8124668(u8 mapSecId);
u8 *sub_81245DC(u8 *dest, u16 mapSecId);
u8 *sub_8124610(u8 *dest, u16 mapSecId);
u16 CorrectSpecialMapSecId(u16 mapSecId);
void sub_8122D88(struct RegionMap *regionMap);
void PokedexAreaScreen_UpdateRegionMapVariablesAndVideoRegs(s16 x, s16 y);
extern const struct RegionMapLocation gRegionMapEntries[];
#endif //GUARD_REGION_MAP_H

View File

@ -0,0 +1,17 @@
#ifndef GUARD_UNK_POKEDEX_AREA_SCREEN_HELPER_H
#define GUARD_UNK_POKEDEX_AREA_SCREEN_HELPER_H
struct UnkStruct_1C4D70
{
u32 bg:2;
u32 unk2:8;
u32 unk10:2;
u32 unk12:20;
};
void sub_81C4D70(const struct UnkStruct_1C4D70 *);
bool32 sub_81C4E90(void);
void sub_81C4ED0(u32);
void sub_81C4EB4(void);
#endif // GUARD_UNK_POKEDEX_AREA_SCREEN_HELPER_H

View File

@ -203,7 +203,7 @@ SECTIONS {
src/hof_pc.o(.text);
src/field_specials.o(.text);
src/battle_records.o(.text);
asm/pokedex_area_screen.o(.text);
src/pokedex_area_screen.o(.text);
src/evolution_scene.o(.text);
asm/roulette.o(.text);
src/pokedex_cry_screen.o(.text);
@ -519,7 +519,7 @@ SECTIONS {
src/time_events.o(.rodata);
src/field_specials.o(.rodata);
src/battle_records.o(.rodata);
data/pokedex_area_screen.o(.rodata);
src/pokedex_area_screen.o(.rodata);
src/evolution_scene.o(.rodata);
data/roulette.o(.rodata);
src/pokedex_cry_screen.o(.rodata);

View File

@ -3156,7 +3156,7 @@ void sub_80BF0AC(u8 taskId)
gMain.state++;
break;
case 2:
sub_813D3D8(NationalPokedexNumToSpecies(gUnknown_02039B54->dexNum), &gUnknown_02039B4C->unk64E);
ShowPokedexAreaScreen(NationalPokedexNumToSpecies(gUnknown_02039B54->dexNum), &gUnknown_02039B4C->unk64E);
SetVBlankCallback(gUnknown_030060B4);
gUnknown_02039B4C->unk64E = 0;
gMain.state = 0;

720
src/pokedex_area_screen.c Executable file
View File

@ -0,0 +1,720 @@
#include "global.h"
#include "bg.h"
#include "event_data.h"
#include "gpu_regs.h"
#include "graphics.h"
#include "main.h"
#include "malloc.h"
#include "menu.h"
#include "overworld.h"
#include "palette.h"
#include "pokedex_area_screen.h"
#include "region_map.h"
#include "roamer.h"
#include "sound.h"
#include "string_util.h"
#include "trig.h"
#include "unk_pokedex_area_screen_helper.h"
#include "wild_encounter.h"
#include "constants/maps.h"
#include "constants/region_map_sections.h"
#include "constants/rgb.h"
#include "constants/songs.h"
#include "constants/species.h"
#include "constants/vars.h"
struct PokeDexAreaScreenMapIdentity
{
u8 mapGroup;
u8 mapNum;
u16 regionMapSectionId;
};
struct PokeDexAreaScreen
{
/*0x000*/ void (*callback)(void); // unused
/*0x004*/ MainCallback prev; // unused
/*0x008*/ MainCallback next; // unused
/*0x00C*/ u16 state; // unused
/*0x00E*/ u16 species;
/*0x010*/ struct PokeDexAreaScreenMapIdentity overworldAreasWithMons[0x40];
/*0x110*/ u16 numOverworldAreas;
/*0x112*/ u16 numSpecialAreas;
/*0x114*/ u16 drawAreaGlowState;
/*0x116*/ u16 areaGlowTilemap[0x280];
/*0x616*/ u16 areaShadeOrMarkerFrameCounter;
/*0x618*/ u16 areaShadeFrameCounter;
/*0x61A*/ u16 areaShadeBldArgLo;
/*0x61C*/ u16 areaShadeBldArgHi;
/*0x61E*/ u8 whichMarkersFlashing;
/*0x61F*/ u8 specialMarkerCycleCounter;
/*0x620*/ u16 specialAreaRegionMapSectionIds[0x20];
/*0x660*/ struct Sprite *areaMarkerSprites[0x20];
/*0x6E0*/ u16 numAreaMarkerSprites;
/*0x6E2*/ u16 unk6E2;
/*0x6E4*/ u16 unk6E4;
/*0x6E8*/ u8 *errno;
/*0x6EC*/ struct RegionMap regionMap;
/*0xF70*/ u8 charBuffer[0x40];
/*0xFB0*/ struct Sprite * areaUnknownSprites[3];
/*0xFBC*/ u8 areaUnknownGraphicsBuffer[0x600];
};
static EWRAM_DATA struct PokeDexAreaScreen *sPokedexAreaScreen = NULL;
static void FindMapsWithMon(u16);
static void BuildAreaGlowTilemap(void);
static void SetAreaHasMon(u16, u16);
static void SetSpecialMapHasMon(u16, u16);
static u16 GetRegionMapSectionId(u8, u8);
static bool8 MapHasMon(const struct WildPokemonHeader *, u16);
static bool8 MonListHasMon(const struct WildPokemonInfo *, u16, u16);
static void DoAreaGlow(void);
static void Task_PokedexAreaScreen_0(u8);
static void CreateAreaMarkerSprites(void);
static void LoadAreaUnknownGraphics(void);
static void CreateAreaUnknownSprites(void);
static void Task_PokedexAreaScreen_1(u8);
static void sub_813D6B4(void);
static void DestroyAreaMarkerSprites(void);
static const u32 sAreaGlow_Pal[] = INCBIN_U32("graphics/pokedex/area_glow.gbapal");
static const u32 sAreaGlow_Gfx[] = INCBIN_U32("graphics/pokedex/area_glow.4bpp.lz");
static const u16 sSpeciesHiddenFromAreaScreen[] = { SPECIES_WYNAUT };
static const u16 sMovingRegionMapSections[3] = { MAPSEC_MARINE_CAVE, MAPSEC_UNDERWATER_MARINE_CAVE, MAPSEC_TERRA_CAVE };
static const u16 sFeebasData[][3] = {
{SPECIES_FEEBAS, MAP_GROUP(ROUTE119), MAP_NUM(ROUTE119)},
{NUM_SPECIES}
};
static const u16 sLandmarkData[][2] = {
{MAPSEC_SKY_PILLAR, FLAG_LANDMARK_SKY_PILLAR},
{MAPSEC_SEAFLOOR_CAVERN, FLAG_LANDMARK_SEAFLOOR_CAVERN},
{MAPSEC_ALTERING_CAVE_2, FLAG_LANDMARK_ALTERING_CAVE},
{MAPSEC_MIRAGE_TOWER, FLAG_LANDMARK_MIRAGE_TOWER},
{MAPSEC_DESERT_UNDERPASS, FLAG_LANDMARK_DESERT_UNDERPASS},
{MAPSEC_ARTISAN_CAVE, FLAG_0x8DF},
{MAPSEC_NONE}
};
static const u8 sAreaGlowTilemapMapping[] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x11, 0x20, 0x02, 0x03, 0x27, 0x2d, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x12, 0x21, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x2a, 0x2e, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x13, 0x22, 0x02, 0x03, 0x27, 0x2d, 0x06, 0x07, 0x2a, 0x2e, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x14, 0x01, 0x23, 0x03, 0x26, 0x05, 0x2c, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x15, 0x20, 0x23, 0x03, 0x28, 0x2d, 0x2c, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x16, 0x21, 0x23, 0x03, 0x26, 0x05, 0x2c, 0x07, 0x2a, 0x2e, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x17, 0x22, 0x23, 0x03, 0x28, 0x2d, 0x2c, 0x07, 0x2a, 0x2e, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x18, 0x01, 0x24, 0x03, 0x04, 0x05, 0x06, 0x07, 0x29, 0x09, 0x2f, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x19, 0x20, 0x24, 0x03, 0x27, 0x2d, 0x06, 0x07, 0x29, 0x09, 0x2f, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x1a, 0x21, 0x24, 0x03, 0x04, 0x05, 0x06, 0x07, 0x2b, 0x2e, 0x2f, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x1b, 0x22, 0x24, 0x03, 0x27, 0x2d, 0x06, 0x07, 0x2b, 0x2e, 0x2f, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x1c, 0x01, 0x25, 0x03, 0x26, 0x05, 0x2c, 0x07, 0x29, 0x09, 0x2f, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x1d, 0x20, 0x25, 0x03, 0x28, 0x2d, 0x2c, 0x07, 0x29, 0x09, 0x2f, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x1e, 0x21, 0x25, 0x03, 0x26, 0x05, 0x2c, 0x07, 0x2b, 0x2e, 0x2f, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x1f, 0x22, 0x25, 0x03, 0x28, 0x2d, 0x2c, 0x07, 0x2b, 0x2e, 0x2f, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
};
static const struct UnkStruct_1C4D70 sUnknown_085B4018 = {
.bg = 3,
.unk2 = 0,
.unk10 = 0,
.unk12 = 2,
};
static const u8 sAreaMarkerTiles[];
static const struct SpriteSheet sAreaMarkerSpriteSheet = {
sAreaMarkerTiles, 0x80, 2
};
static const u16 sAreaMarkerPalette[];
static const struct SpritePalette sAreaMarkerSpritePalette = {
sAreaMarkerPalette, 2
};
static const struct OamData sAreaMarkerOamData = {
.size = 1,
.priority = 1
};
static const struct SpriteTemplate sAreaMarkerSpriteTemplate = {
2,
2,
&sAreaMarkerOamData,
gDummySpriteAnimTable,
NULL,
gDummySpriteAffineAnimTable,
SpriteCallbackDummy
};
static const u16 sAreaMarkerPalette[] = INCBIN_U16("graphics/pokedex/area_marker.gbapal");
static const u8 sAreaMarkerTiles[] = INCBIN_U8("graphics/pokedex/area_marker.4bpp");
static const struct SpritePalette sAreaUnknownSpritePalette = {
gPokedexAreaScreenAreaUnknown_Pal, 3
};
static const struct OamData sAreaUnknownOamData = {
.size = 2,
.priority = 1
};
static const struct SpriteTemplate sAreaUnknownSpriteTemplate = {
3,
3,
&sAreaUnknownOamData,
gDummySpriteAnimTable,
NULL,
gDummySpriteAffineAnimTable,
SpriteCallbackDummy
};
static void ResetDrawAreaGlowState(void)
{
sPokedexAreaScreen->drawAreaGlowState = 0;
}
static bool8 DrawAreaGlow(void)
{
switch (sPokedexAreaScreen->drawAreaGlowState)
{
case 0:
FindMapsWithMon(sPokedexAreaScreen->species);
break;
case 1:
BuildAreaGlowTilemap();
break;
case 2:
decompress_and_copy_tile_data_to_vram(2, sAreaGlow_Gfx, 0, 0, 0);
LoadBgTilemap(2, sPokedexAreaScreen->areaGlowTilemap, 0x500, 0);
break;
case 3:
if (!free_temp_tile_data_buffers_if_possible())
{
CpuCopy32(sAreaGlow_Pal, gPlttBufferUnfaded + 0xA0, 0x20);
sPokedexAreaScreen->drawAreaGlowState++;
}
return TRUE;
case 4:
ChangeBgY(2, -0x800, 0);
break;
default:
return FALSE;
}
sPokedexAreaScreen->drawAreaGlowState++;
return TRUE;
}
static void FindMapsWithMon(u16 species)
{
u16 i;
struct Roamer *roamer;
sPokedexAreaScreen->unk6E2 = 0;
sPokedexAreaScreen->unk6E4 = VarGet(VAR_ALTERING_CAVE_WILD_SET);
if (sPokedexAreaScreen->unk6E4 > 8)
sPokedexAreaScreen->unk6E4 = 0;
roamer = &gSaveBlock1Ptr->roamer;
if (species != roamer->species)
{
sPokedexAreaScreen->numOverworldAreas = 0;
sPokedexAreaScreen->numSpecialAreas = 0;
for (i = 0; i < ARRAY_COUNT(sSpeciesHiddenFromAreaScreen); i++)
{
if (sSpeciesHiddenFromAreaScreen[i] == species)
return;
}
for (i = 0; sFeebasData[i][0] != NUM_SPECIES; i++)
{
if (species == sFeebasData[i][0])
{
switch (sFeebasData[i][1])
{
case MAP_GROUP(PETALBURG_CITY):
SetAreaHasMon(sFeebasData[i][1], sFeebasData[i][2]);
break;
case MAP_GROUP(METEOR_FALLS_1F_1R):
case MAP_GROUP(SAFARI_ZONE_NORTHWEST):
SetSpecialMapHasMon(sFeebasData[i][1], sFeebasData[i][2]);
break;
}
}
}
for (i = 0; gWildMonHeaders[i].mapGroup != 0xFF; i++)
{
if (MapHasMon(gWildMonHeaders + i, species))
{
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
{
sPokedexAreaScreen->numSpecialAreas = 0;
if (roamer->active)
{
GetRoamerLocation(&sPokedexAreaScreen->overworldAreasWithMons[0].mapGroup, &sPokedexAreaScreen->overworldAreasWithMons[0].mapNum);
sPokedexAreaScreen->overworldAreasWithMons[0].regionMapSectionId = Overworld_GetMapHeaderByGroupAndId(sPokedexAreaScreen->overworldAreasWithMons[0].mapGroup, sPokedexAreaScreen->overworldAreasWithMons[0].mapNum)->regionMapSectionId;
sPokedexAreaScreen->numOverworldAreas = 1;
}
else
{
sPokedexAreaScreen->numOverworldAreas = 0;
}
}
}
static void SetAreaHasMon(u16 mapGroup, u16 mapNum)
{
if (sPokedexAreaScreen->numOverworldAreas < 0x40)
{
sPokedexAreaScreen->overworldAreasWithMons[sPokedexAreaScreen->numOverworldAreas].mapGroup = mapGroup;
sPokedexAreaScreen->overworldAreasWithMons[sPokedexAreaScreen->numOverworldAreas].mapNum = mapNum;
sPokedexAreaScreen->overworldAreasWithMons[sPokedexAreaScreen->numOverworldAreas].regionMapSectionId = CorrectSpecialMapSecId(Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum)->regionMapSectionId);
sPokedexAreaScreen->numOverworldAreas++;
}
}
static void SetSpecialMapHasMon(u16 mapGroup, u16 mapNum)
{
int i;
if (sPokedexAreaScreen->numSpecialAreas < 0x20)
{
u16 regionMapSectionId = GetRegionMapSectionId(mapGroup, mapNum);
if (regionMapSectionId < MAPSEC_NONE)
{
for (i = 0; i < ARRAY_COUNT(sMovingRegionMapSections); i++)
{
if (regionMapSectionId == sMovingRegionMapSections[i])
return;
}
for (i = 0; sLandmarkData[i][0] != MAPSEC_NONE; i++)
{
if (regionMapSectionId == sLandmarkData[i][0] && !FlagGet(sLandmarkData[i][1]))
return;
}
for (i = 0; i < sPokedexAreaScreen->numSpecialAreas; i++)
{
if (sPokedexAreaScreen->specialAreaRegionMapSectionIds[i] == regionMapSectionId)
break;
}
if (i == sPokedexAreaScreen->numSpecialAreas)
{
sPokedexAreaScreen->specialAreaRegionMapSectionIds[i] = regionMapSectionId;
sPokedexAreaScreen->numSpecialAreas++;
}
}
}
}
static u16 GetRegionMapSectionId(u8 mapGroup, u8 mapNum)
{
return Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum)->regionMapSectionId;
}
static bool8 MapHasMon(const struct WildPokemonHeader *info, u16 species)
{
if (GetRegionMapSectionId(info->mapGroup, info->mapNum) == MAPSEC_ALTERING_CAVE_2)
{
sPokedexAreaScreen->unk6E2++;
if (sPokedexAreaScreen->unk6E2 != sPokedexAreaScreen->unk6E4 + 1)
return FALSE;
}
if (MonListHasMon(info->landMonsInfo, species, 12))
return TRUE;
if (MonListHasMon(info->waterMonsInfo, species, 5))
return TRUE;
if (MonListHasMon(info->fishingMonsInfo, species, 12))
return TRUE;
if (MonListHasMon(info->rockSmashMonsInfo, species, 5))
return TRUE;
return FALSE;
}
static bool8 MonListHasMon(const struct WildPokemonInfo *info, u16 species, u16 size)
{
u16 i;
if (info != NULL)
{
for (i = 0; i < size; i++)
{
if (info->wildPokemon[i].species == species)
return TRUE;
}
}
return FALSE;
}
static void BuildAreaGlowTilemap(void)
{
u16 i, y, x, j;
u16 val;
for (i = 0; i < 0x280; i++)
sPokedexAreaScreen->areaGlowTilemap[i] = 0;
for (i = 0; i < sPokedexAreaScreen->numOverworldAreas; i++)
{
j = 0;
for (y = 0; y < 20; y++)
{
for (x = 0; x < 32; x++)
{
if (GetRegionMapSectionIdAt(x, y) == sPokedexAreaScreen->overworldAreasWithMons[i].regionMapSectionId)
sPokedexAreaScreen->areaGlowTilemap[j] = 0xFFFF;
j++;
}
}
}
j = 0;
for (y = 0; y < 20; y++)
{
for (x = 0; x < 32; x++)
{
if (sPokedexAreaScreen->areaGlowTilemap[j] == 0xFFFF)
{
if (x != 0 && sPokedexAreaScreen->areaGlowTilemap[j - 1] != 0xFFFF)
sPokedexAreaScreen->areaGlowTilemap[j - 1] |= 0x02;
if (x != 31 && sPokedexAreaScreen->areaGlowTilemap[j + 1] != 0xFFFF)
sPokedexAreaScreen->areaGlowTilemap[j + 1] |= 0x01;
if (y != 0 && sPokedexAreaScreen->areaGlowTilemap[j - 32] != 0xFFFF)
sPokedexAreaScreen->areaGlowTilemap[j - 32] |= 0x08;
if (y != 19 && sPokedexAreaScreen->areaGlowTilemap[j + 32] != 0xFFFF)
sPokedexAreaScreen->areaGlowTilemap[j + 32] |= 0x04;
if (x != 0 && y != 0 && sPokedexAreaScreen->areaGlowTilemap[j - 33] != 0xFFFF)
sPokedexAreaScreen->areaGlowTilemap[j - 33] |= 0x10;
if (x != 31 && y != 0 && sPokedexAreaScreen->areaGlowTilemap[j - 31] != 0xFFFF)
sPokedexAreaScreen->areaGlowTilemap[j - 31] |= 0x40;
if (x != 0 && y != 19 && sPokedexAreaScreen->areaGlowTilemap[j + 31] != 0xFFFF)
sPokedexAreaScreen->areaGlowTilemap[j + 31] |= 0x20;
if (x != 31 && y != 19 && sPokedexAreaScreen->areaGlowTilemap[j + 33] != 0xFFFF)
sPokedexAreaScreen->areaGlowTilemap[j + 33] |= 0x80;
}
j++;
}
}
for (i = 0; i < 0x280; i++)
{
if (sPokedexAreaScreen->areaGlowTilemap[i] == 0xFFFF)
{
sPokedexAreaScreen->areaGlowTilemap[i] = 0x10;
sPokedexAreaScreen->areaGlowTilemap[i] |= 0xA000;
}
else if (sPokedexAreaScreen->areaGlowTilemap[i])
{
if (sPokedexAreaScreen->areaGlowTilemap[i] & 0x02)
sPokedexAreaScreen->areaGlowTilemap[i] &= 0xFFCF;
if (sPokedexAreaScreen->areaGlowTilemap[i] & 0x01)
sPokedexAreaScreen->areaGlowTilemap[i] &= 0xFF3F;
if (sPokedexAreaScreen->areaGlowTilemap[i] & 0x08)
sPokedexAreaScreen->areaGlowTilemap[i] &= 0xFFAF;
if (sPokedexAreaScreen->areaGlowTilemap[i] & 0x04)
sPokedexAreaScreen->areaGlowTilemap[i] &= 0xFF5F;
sPokedexAreaScreen->areaGlowTilemap[i] = sAreaGlowTilemapMapping[sPokedexAreaScreen->areaGlowTilemap[i]];
sPokedexAreaScreen->areaGlowTilemap[i] |= 0xA000;
}
}
}
static void StartAreaGlow(void)
{
if (sPokedexAreaScreen->numSpecialAreas && sPokedexAreaScreen->numOverworldAreas == 0)
sPokedexAreaScreen->whichMarkersFlashing = 1;
else
sPokedexAreaScreen->whichMarkersFlashing = 0;
sPokedexAreaScreen->areaShadeOrMarkerFrameCounter = 0;
sPokedexAreaScreen->areaShadeFrameCounter = 0;
sPokedexAreaScreen->areaShadeBldArgLo = 0;
sPokedexAreaScreen->areaShadeBldArgHi = 0x40;
sPokedexAreaScreen->specialMarkerCycleCounter = 1;
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
DoAreaGlow();
}
static void DoAreaGlow(void)
{
u16 x, y;
u16 i;
if (sPokedexAreaScreen->whichMarkersFlashing == 0)
{
if (sPokedexAreaScreen->areaShadeOrMarkerFrameCounter == 0)
{
sPokedexAreaScreen->areaShadeFrameCounter++;
if (sPokedexAreaScreen->areaShadeFrameCounter & 1)
sPokedexAreaScreen->areaShadeBldArgLo = (sPokedexAreaScreen->areaShadeBldArgLo + 4) & 0x7f;
else
sPokedexAreaScreen->areaShadeBldArgHi = (sPokedexAreaScreen->areaShadeBldArgHi + 4) & 0x7f;
x = gSineTable[sPokedexAreaScreen->areaShadeBldArgLo] >> 4;
y = gSineTable[sPokedexAreaScreen->areaShadeBldArgHi] >> 4;
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(x, y));
sPokedexAreaScreen->areaShadeOrMarkerFrameCounter = 0;
if (sPokedexAreaScreen->areaShadeFrameCounter == 0x40)
{
sPokedexAreaScreen->areaShadeFrameCounter = 0;
if (sPokedexAreaScreen->numSpecialAreas != 0)
sPokedexAreaScreen->whichMarkersFlashing = 1;
}
}
else
sPokedexAreaScreen->areaShadeOrMarkerFrameCounter--;
}
else
{
sPokedexAreaScreen->areaShadeOrMarkerFrameCounter++;
if (sPokedexAreaScreen->areaShadeOrMarkerFrameCounter > 12)
{
sPokedexAreaScreen->areaShadeOrMarkerFrameCounter = 0;
sPokedexAreaScreen->specialMarkerCycleCounter++;
for (i = 0; i < sPokedexAreaScreen->numSpecialAreas; i++)
sPokedexAreaScreen->areaMarkerSprites[i]->invisible = sPokedexAreaScreen->specialMarkerCycleCounter & 1;
if (sPokedexAreaScreen->specialMarkerCycleCounter > 4)
{
sPokedexAreaScreen->specialMarkerCycleCounter = 1;
if (sPokedexAreaScreen->numOverworldAreas != 0)
sPokedexAreaScreen->whichMarkersFlashing = 0;
}
}
}
}
void ShowPokedexAreaScreen(u16 species, u8 *errno)
{
u8 taskId;
sPokedexAreaScreen = AllocZeroed(sizeof(*sPokedexAreaScreen));
sPokedexAreaScreen->species = species;
sPokedexAreaScreen->errno = errno;
errno[0] = 0;
taskId = CreateTask(Task_PokedexAreaScreen_0, 0);
gTasks[taskId].data[0] = 0;
}
static void Task_PokedexAreaScreen_0(u8 taskId)
{
switch (gTasks[taskId].data[0])
{
case 0:
ResetSpriteData();
FreeAllSpritePalettes();
HideBg(3);
HideBg(2);
HideBg(0);
break;
case 1:
SetBgAttribute(3, BG_CTRL_ATTR_VISIBLE, 3);
sub_81C4D70(&sUnknown_085B4018);
StringFill(sPokedexAreaScreen->charBuffer, CHAR_SPACE, 16);
break;
case 2:
if (sub_81C4E90() == TRUE)
return;
sub_81C4ED0(-8);
break;
case 3:
ResetDrawAreaGlowState();
break;
case 4:
if (DrawAreaGlow())
return;
break;
case 5:
sub_8122D88(&sPokedexAreaScreen->regionMap);
CreateRegionMapPlayerIcon(1, 1);
PokedexAreaScreen_UpdateRegionMapVariablesAndVideoRegs(0, -8);
break;
case 6:
CreateAreaMarkerSprites();
break;
case 7:
LoadAreaUnknownGraphics();
break;
case 8:
CreateAreaUnknownSprites();
break;
case 9:
BeginNormalPaletteFade(0xFFFFFFEB, 0, 16, 0, RGB(0, 0, 0));
break;
case 10:
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_ALL);
StartAreaGlow();
ShowBg(2);
ShowBg(3);
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON);
break;
case 11:
gTasks[taskId].func = Task_PokedexAreaScreen_1;
gTasks[taskId].data[0] = 0;
return;
}
gTasks[taskId].data[0]++;
}
static void Task_PokedexAreaScreen_1(u8 taskId)
{
DoAreaGlow();
switch (gTasks[taskId].data[0])
{
default:
gTasks[taskId].data[0] = 0;
// fall through
case 0:
if (gPaletteFade.active)
return;
break;
case 1:
if (gMain.newKeys & B_BUTTON)
{
gTasks[taskId].data[1] = 1;
PlaySE(SE_PC_OFF);
}
else if (gMain.newKeys & DPAD_RIGHT || (gMain.newKeys & R_BUTTON && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR))
{
gTasks[taskId].data[1] = 2;
PlaySE(SE_Z_PAGE);
}
else
return;
break;
case 2:
BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 16, RGB(0, 0, 0));
break;
case 3:
if (gPaletteFade.active)
return;
DestroyAreaMarkerSprites();
sPokedexAreaScreen->errno[0] = gTasks[taskId].data[1];
sub_813D6B4();
DestroyTask(taskId);
sub_81C4EB4();
FREE_AND_SET_NULL(sPokedexAreaScreen);
return;
}
gTasks[taskId].data[0]++;
}
static void sub_813D6B4(void)
{
SetBgAttribute(3, BG_CTRL_ATTR_VISIBLE, 0);
SetBgAttribute(3, BG_CTRL_ATTR_SCREENSIZE, 0);
}
static void CreateAreaMarkerSprites(void)
{
u8 spriteId;
static IWRAM_DATA s16 x;
static IWRAM_DATA s16 y;
static IWRAM_DATA s16 i;
static IWRAM_DATA s16 mapSecId;
static IWRAM_DATA s16 numSprites;
LoadSpriteSheet(&sAreaMarkerSpriteSheet);
LoadSpritePalette(&sAreaMarkerSpritePalette);
numSprites = 0;
for (i = 0; i < sPokedexAreaScreen->numSpecialAreas; i++)
{
mapSecId = sPokedexAreaScreen->specialAreaRegionMapSectionIds[i];
x = 8 * (gRegionMapEntries[mapSecId].x + 1) + 4;
y = 8 * (gRegionMapEntries[mapSecId].y) + 28;
x += 4 * (gRegionMapEntries[mapSecId].width - 1);
y += 4 * (gRegionMapEntries[mapSecId].height - 1);
spriteId = CreateSprite(&sAreaMarkerSpriteTemplate, x, y, 0);
if (spriteId != MAX_SPRITES)
{
gSprites[spriteId].invisible = TRUE;
sPokedexAreaScreen->areaMarkerSprites[numSprites++] = &gSprites[spriteId];
}
}
sPokedexAreaScreen->numAreaMarkerSprites = numSprites;
}
static void DestroyAreaMarkerSprites(void)
{
u16 i;
FreeSpriteTilesByTag(2);
FreeSpritePaletteByTag(2);
for (i = 0; i < sPokedexAreaScreen->numAreaMarkerSprites; i++)
DestroySprite(sPokedexAreaScreen->areaMarkerSprites[i]);
FreeSpriteTilesByTag(3);
FreeSpritePaletteByTag(3);
for (i = 0; i < 3; i++)
{
if (sPokedexAreaScreen->areaUnknownSprites[i])
DestroySprite(sPokedexAreaScreen->areaUnknownSprites[i]);
}
}
static void LoadAreaUnknownGraphics(void)
{
struct SpriteSheet spriteSheet = {
.data = sPokedexAreaScreen->areaUnknownGraphicsBuffer,
.size = 0x600,
.tag = 3,
};
LZ77UnCompWram(gPokedexAreaScreenAreaUnknown_Gfx, sPokedexAreaScreen->areaUnknownGraphicsBuffer);
LoadSpriteSheet(&spriteSheet);
LoadSpritePalette(&sAreaUnknownSpritePalette);
}
static void CreateAreaUnknownSprites(void)
{
u16 i;
u8 spriteId;
if (sPokedexAreaScreen->numOverworldAreas || sPokedexAreaScreen->numSpecialAreas)
{
for (i = 0; i < 3; i++)
sPokedexAreaScreen->areaUnknownSprites[i] = NULL;
}
else
{
for (i = 0; i < 3; i++)
{
spriteId = CreateSprite(&sAreaUnknownSpriteTemplate, i * 32 + 0xa0, 0x8c, 0);
if (spriteId != MAX_SPRITES)
{
gSprites[spriteId].oam.tileNum += i * 16;
sPokedexAreaScreen->areaUnknownSprites[i] = gSprites + spriteId;
}
else
{
sPokedexAreaScreen->areaUnknownSprites[i] = NULL;
}
}
}
}

View File

@ -34,15 +34,6 @@
// Static type declarations
struct RegionMapLocation
{
u8 x;
u8 y;
u8 width;
u8 height;
const u8 *name;
};
// Static RAM declarations
static EWRAM_DATA struct RegionMap *gRegionMap = NULL;

View File

@ -4,6 +4,7 @@
#include "bg.h"
#include "malloc.h"
#include "palette.h"
#include "unk_pokedex_area_screen_helper.h"
EWRAM_DATA u8 *gUnknown_0203CF28 = NULL;
@ -13,15 +14,7 @@ static const u32 gUnknown_0861DEF4[] = INCBIN_U32("graphics/interface/region_map
static const u32 gUnknown_0861E208[] = INCBIN_U32("graphics/interface/region_map_affine.8bpp.lz");
static const u32 gUnknown_0861EF64[] = INCBIN_U32("graphics/interface/region_map_affine.bin.lz");
struct UnkStruct_1C4D70
{
u32 bg:2;
u32 unk2:8;
u32 unk10:2;
u32 unk12:20;
};
void sub_81C4D70(struct UnkStruct_1C4D70 *template)
void sub_81C4D70(const struct UnkStruct_1C4D70 *template)
{
u8 unk;
gUnknown_0203CF28 = Alloc(4);

View File

@ -34,24 +34,7 @@
.include "src/slot_machine.o"
.include "src/contest_painting.o"
.include "src/starter_choose.o"
.align 0x2
gUnknown_030011FC: @ 30011FC
.space 0x2
gUnknown_030011FE: @ 30011FE
.space 0x2
gUnknown_03001200: @ 3001200
.space 0x2
gUnknown_03001202: @ 3001202
.space 0x2
gUnknown_03001204: @ 3001204
.space 0x4
.include "src/pokedex_area_screen.o"
.include "src/battle_transition.o"
.include "src/pokemon_animation.o"
.include "src/recorded_battle.o"

View File

@ -353,10 +353,7 @@ gPlayerFacingPosition: @ 203AB40
.include "src/pokeblock.o"
.include "src/field_specials.o"
.include "src/battle_records.o"
gUnknown_0203AB7C: @ 203AB7C
.space 0x4
.include "src/pokedex_area_screen.o"
.include "src/evolution_scene.o"
gUnknown_0203AB88: @ 203AB88