Compare commits

...

8 Commits

20 changed files with 960 additions and 147 deletions

View File

@ -27,6 +27,7 @@ If you have suggestions, found bugs, or just want to talk, feel free to DM me on
* Options default to fast text speed and set battle type
* Day/Night system [by quocmanh94](https://github.com/quocmanh94/pokeemerald/commit/a0fd237009a1bd1f999e3ab25ca07508985b4435)
* Faster text speed ([ellabrella](https://www.pokecommunity.com/showpost.php?p=10400198))
* EV/IV Menu (will be accessible in the late game) (credits go to [LOuroboros](https://github.com/DizzyEggg/pokeemerald/commit/e11dac36d69b09557a63a217caa33c7e11728831) and [Acimut](https://github.com/Acimut/Custom-EV-IV-Display-Screen))
**WIP**
- Brand new region of ???????

Binary file not shown.

View File

@ -52,6 +52,19 @@
"trainer_sight_or_berry_tree_id": "0",
"script": "NULL",
"flag": "0"
},
{
"graphics_id": "OBJ_EVENT_GFX_ANABEL",
"x": 26,
"y": 7,
"elevation": 0,
"movement_type": "MOVEMENT_TYPE_NONE",
"movement_range_x": 0,
"movement_range_y": 0,
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "BudportCity_EventScript_EVIVMaster",
"flag": "0"
}
],
"warp_events": [

View File

@ -1,2 +1,28 @@
BudportCity_MapScripts::
.byte 0
BudportCity_EventScript_EVIVMaster::
msgbox BudportCity_Text_EV_IV_Master, MSGBOX_NPC
msgbox BudportCity_Text_EV_IV, MSGBOX_YESNO
goto_if_eq VAR_RESULT, YES, BudportCity_EV_IV_Menu
release
end
BudportCity_EV_IV_Menu::
special ShowEvIvScreen
release
end
BudportCity_Text_EV_IV_Master:
.string "Pokémon have hidden stats.\n"
.string "They're called EVs and IVs.\p"
.string "EVs are Effort Values. They increase\n"
.string "when you battle wild Pokémons or\l"
.string "other trainers\p"
.string "IVs are Individual Values. These are\n"
.string "set when you capture a Pokémon and\l"
.string "usually cannot be changed.$"
BudportCity_Text_EV_IV:
.string "Do you want to see your\n"
.string "Pokémons' EVs and IVs ?$"

View File

@ -536,3 +536,4 @@ gSpecials::
def_special TrySetBattleTowerLinkType
def_special SetTotemBoost
def_special TrySpecialOverworldEvo
def_special ShowEvIvScreen

View File

@ -32,8 +32,7 @@ gText_Birch_AndYouAre::
.string "And you are?$"
gText_Birch_BoyOrGirl::
.string "Are you a boy?\n"
.string "Or are you a girl?$"
.string "Who are you?$"
gText_Birch_WhatsYourName::
.string "All right.\n"

View File

@ -5,7 +5,7 @@
#define OW_RUNNING_INDOORS GEN_LATEST // In Gen4+, players are allowed to run indoors.
// Other settings
#define OW_POISON_DAMAGE GEN_LATEST // In Gen4, Pokémon no longer faint from Poison in the overworld. In Gen5+, they no longer take damage at all.
#define OW_POISON_DAMAGE GEN_4 // In Gen4, Pokémon no longer faint from Poison in the overworld. In Gen5+, they no longer take damage at all.
// PC settings
#define OW_PC_PRESS_B GEN_LATEST // In Gen4, pressing B when holding a Pokémon is equivalent to placing it. In Gen3, it gives the "You're holding a Pokémon!" error.

17
include/ev_iv_screen.h Normal file
View File

@ -0,0 +1,17 @@
#ifndef GUARD_EV_IV_SCREEN_H
#define GUARD_EV_IV_SCREEN_H
struct EvIvScreen
{
u8 state;
u8 gfxStep;
u8 callbackStep;
u8 currMon;
u16 totalAttributes[3];
u16 hatch;
u16 tilemapBuffer[0x400];
};
extern EWRAM_DATA struct EvIvScreen gEvIvScreen;
#endif // GUARD_EV_IV_SCREEN_H

View File

@ -328,6 +328,8 @@ extern const u8 gText_SaveFileErased[];
extern const u8 gText_SaveFileCorrupted[];
extern const u8 gJPText_No1MSubCircuit[];
extern const u8 gText_BatteryRunDry[];
extern const u8 gText_EmuWarning[];
extern const u8 gText_TimeWarning[];
extern const u8 gText_MainMenuNewGame[];
extern const u8 gText_MainMenuOption[];
extern const u8 gText_MainMenuContinue[];

View File

@ -345,6 +345,7 @@ SECTIONS {
src/pokemon_debug.o(.text);
src/expansion_intro.o(.text);
src/text_screen.o(.text);
src/ev_iv_screen.o(.text);
} =0
script_data :
@ -713,6 +714,7 @@ SECTIONS {
src/pokemon_debug.o(.rodata);
src/expansion_intro.o(.rodata);
src/text_screen.o(.rodata);
src/ev_iv_screen.o(.rodata);
} =0
song_data :

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

View File

@ -1,5 +1,5 @@
static const u8 sRegionMap_MapSectionLayout[MAP_HEIGHT][MAP_WIDTH] = {
{MAPSEC_NONE, MAPSEC_ROUTE_114, MAPSEC_ROUTE_114, MAPSEC_FALLARBOR_TOWN, MAPSEC_ROUTE_113, MAPSEC_ROUTE_113, MAPSEC_ROUTE_113, MAPSEC_ROUTE_113, MAPSEC_ROUTE_111, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_119, MAPSEC_FORTREE_CITY, MAPSEC_ROUTE_120, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},
{MAPSEC_BUDPORT_CITY, MAPSEC_ROUTE_114, MAPSEC_ROUTE_114, MAPSEC_FALLARBOR_TOWN, MAPSEC_ROUTE_113, MAPSEC_ROUTE_113, MAPSEC_ROUTE_113, MAPSEC_ROUTE_113, MAPSEC_ROUTE_111, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_119, MAPSEC_FORTREE_CITY, MAPSEC_ROUTE_120, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},
{MAPSEC_NONE, MAPSEC_ROUTE_114, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_MT_CHIMNEY, MAPSEC_MT_CHIMNEY, MAPSEC_ROUTE_111, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_119, MAPSEC_NONE, MAPSEC_ROUTE_120, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},
{MAPSEC_ROUTE_115, MAPSEC_ROUTE_114, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_MT_CHIMNEY, MAPSEC_MT_CHIMNEY, MAPSEC_ROUTE_111, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_119, MAPSEC_NONE, MAPSEC_ROUTE_120, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_SAFARI_ZONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE},
{MAPSEC_ROUTE_115, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_LAVARIDGE_TOWN, MAPSEC_ROUTE_112, MAPSEC_ROUTE_112, MAPSEC_ROUTE_111, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_119, MAPSEC_NONE, MAPSEC_ROUTE_120, MAPSEC_ROUTE_121, MAPSEC_ROUTE_121, MAPSEC_ROUTE_121, MAPSEC_ROUTE_121, MAPSEC_LILYCOVE_CITY, MAPSEC_LILYCOVE_CITY, MAPSEC_ROUTE_124, MAPSEC_ROUTE_124, MAPSEC_ROUTE_124, MAPSEC_ROUTE_124, MAPSEC_ROUTE_125, MAPSEC_ROUTE_125, MAPSEC_NONE, MAPSEC_NONE},

View File

@ -3,8 +3,8 @@
{
"map_section": "MAPSEC_BUDPORT_CITY",
"name": "BUDPORT CITY",
"x": 2,
"y": 2,
"x": 0,
"y": 0,
"width": 1,
"height": 1
},

View File

@ -1042,7 +1042,8 @@ static u8 Debug_CheckToggleFlags(u8 id)
result = FlagGet(FLAG_SYS_B_DASH);
break;
case DEBUG_FLAGVAR_MENU_ITEM_TOGGLE_LOCATIONS:
result = FlagGet(FLAG_VISITED_LITTLEROOT_TOWN) &&
result =FlagGet(FLAG_VISITED_BUDPORT_CITY) &&
FlagGet(FLAG_VISITED_LITTLEROOT_TOWN) &&
FlagGet(FLAG_VISITED_OLDALE_TOWN) &&
FlagGet(FLAG_VISITED_DEWFORD_TOWN) &&
FlagGet(FLAG_VISITED_LAVARIDGE_TOWN) &&
@ -1584,6 +1585,7 @@ static void DebugAction_Util_HealParty(u8 taskId)
}
static void DebugAction_Util_Fly(u8 taskId)
{
FlagSet(FLAG_VISITED_BUDPORT_CITY);
FlagSet(FLAG_VISITED_LITTLEROOT_TOWN);
FlagSet(FLAG_VISITED_OLDALE_TOWN);
FlagSet(FLAG_VISITED_DEWFORD_TOWN);
@ -2380,6 +2382,7 @@ static void DebugAction_FlagsVars_ToggleFlyFlags(u8 taskId)
{
PlaySE(SE_PC_OFF);
FlagClear(FLAG_VISITED_BUDPORT_CITY);
FlagClear(FLAG_VISITED_LITTLEROOT_TOWN);
FlagClear(FLAG_VISITED_OLDALE_TOWN);
FlagClear(FLAG_VISITED_DEWFORD_TOWN);
@ -2403,7 +2406,8 @@ static void DebugAction_FlagsVars_ToggleFlyFlags(u8 taskId)
{
PlaySE(SE_PC_LOGIN);
FlagSet(FLAG_VISITED_LITTLEROOT_TOWN);
FlagSet(FLAG_VISITED_BUDPORT_CITY);
FlagClear(FLAG_VISITED_LITTLEROOT_TOWN);
FlagSet(FLAG_VISITED_OLDALE_TOWN);
FlagSet(FLAG_VISITED_DEWFORD_TOWN);
FlagSet(FLAG_VISITED_LAVARIDGE_TOWN);

689
src/ev_iv_screen.c Normal file
View File

@ -0,0 +1,689 @@
#include "global.h"
#include "diploma.h"
#include "palette.h"
#include "main.h"
#include "gpu_regs.h"
#include "scanline_effect.h"
#include "task.h"
#include "malloc.h"
#include "decompress.h"
#include "bg.h"
#include "window.h"
#include "string_util.h"
#include "text.h"
#include "overworld.h"
#include "menu.h"
#include "pokedex.h"
#include "constants/rgb.h"
#include "ev_iv_screen.h"
#include "script.h"
#include "sound.h"
#include "party_menu.h"
#include "field_effect.h"
#include "constants/songs.h"
#include "strings.h"
#include "string_util.h"
extern void CB2_ShowEvIv(void);
extern void Task_EvIvInit(u8);
static u8 EvIvLoadGfx(void);
static void EvIvVblankHandler(void);
static void Task_WaitForExit(u8);
static void Task_EvIvReturnToOverworld(u8);
static void EvIvPrintText(struct Pokemon *mon);
static void AddColorByNature(u8 nature, u8 up1, u8 up2, u8 up3, u8 up4, u8 down1, u8 down2, u8 down3, u8 down4);
static void AddNumber(u16 num);
static void ShowPokemonPic(u16 species, u8 x, u8 y);
static void Task_ScriptShowMonPic(u8 taskId);
static void PicboxCancel2(void);
static const u32 sEvIvScreenTilemap[] = INCBIN_U32("graphics/diploma/tilemap.bin.lz");
static const u32 sEvIvScreenTiles[] = INCBIN_U32("graphics/diploma/tiles.4bpp.lz");
static const u32 sEvIvScreenPalette[] = INCBIN_U32("graphics/diploma/national.gbapal");
EWRAM_DATA struct EvIvScreen gEvIvScreen = {0};
void ShowEvIvScreen(void)
{
SetMainCallback2(CB2_ShowEvIv);
LockPlayerFieldControls();
}
static void EvIvBgInit(void)
{
ResetSpriteData();
ResetPaletteFade();
FreeAllSpritePalettes();
ResetTasks();
ScanlineEffect_Stop();
}
static void CB2_EvIv(void)
{
RunTasks();
AnimateSprites();
BuildOamBuffer();
UpdatePaletteFade();
}
void CB2_ShowEvIv(void)
{
gEvIvScreen.state = 0;
gEvIvScreen.gfxStep = 0;
gEvIvScreen.callbackStep = 0;
gEvIvScreen.currMon = 0;
EvIvBgInit();
CreateTask(Task_EvIvInit, 0);
SetMainCallback2(CB2_EvIv);
}
static const struct BgTemplate plantilaBG[] = {
{
.bg = 0,
.charBaseIndex = 0,
.mapBaseIndex = 12,
.screenSize = 0, // 0 = 256x256; 1 = 512x256; 2 = 256x51
.paletteMode = 0,
.priority = 0,
.baseTile = 1,
},
{
.bg = 1,
.charBaseIndex = 2,
.mapBaseIndex = 22,
.screenSize = 0, // 0 = 256x256; 1 = 512x256; 2 = 256x51
.paletteMode = 0,
.priority = 2,
.baseTile = 0,
},
};
#define SCREEN_WIDTH 17
#define SCREEN_HEIGHT 11
#define SCREEN2_WIDTH 29
#define SCREEN2_HEIGHT 2
static const struct WindowTemplate plantilaWindow[] = {
{
.bg = 0,
.tilemapLeft = 2,
.tilemapTop = 4,
.width = SCREEN_WIDTH,
.height = SCREEN_HEIGHT,
.paletteNum = 15,
.baseBlock = 0x000
},
{
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 2,
.width = SCREEN2_WIDTH,
.height = SCREEN2_HEIGHT,
.paletteNum = 15,
.baseBlock = SCREEN_WIDTH * SCREEN_HEIGHT //(width * height) + baseBlock del WindowTemplate anterior
},
{
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 15,
.width = 29,
.height = 5,
.paletteNum = 15,
.baseBlock = SCREEN2_WIDTH * SCREEN2_HEIGHT + (SCREEN_WIDTH * SCREEN_HEIGHT)
},
DUMMY_WIN_TEMPLATE,
};
static void VCBC_EvIvOam(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
void Task_EvIvInit(u8 taskId)
{
switch (gEvIvScreen.callbackStep)
{
case 0:
SetVBlankCallback(NULL);
break;
case 1:
EvIvVblankHandler();
break;
case 2:
if (!EvIvLoadGfx())
return;
break;
case 3:
CopyToBgTilemapBuffer(1, sEvIvScreenTilemap, 0, 0);
break;
case 4:
SetGpuReg(REG_OFFSET_BG1HOFS, 0);
break;
case 5:
EvIvPrintText(&gPlayerParty[gEvIvScreen.currMon]);
break;
case 6:
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(1);
break;
case 7:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
break;
case 8:
SetVBlankCallback(VCBC_EvIvOam);
break;
default:
if (gPaletteFade.active)
break;
gTasks[taskId].func = Task_WaitForExit;
}
gEvIvScreen.callbackStep++;
}
static void Task_WaitForExit(u8 taskId)
{
switch (gEvIvScreen.state)
{
case 0:
PlaySE(SE_CARD);
gEvIvScreen.state++;
break;
case 1:
if (JOY_NEW(DPAD_DOWN) && gPlayerPartyCount > 1)
{
PlaySE(SE_SELECT);
if (gEvIvScreen.currMon == (gPlayerPartyCount - 1))
gEvIvScreen.currMon = 0;
else
gEvIvScreen.currMon++;
PicboxCancel2();
EvIvPrintText(&gPlayerParty[gEvIvScreen.currMon]);
}
if (JOY_NEW(DPAD_UP) && gPlayerPartyCount > 1)
{
PlaySE(SE_SELECT);
if (gEvIvScreen.currMon == 0)
gEvIvScreen.currMon = (gPlayerPartyCount - 1);
else
gEvIvScreen.currMon--;
PicboxCancel2();
EvIvPrintText(&gPlayerParty[gEvIvScreen.currMon]);
}
if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON))
{
PlaySE(SE_CARD);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
gEvIvScreen.state++;
}
break;
case 2:
Task_EvIvReturnToOverworld(taskId);
break;
}
}
static void Task_EvIvReturnToOverworld(u8 taskId)
{
if (gPaletteFade.active)
return;
DestroyTask(taskId);
FreeAllWindowBuffers();
SetMainCallback2(CB2_ReturnToField);
}
static void EvIvVblankHandler(void)
{
void *vram = (void *)VRAM;
DmaClearLarge16(3, vram, VRAM_SIZE, 0x1000);
DmaClear32(3, (void *)OAM, OAM_SIZE);
DmaClear16(3, (void *)PLTT, PLTT_SIZE);
SetGpuReg(REG_OFFSET_DISPCNT, 0);
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, plantilaBG, 2);
ChangeBgX(0, 0, 0);
ChangeBgY(0, 0, 0);
ChangeBgX(1, 0, 0);
ChangeBgY(1, 0, 0);
ChangeBgX(2, 0, 0);
ChangeBgY(2, 0, 0);
ChangeBgX(3, 0, 0);
ChangeBgY(3, 0, 0);
InitWindows(plantilaWindow);
DeactivateAllTextPrinters();
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
SetBgTilemapBuffer(1, gEvIvScreen.tilemapBuffer);
ShowBg(0);
ShowBg(1);
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20);
}
static u8 EvIvLoadGfx(void)
{
switch (gEvIvScreen.gfxStep)
{
case 0:
ResetTempTileDataBuffers();
break;
case 1:
DecompressAndCopyTileDataToVram(1, sEvIvScreenTiles, 0, 0, 0);
break;
case 2:
if (!(FreeTempTileDataBuffersIfPossible() == 1))
break;
return 0;
case 3:
LoadPalette(sEvIvScreenPalette, 0x10, 0x20);
default:
return 1;
}
gEvIvScreen.gfxStep++;
return 0;
}
/**
* Parámetro 'u8 color' en AddTextPrinterParameterized3 que
* define el color que tendrá el texto a imprimir, usando los
* colores de la paleta de la ventana de la siguiente manera:
* static const ALIGNED(4) u8 COLOR[3] = {FONDO, FUENTE, SOMBRA};
* -----Colores PAL14 y PAL15----- (0=transparente)
* 1=blanco 2=negro 3=gris
* 4=rojo 5=rojo claro 6=verde
* 7=verde claro 8=azul 9=azul claro
*/
static const ALIGNED(4) u8 sBlackTextColor[3] = {0, 2, 3}; //paleta 15 usada en plantilaWindow
static const ALIGNED(4) u8 sGreyTextColor[3] = {0, 3, 2}; //paleta 15 usada en plantilaWindow
/**
* COLOR_HIGHLIGHT_SHADOW = FC 04 @ takes 3 bytes
* Cambio de color en línea de texto, FC 04 + 3 bytes.
* Son bytes de texto que el juego interpreta como cambio de color
* en el párrafo durante la impresión del texto, reemplaza el color
* de la fuente del texto que le precede, usando los colores de la
* paleta de la ventana, se configura de la siguiene manera:
* static const u8 color[] = {0xFC, 0x04, fuente, fondo, sombra, 0xFF};
* Es concatenado antes del texto a cambiar de color.
*/
static const u8 sBlackColor[] = {0xFC, 0x04, 0x02, 0x00, 0x03, 0xFF}; // Colors based on the Palette 15 used in WindowTemplate
static const u8 sBlueColor[] = {0xFC, 0x04, 0x08, 0x00, 0x03, 0xFF};
static const u8 sRedColor[] = {0xFC, 0x04, 0x04, 0x00, 0x03, 0xFF};
static const u8 sText_TwoEmptySpaces[] = _(" ");
static const u8 sText_Newline[] = _("\n");
static const u8 sText_BsEvIv[] = _(" BS EV IV"); // Base Stats, Effort Values, Individual Values
static const u8 sText_Your[] = _("Your ");
static const u8 sText_Is[] = _(" is ");
static const u8 sText_Happy[] = _("% happy!");
static const u8 sText_LessThan[] = _("Less than ");
static const u8 sText_StepsLeftToHatch[] = _(" steps left to hatch!");
// This function prints all the juicy information on the screen.
// We're taking advantage of the big space allocated for gStringVar4
// to fit all of our text in it before actually printing it.
static void EvIvPrintText(struct Pokemon *mon)
{
u8 temp = 0;
u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
u8 nature = GetNature(mon);
u8 isEgg = GetMonData(mon, MON_DATA_IS_EGG, NULL);
FillWindowPixelBuffer(0, 0);
FillWindowPixelBuffer(1, 0);
FillWindowPixelBuffer(2, 0);
// Print the party slot of the species that is currently being checked.
temp = gEvIvScreen.currMon + 1;
ConvertIntToDecimalStringN(gStringVar4, temp, 2, 1);
StringAppend(gStringVar4, gText_Slash);
temp = gPlayerPartyCount;
ConvertIntToDecimalStringN(gStringVar1, temp, 2, 1);
StringAppend(gStringVar4, gStringVar1);
AddTextPrinterParameterized3(1, 2, 12, 2, sGreyTextColor, 0, gStringVar4);
// Print "BS EV IV" on screen followed by the name/nickname of the species.
// If what's currently being checked is a Pokémon Egg, it'll only display that string.
if (!isEgg)
{
StringCopy(gStringVar4, sText_BsEvIv); // StringCopy can be used to reset the contents of gStringVar4.
StringAppend(gStringVar4, sText_TwoEmptySpaces);
StringAppend(gStringVar4, sText_TwoEmptySpaces);
StringAppend(gStringVar4, sText_TwoEmptySpaces);
StringAppend(gStringVar4, sText_TwoEmptySpaces);
StringAppend(gStringVar4, sText_TwoEmptySpaces);
StringAppend(gStringVar4, gText_Space);
GetMonNickname(mon, gStringVar1);
StringAppend(gStringVar4, gStringVar1);
AddTextPrinterParameterized3(1, 2, 68, 2, sGreyTextColor, 0, gStringVar4);
}
else
{
StringCopy(gStringVar4, sText_TwoEmptySpaces);
StringAppend(gStringVar4, sText_TwoEmptySpaces);
StringAppend(gStringVar4, sText_TwoEmptySpaces);
StringAppend(gStringVar4, gText_Space);
StringAppend(gStringVar4, gText_Pokemon);
StringAppend(gStringVar4, gText_Space);
GetMonNickname(mon, gStringVar1);
StringAppend(gStringVar4, gStringVar1);
AddTextPrinterParameterized3(1, 2, 128, 2, sGreyTextColor, 0, gStringVar4);
}
// Print the different stats' names on screen, unless what's currently being checked is a Pokémon Egg.
if (!isEgg)
{
StringCopy(gStringVar4, gText_HP3);
StringAppend(gStringVar4, sText_Newline);
AddColorByNature(nature, 1, 2, 3, 4, 5, 10, 15, 20);
StringAppend(gStringVar4, gText_Attack);
StringAppend(gStringVar4, sText_Newline);
AddColorByNature(nature, 5, 7, 8, 9, 1, 11, 16, 21);
StringAppend(gStringVar4, gText_Defense);
StringAppend(gStringVar4, sText_Newline);
AddColorByNature(nature, 15, 16, 17, 19, 3, 8, 13, 23);
StringAppend(gStringVar4, gText_SpAtk);
StringAppend(gStringVar4, sText_Newline);
AddColorByNature(nature, 20, 21, 22, 23, 4, 9, 14, 19);
StringAppend(gStringVar4, gText_SpDef);
StringAppend(gStringVar4, sText_Newline);
AddColorByNature(nature, 10, 11, 13, 14, 2, 7, 17, 22);
StringAppend(gStringVar4, gText_Speed);
AddTextPrinterParameterized3(0, 2, 4, 3, sBlackTextColor, 0, gStringVar4);
}
// Print a Pokémon's stats on screen. If what's currently being checked is a Pokémon Egg, nothing gets printed.
if (!isEgg)
{
// HP Stat
temp = gSpeciesInfo[species].baseHP; // Base HP
gEvIvScreen.totalAttributes[0] = temp;
if (temp < 10)
{
StringCopy(gStringVar4, sText_TwoEmptySpaces);
ConvertIntToDecimalStringN(gStringVar2, temp, STR_CONV_MODE_RIGHT_ALIGN, 1); // 1 digit
StringAppend(gStringVar4, gStringVar2);
}
else if (temp < 100)
{
StringCopy(gStringVar4, gText_Space);
ConvertIntToDecimalStringN(gStringVar2, temp, STR_CONV_MODE_RIGHT_ALIGN, 2); // 2 digits
StringAppend(gStringVar4, gStringVar2);
}
else
{
ConvertIntToDecimalStringN(gStringVar4, temp, STR_CONV_MODE_RIGHT_ALIGN, 3); // 3 digits
}
StringAppend(gStringVar4, sText_TwoEmptySpaces);
temp = GetMonData(mon, MON_DATA_HP_EV, NULL); // HP Effort Values
gEvIvScreen.totalAttributes[1] = temp;
AddNumber(temp);
StringAppend(gStringVar4, gText_Space);
temp = GetMonData(mon, MON_DATA_HP_IV, NULL); // HP Individual Values
gEvIvScreen.totalAttributes[2] = temp;
AddNumber(temp);
StringAppend(gStringVar4, sText_Newline);
// Attack Stat
temp = gSpeciesInfo[species].baseAttack; // Base Attack
gEvIvScreen.totalAttributes[0] += temp;
AddNumber(temp);
StringAppend(gStringVar4, sText_TwoEmptySpaces);
temp = GetMonData(mon, MON_DATA_ATK_EV, NULL); // Attack Effort Values
AddNumber(temp);
gEvIvScreen.totalAttributes[1] += temp;
StringAppend(gStringVar4, gText_Space);
AddColorByNature(nature, 1, 2, 3, 4, 5, 10, 15, 20);
temp = GetMonData(mon, MON_DATA_ATK_IV, NULL); // Attack Individual Values
gEvIvScreen.totalAttributes[2] += temp;
AddNumber(temp);
StringAppend(gStringVar4, sText_Newline);
// Defense Stat
StringAppend(gStringVar4, sBlackColor);
temp = gSpeciesInfo[species].baseDefense; // Base Defense
gEvIvScreen.totalAttributes[0] += temp;
AddNumber(temp);
StringAppend(gStringVar4, sText_TwoEmptySpaces);
temp = GetMonData(mon, MON_DATA_DEF_EV, NULL); // Defense Effort Values
gEvIvScreen.totalAttributes[1] += temp;
AddNumber(temp);
StringAppend(gStringVar4, gText_Space);
AddColorByNature(nature, 5, 7, 8, 9, 1, 11, 16, 21);
temp = GetMonData(mon, MON_DATA_DEF_IV, NULL); // Defense Individual Values
gEvIvScreen.totalAttributes[2] += temp;
AddNumber(temp);
StringAppend(gStringVar4, sText_Newline);
// Sp. Atk. Stat
StringAppend(gStringVar4, sBlackColor);
temp = gSpeciesInfo[species].baseSpAttack; // Base Sp. Atk.
gEvIvScreen.totalAttributes[0] += temp;
AddNumber(temp);
StringAppend(gStringVar4, sText_TwoEmptySpaces);
temp = GetMonData(mon, MON_DATA_SPATK_EV, NULL); // Sp. Atk. Effort Values
gEvIvScreen.totalAttributes[1] += temp;
AddNumber(temp);
StringAppend(gStringVar4, gText_Space);
AddColorByNature(nature, 15, 16, 17, 19, 3, 8, 13, 23);
temp = GetMonData(mon, MON_DATA_SPATK_IV, NULL); // Sp. Atk. Individual Values
gEvIvScreen.totalAttributes[2] += temp;
AddNumber(temp);
StringAppend(gStringVar4, sText_Newline);
// Sp. Def. stat
StringAppend(gStringVar4, sBlackColor);
temp = gSpeciesInfo[species].baseSpDefense; // Base Sp. Def.
gEvIvScreen.totalAttributes[0] += temp;
AddNumber(temp);
StringAppend(gStringVar4, sText_TwoEmptySpaces);
temp = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); // Sp. Def. Effort Values
gEvIvScreen.totalAttributes[1] += temp;
AddNumber(temp);
StringAppend(gStringVar4, gText_Space);
AddColorByNature(nature, 20, 21, 22, 23, 4, 9, 14, 19);
temp = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); // Sp. Def. Individual Values
gEvIvScreen.totalAttributes[2] += temp;
AddNumber(temp);
StringAppend(gStringVar4, sText_Newline);
// Speed Stat
StringAppend(gStringVar4, sBlackColor);
temp = gSpeciesInfo[species].baseSpeed; // Base Speed Stat
gEvIvScreen.totalAttributes[0] += temp;
AddNumber(temp);
StringAppend(gStringVar4, sText_TwoEmptySpaces);
temp = GetMonData(mon, MON_DATA_SPEED_EV, NULL); // Speed Effort Values
gEvIvScreen.totalAttributes[1] += temp;
AddNumber(temp);
StringAppend(gStringVar4, gText_Space);
AddColorByNature(nature, 10, 11, 13, 14, 2, 7, 17, 22);
temp = GetMonData(mon, MON_DATA_SPEED_IV, NULL); // Speed Individual Values
gEvIvScreen.totalAttributes[2] += temp;
AddNumber(temp);
AddTextPrinterParameterized3(0, 2, 54, 3, sBlackTextColor, 0, gStringVar4);
}
else
{
StringCopy(gStringVar4, gText_EmptyString2);
AddTextPrinterParameterized3(0, 2, 54, 3, sBlackTextColor, 0, gStringVar4);
}
// Friendship / Egg Cycles
if (!isEgg)
{
StringCopy(gStringVar4, sText_TwoEmptySpaces);
StringAppend(gStringVar4, gText_Total);
StringAppend(gStringVar4, gText_Colon2);
StringAppend(gStringVar4, gText_Space);
StringAppend(gStringVar4, sText_TwoEmptySpaces);
StringAppend(gStringVar4, sText_TwoEmptySpaces);
StringAppend(gStringVar4, sText_TwoEmptySpaces);
StringAppend(gStringVar4, sText_TwoEmptySpaces);
StringAppend(gStringVar4, gText_Space);
AddNumber(gEvIvScreen.totalAttributes[0]); // Total sum of Base Stats
StringAppend(gStringVar4, sText_TwoEmptySpaces);
AddNumber(gEvIvScreen.totalAttributes[1]); // Total sum of Effort Values
StringAppend(gStringVar4, gText_Space);
AddNumber(gEvIvScreen.totalAttributes[2]); // Total sum of Individual Values
AddTextPrinterParameterized3(2, 2, 6, 0, sBlackTextColor, 0, gStringVar4);
}
// Adds "Your Pokémon is X% happy!"
if (!isEgg)
{
StringCopy(gStringVar4, sText_Newline);
StringAppend(gStringVar4, sText_TwoEmptySpaces);
StringAppend(gStringVar4, sText_Your);
GetSpeciesName(species);
StringAppend(gStringVar4, gStringVar1);
StringAppend(gStringVar4, sText_Is);
temp = (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) * 100) / 0xFF;
AddNumber(temp);
StringAppend(gStringVar4, sText_Happy);
AddTextPrinterParameterized3(2, 2, 6, 0, sBlackTextColor, 0, gStringVar4);
}
else
{
StringAppend(gStringVar4, sText_TwoEmptySpaces);
StringAppend(gStringVar4, sText_LessThan);
gEvIvScreen.hatch = ((GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) + 1) * 0xFF);
if (gEvIvScreen.hatch < 10)
ConvertIntToDecimalStringN(gStringVar2, gEvIvScreen.hatch, 2, 1);
else if (gEvIvScreen.hatch < 100)
ConvertIntToDecimalStringN(gStringVar2, gEvIvScreen.hatch, 2, 2);
else if (gEvIvScreen.hatch < 1000)
ConvertIntToDecimalStringN(gStringVar2, gEvIvScreen.hatch, 2, 3);
else if (gEvIvScreen.hatch < 10000)
ConvertIntToDecimalStringN(gStringVar2, gEvIvScreen.hatch, 2, 4);
else
ConvertIntToDecimalStringN(gStringVar2, gEvIvScreen.hatch, 2, 5);
StringAppend(gStringVar4, gStringVar2);
StringAppend(gStringVar4, sText_StepsLeftToHatch);
AddTextPrinterParameterized3(2, 2, 2, 4, sBlackTextColor, 0, gStringVar4);
}
// Print the windows containing the different text strings on screen.
PutWindowTilemap(0);
PutWindowTilemap(1);
PutWindowTilemap(2);
// Print the species sprite on screen and play their cry.
// If a Pokémon Egg is being checked, simply print SPECIES_EGG's sprite.
if (!isEgg)
{
ShowPokemonPic(species, 18, 5);// X and Y are calculated by tiles (number * 8 pixels) in BG0
PlayCry_Normal(species, 0);
}
else
{
ShowPokemonPic(SPECIES_EGG, 18, 5);
}
}
static void PicboxCancel2(void)
{
u8 taskId = FindTaskIdByFunc(Task_ScriptShowMonPic);
struct Task * task;
if (taskId != 0xFF)
{
task = &gTasks[taskId];
switch (task->data[0])
{
case 0:
case 1:
case 2:
FreeResourcesAndDestroySprite(&gSprites[task->data[2]], task->data[2]);
DestroyTask(taskId);
break;
case 3:
DestroyTask(taskId);
break;
}
}
}
static void Task_ScriptShowMonPic(u8 taskId)
{
struct Task * task = &gTasks[taskId];
switch (task->data[0])
{
case 0:
task->data[0]++;
break;
case 1:
break;
case 2:
FreeResourcesAndDestroySprite(&gSprites[task->data[2]], task->data[2]);
task->data[0]++;
break;
case 3:
DestroyTask(taskId);
break;
}
}
static void ShowPokemonPic(u16 species, u8 x, u8 y)
{
u8 spriteId;
u8 taskId;
spriteId = CreateMonSprite_PicBox(species, 8 * x + 40, 8 * y + 40, FALSE);
taskId = CreateTask(Task_ScriptShowMonPic, 80);
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = species;
gTasks[taskId].data[2] = spriteId;
gSprites[spriteId].callback = SpriteCallbackDummy;
gSprites[spriteId].oam.priority = 0;
}
static void AddColorByNature (u8 nature, u8 up1, u8 up2, u8 up3, u8 up4, u8 down1, u8 down2, u8 down3, u8 down4)
{
if (nature == up1 || nature == up2 || nature == up3 || nature == up4)
StringCopy(gStringVar3, sRedColor);
else if (nature == down1 || nature == down2 || nature == down3 || nature == down4)
StringCopy(gStringVar3, sBlueColor);
else
StringCopy(gStringVar3, sBlackColor);
StringAppend(gStringVar4, gStringVar3);
}
// Converts numbers to text. If the number is smaller than 100 it fills with empty spaces to align the numbers to the right.
static void AddNumber(u16 num)
{
if (num < 10)
{
StringCopy(gStringVar3, sText_TwoEmptySpaces);
StringAppend(gStringVar4, gStringVar3);
ConvertIntToDecimalStringN(gStringVar2, num, STR_CONV_MODE_RIGHT_ALIGN, 1);
}
else if (num < 100)
{
StringCopy(gStringVar3, gText_Space);
StringAppend(gStringVar4, gStringVar3);
ConvertIntToDecimalStringN(gStringVar2, num, STR_CONV_MODE_RIGHT_ALIGN, 2);
}
else if (num < 1000)
{
ConvertIntToDecimalStringN(gStringVar2, num, STR_CONV_MODE_RIGHT_ALIGN, 3);
}
else if (num < 10000)
{
ConvertIntToDecimalStringN(gStringVar2, num, STR_CONV_MODE_RIGHT_ALIGN, 4);
}
else
{
ConvertIntToDecimalStringN(gStringVar2, num, STR_CONV_MODE_RIGHT_ALIGN, 5);
}
StringAppend(gStringVar4, gStringVar2);
}

View File

@ -179,6 +179,7 @@ static u8 sBirchSpeechMainTaskId;
static u32 InitMainMenu(bool8);
static void Task_MainMenuCheckSaveFile(u8);
static void Task_MainMenuCheckBattery(u8);
static bool8 IsAccurateGBA(void);
static void Task_WaitForSaveFileErrorWindow(u8);
static void CreateMainMenuErrorWindow(const u8 *);
static void ClearMainMenuWindowTilemap(const struct WindowTemplate *);
@ -702,8 +703,19 @@ static void Task_WaitForSaveFileErrorWindow(u8 taskId)
}
}
static bool8 IsAccurateGBA(void) { // tests to see whether running on either an accurate emulator in >=2020, or real hardware
u32 code[5] = {0xFF1EE12F, 0xE1DF00B0, 0xE12FFF1E, 0xAAAABBBB, 0xCCCCDDDD}; // ARM: _;ldrh r0, [pc];bx lr
u32 func = (u32) &code[0];
if (func & 3) // not word aligned; safer to just return false here
return FALSE;
func = (func & ~3) | 0x2; // misalign PC to test PC-relative loading
return ((u32 (*)(void)) func)() == code[3] >> 16;
}
static void Task_MainMenuCheckBattery(u8 taskId)
{
s16 *data = gTasks[taskId].data;
if (!gPaletteFade.active)
{
SetGpuReg(REG_OFFSET_WIN0H, 0);
@ -716,8 +728,22 @@ static void Task_MainMenuCheckBattery(u8 taskId)
if (!(RtcGetErrorStatus() & RTC_ERR_FLAG_MASK))
{
if (tMenuType != HAS_NO_SAVED_GAME)
RtcCalcLocalTime();
if (!IsAccurateGBA()) {
CreateMainMenuErrorWindow(gText_EmuWarning);
gTasks[taskId].func = Task_WaitForBatteryDryErrorWindow;
// save exists and stored day count is more than a day ahead of RTC
} else if (tMenuType != HAS_NO_SAVED_GAME && VarGet(VAR_DAYS) > gLocalTime.days + 1) {
// Reset days var to today + 1
// Allowing daily events to happen again in a day
VarSet(VAR_DAYS, gLocalTime.days + 1);
CreateMainMenuErrorWindow(gText_TimeWarning);
gTasks[taskId].func = Task_WaitForBatteryDryErrorWindow;
} else {
gTasks[taskId].func = Task_DisplayMainMenu;
}
}
else
{
CreateMainMenuErrorWindow(gText_BatteryRunDry);

View File

@ -1859,6 +1859,35 @@ static void CreateFlyDestIcons(void)
x = (x + MAPCURSOR_X_MIN) * 8 + 4;
y = (y + MAPCURSOR_Y_MIN) * 8 + 4;
if (width == 2)
shape = SPRITE_SHAPE(16x8);
else if (height == 2)
shape = SPRITE_SHAPE(8x16);
else
shape = SPRITE_SHAPE(8x8);
spriteId = CreateSprite(&sFlyDestIconSpriteTemplate, x, y, 10);
if (spriteId != MAX_SPRITES)
{
gSprites[spriteId].oam.shape = shape;
if (FlagGet(canFlyFlag))
gSprites[spriteId].callback = SpriteCB_FlyDestIcon;
else
shape += 3;
StartSpriteAnim(&gSprites[spriteId], shape);
gSprites[spriteId].sIconMapSec = mapSecId;
}
canFlyFlag++;
}
canFlyFlag = FLAG_VISITED_BUDPORT_CITY;
for (mapSecId = MAPSEC_BUDPORT_CITY; mapSecId <= MAPSEC_BUDPORT_CITY; mapSecId++)
{
GetMapSecDimensions(mapSecId, &x, &y, &width, &height);
x = (x + MAPCURSOR_X_MIN) * 8 + 4;
y = (y + MAPCURSOR_Y_MIN) * 8 + 4;
if (width == 2)
shape = SPRITE_SHAPE(16x8);
else if (height == 2)

View File

@ -18,24 +18,27 @@ const u8 gText_ExpandedPlaceholder_Kyogre[] = _("KYOGRE");
const u8 gText_ExpandedPlaceholder_Groudon[] = _("GROUDON");
const u8 gText_ExpandedPlaceholder_Brendan[] = _("BRENDAN");
const u8 gText_ExpandedPlaceholder_May[] = _("MAY");
const u8 gText_EggNickname[] = _("EGG");
const u8 gText_Pokemon[] = _("POKéMON");
const u8 gText_EggNickname[] = _("Egg");
const u8 gText_Pokemon[] = _("Pokémon");
const u8 gText_ProfBirchMatchCallName[] = _("PROF. BIRCH");
const u8 gText_MainMenuNewGame[] = _("NEW GAME");
const u8 gText_MainMenuContinue[] = _("CONTINUE");
const u8 gText_MainMenuOption[] = _("OPTION");
const u8 gText_MainMenuMysteryGift[] = _("MYSTERY GIFT");
const u8 gText_MainMenuMysteryGift2[] = _("MYSTERY GIFT");
const u8 gText_MainMenuMysteryEvents[] = _("MYSTERY EVENTS");
const u8 gText_MainMenuNewGame[] = _("New Game");
const u8 gText_MainMenuContinue[] = _("Continue");
const u8 gText_MainMenuOption[] = _("Option");
const u8 gText_MainMenuMysteryGift[] = _("Mystery Gift");
const u8 gText_MainMenuMysteryGift2[] = _("Mystery Gift");
const u8 gText_MainMenuMysteryEvents[] = _("Mystery Events");
const u8 gText_WirelessNotConnected[] = _("The Wireless Adapter is not\nconnected.");
const u8 gText_MysteryGiftCantUse[] = _("MYSTERY GIFT can't be used while\nthe Wireless Adapter is attached.");
const u8 gText_MysteryEventsCantUse[] = _("MYSTERY EVENTS can't be used while\nthe Wireless Adapter is attached.");
const u8 gText_MysteryGiftCantUse[] = _("Mystery Gift can't be used while\nthe Wireless Adapter is attached.");
const u8 gText_MysteryEventsCantUse[] = _("Mystery Events can't be used while\nthe Wireless Adapter is attached.");
const u8 gText_UpdatingSaveExternalData[] = _("Updating save file using external\ndata. Please wait."); // Unused
const u8 gText_SaveFileUpdated[] = _("The save file has been updated."); // Unused
const u8 gText_SaveFileCorrupted[] = _("The save file is corrupted. The\nprevious save file will be loaded.");
const u8 gText_SaveFileErased[] = _("The save file has been erased\ndue to corruption or damage.");
const u8 gJPText_No1MSubCircuit[] = _("1Mサブきばんが ささっていません!");
const u8 gText_BatteryRunDry[] = _("The internal battery has run dry.\nThe game can be played.\pHowever, clock-based events will\nno longer occur.");
const u8 gText_EmuWarning[] = _("Inaccurate emulator detected.\nYou should use a recent emulator with\nsupport for RTC (Real Time Clock).\nThe game should still work, but\nyou may encouter errors");
const u8 gText_TimeWarning[] = _("Real Time Clock is more than 1 day\nbehind saved time.\nPlease don't tamper with the RTC, as it may\nbreak some functionnality");
const u8 gText_Player[] = _("PLAYER"); // Unused
const u8 gText_Pokedex[] = _("POKéDEX"); // Unused
const u8 gText_Time[] = _("TIME");
@ -97,40 +100,40 @@ const u8 gText_DefaultNameLillie[] = _("LILLIE");
const u8 gText_DefaultNameTerra[] = _("TERRA");
const u8 gText_DefaultNameLucy[] = _("LUCY");
const u8 gText_DefaultNameHalie[] = _("HALIE");
const u8 gText_ThisIsAPokemon[] = _("This is what we call a “POKéMON.”{PAUSE 96}\p");
const u8 gText_5MarksPokemon[] = _("????? POKéMON");
const u8 gText_ThisIsAPokemon[] = _("This is what we call a “Pokémon.”{PAUSE 96}\p");
const u8 gText_5MarksPokemon[] = _("????? Pokémon");
const u8 gText_UnkHeight[] = _("{CLEAR_TO 0x0C}??'??”");
const u8 gText_UnkWeight[] = _("????.? lbs.");
const u8 gText_EmptyPkmnCategory[] = _(" POKéMON"); // Unused
const u8 gText_EmptyPkmnCategory[] = _(" Pokémon"); // Unused
const u8 gText_EmptyHeight[] = _("{CLEAR_TO 0x0C} ' ”"); // Unused
const u8 gText_EmptyWeight[] = _(" . lbs."); // Unused
const u8 gText_EmptyPokedexInfo1[] = _(""); // Unused
const u8 gText_CryOf[] = _("CRY OF");
const u8 gText_EmptyPokedexInfo2[] = _(""); // Unused
const u8 gText_SizeComparedTo[] = _("SIZE COMPARED TO ");
const u8 gText_PokedexRegistration[] = _("POKéDEX registration completed.");
const u8 gText_PokedexRegistration[] = _("Pokédex registration completed.");
const u8 gText_HTHeight[] = _("HT");
const u8 gText_WTWeight[] = _("WT");
const u8 gText_SearchingPleaseWait[] = _("Searching…\nPlease wait.");
const u8 gText_SearchCompleted[] = _("Search completed.");
const u8 gText_NoMatchingPkmnWereFound[] = _("No matching POKéMON were found.");
const u8 gText_SearchForPkmnBasedOnParameters[] = _("Search for POKéMON based on\nselected parameters.");
const u8 gText_SwitchPokedexListings[] = _("Switch POKéDEX listings.");
const u8 gText_ReturnToPokedex[] = _("Return to the POKéDEX.");
const u8 gText_SelectPokedexMode[] = _("Select the POKéDEX mode.");
const u8 gText_SelectPokedexListingMode[] = _("Select the POKéDEX listing mode.");
const u8 gText_NoMatchingPkmnWereFound[] = _("No matching Pokémon were found.");
const u8 gText_SearchForPkmnBasedOnParameters[] = _("Search for Pokémon based on\nselected parameters.");
const u8 gText_SwitchPokedexListings[] = _("Switch Pokédex listings.");
const u8 gText_ReturnToPokedex[] = _("Return to the Pokédex.");
const u8 gText_SelectPokedexMode[] = _("Select the Pokédex mode.");
const u8 gText_SelectPokedexListingMode[] = _("Select the Pokédex listing mode.");
const u8 gText_ListByFirstLetter[] = _("List by the first letter in the name.\nSpotted POKéMON only.");
const u8 gText_ListByBodyColor[] = _("List by body color.\nSpotted POKéMON only.");
const u8 gText_ListByType[] = _("List by type.\nOwned POKéMON only.");
const u8 gText_ListByBodyColor[] = _("List by body color.\nSpotted Pokémon only.");
const u8 gText_ListByType[] = _("List by type.\nOwned Pokémon only.");
const u8 gText_ExecuteSearchSwitch[] = _("Execute search/switch.");
const u8 gText_DexHoennTitle[] = _("HOENN DEX");
const u8 gText_DexNatTitle[] = _("NATIONAL DEX");
const u8 gText_DexSortNumericalTitle[] = _("NUMERICAL MODE");
const u8 gText_DexSortAtoZTitle[] = _("A TO Z MODE");
const u8 gText_DexSortHeaviestTitle[] = _("HEAVIEST MODE");
const u8 gText_DexSortLightestTitle[] = _("LIGHTEST MODE");
const u8 gText_DexSortTallestTitle[] = _("TALLEST MODE");
const u8 gText_DexSortSmallestTitle[] = _("SMALLEST MODE");
const u8 gText_DexHoennTitle[] = _("Hoenn Dex");
const u8 gText_DexNatTitle[] = _("National Dex");
const u8 gText_DexSortNumericalTitle[] = _("Numerical Mode");
const u8 gText_DexSortAtoZTitle[] = _("A To Z Mode");
const u8 gText_DexSortHeaviestTitle[] = _("Heaviest Mode");
const u8 gText_DexSortLightestTitle[] = _("Lightest Mode");
const u8 gText_DexSortTallestTitle[] = _("Tallest Mode");
const u8 gText_DexSortSmallestTitle[] = _("Smallest Mode");
const u8 gText_DexSearchAlphaABC[] = _("ABC");
const u8 gText_DexSearchAlphaDEF[] = _("DEF");
const u8 gText_DexSearchAlphaGHI[] = _("GHI");
@ -140,31 +143,31 @@ const u8 gText_DexSearchAlphaPQR[] = _("PQR");
const u8 gText_DexSearchAlphaSTU[] = _("STU");
const u8 gText_DexSearchAlphaVWX[] = _("VWX");
const u8 gText_DexSearchAlphaYZ[] = _("YZ");
const u8 gText_DexSearchColorRed[] = _("RED");
const u8 gText_DexSearchColorBlue[] = _("BLUE");
const u8 gText_DexSearchColorYellow[] = _("YELLOW");
const u8 gText_DexSearchColorGreen[] = _("GREEN");
const u8 gText_DexSearchColorBlack[] = _("BLACK");
const u8 gText_DexSearchColorBrown[] = _("BROWN");
const u8 gText_DexSearchColorPurple[] = _("PURPLE");
const u8 gText_DexSearchColorGray[] = _("GRAY");
const u8 gText_DexSearchColorWhite[] = _("WHITE");
const u8 gText_DexSearchColorPink[] = _("PINK");
const u8 gText_DexHoennDescription[] = _("HOENN region's POKéDEX");
const u8 gText_DexNatDescription[] = _("National edition POKéDEX");
const u8 gText_DexSortNumericalDescription[] = _("POKéMON are listed according to their\nnumber.");
const u8 gText_DexSortAtoZDescription[] = _("Spotted and owned POKéMON are listed\nalphabetically.");
const u8 gText_DexSortHeaviestDescription[] = _("Owned POKéMON are listed from the\nheaviest to the lightest.");
const u8 gText_DexSortLightestDescription[] = _("Owned POKéMON are listed from the\nlightest to the heaviest.");
const u8 gText_DexSortTallestDescription[] = _("Owned POKéMON are listed from the\ntallest to the smallest.");
const u8 gText_DexSortSmallestDescription[] = _("Owned POKéMON are listed from the\nsmallest to the tallest.");
const u8 gText_DexSearchColorRed[] = _("Red");
const u8 gText_DexSearchColorBlue[] = _("Blue");
const u8 gText_DexSearchColorYellow[] = _("Yellow");
const u8 gText_DexSearchColorGreen[] = _("Green");
const u8 gText_DexSearchColorBlack[] = _("Black");
const u8 gText_DexSearchColorBrown[] = _("Brown");
const u8 gText_DexSearchColorPurple[] = _("Purple");
const u8 gText_DexSearchColorGray[] = _("Gray");
const u8 gText_DexSearchColorWhite[] = _("White");
const u8 gText_DexSearchColorPink[] = _("Pink");
const u8 gText_DexHoennDescription[] = _("Hoenn region's Pokédex");
const u8 gText_DexNatDescription[] = _("National edition Pokédex");
const u8 gText_DexSortNumericalDescription[] = _("Pokémon are listed according to their\nnumber.");
const u8 gText_DexSortAtoZDescription[] = _("Spotted and owned Pokémon are listed\nalphabetically.");
const u8 gText_DexSortHeaviestDescription[] = _("Owned Pokémon are listed from the\nheaviest to the lightest.");
const u8 gText_DexSortLightestDescription[] = _("Owned Pokémon are listed from the\nlightest to the heaviest.");
const u8 gText_DexSortTallestDescription[] = _("Owned Pokémon are listed from the\ntallest to the smallest.");
const u8 gText_DexSortSmallestDescription[] = _("Owned Pokémon are listed from the\nsmallest to the tallest.");
const u8 gText_DexEmptyString[] = _("");
const u8 gText_DexSearchDontSpecify[] = _("DON'T SPECIFY.");
const u8 gText_DexSearchTypeNone[] = _("NONE");
const u8 gText_DexSearchDontSpecify[] = _("Don't Specify.");
const u8 gText_DexSearchTypeNone[] = _("None");
const u8 gText_SelectorArrow[] = _("");
const u8 gText_EmptySpace[] = _(" "); // Unused
const u8 gText_WelcomeToHOF[] = _("Welcome to the HALL OF FAME!");
const u8 gText_HOFDexRating[] = _("Spotted POKéMON: {STR_VAR_1}!\nOwned POKéMON: {STR_VAR_2}!\pPROF. BIRCH's POKéDEX rating!\pPROF. BIRCH: Let's see…\p");
const u8 gText_HOFDexRating[] = _("Spotted POKéMON: {STR_VAR_1}!\nOwned Pokémon: {STR_VAR_2}!\pPROF. BIRCH's Pokédex rating!\pPROF. BIRCH: Let's see…\p");
const u8 gText_HOFDexSaving[] = _("SAVING…\nDON'T TURN OFF THE POWER.");
const u8 gText_HOFCorrupted[] = _("The HALL OF FAME data is corrupted.");
const u8 gText_HOFNumber[] = _("HALL OF FAME No. {STR_VAR_1}");
@ -174,8 +177,8 @@ const u8 gText_Level[] = _("Lv. ");
const u8 gText_IdNumberSlash[] = _("IDNo. /"); // Unused
const u8 gText_Name[] = _("NAME");
const u8 gText_IDNumber[] = _("IDNo.");
const u8 gText_BirchInTrouble[] = _("PROF. BIRCH is in trouble!\nRelease a POKéMON and rescue him!");
const u8 gText_ConfirmStarterChoice[] = _("Do you choose this POKéMON?");
const u8 gText_BirchInTrouble[] = _("PROF. BIRCH is in trouble!\nRelease a Pokémon and rescue him!");
const u8 gText_ConfirmStarterChoice[] = _("Do you choose this Pokémon?");
const u8 gText_Pokemon4[] = _("POKéMON"); // Unused
const u8 gText_FlyToWhere[] = _("FLY to where?");
const u8 gMenuText_Use[] = _("USE");
@ -490,34 +493,34 @@ ALIGNED(4) const u8 gText_OtherTrainerCantAcceptPkmn[] = _("The other TRAINER ca
ALIGNED(4) const u8 gText_CantTradeWithTrainer[] = _("You can't trade with that\nTRAINER now.");
ALIGNED(4) const u8 gText_NotPkmnOtherTrainerWants[] = _("That isn't the type of POKéMON\nthat the other TRAINER wants.");
ALIGNED(4) const u8 gText_ThatIsntAnEgg[] = _("That isn't an EGG.");
const u8 gText_Register[] = _("REGISTER");
const u8 gText_Attack3[] = _("ATTACK");
const u8 gText_Defense3[] = _("DEFENSE");
const u8 gText_SpAtk4[] = _("SP. ATK");
const u8 gText_SpDef4[] = _("SP. DEF");
const u8 gText_Speed2[] = _("SPEED");
const u8 gText_Register[] = _("Register");
const u8 gText_Attack3[] = _("Attack");
const u8 gText_Defense3[] = _("Defense");
const u8 gText_SpAtk4[] = _("SP. Atk");
const u8 gText_SpDef4[] = _("SP. Def");
const u8 gText_Speed2[] = _("Speed");
const u8 gText_HP4[] = _("HP");
const u8 gText_EmptyString8[] = _(""); // Unused
const u8 gText_OTSlash[] = _("OT/");
const u8 gText_RentalPkmn[] = _("RENTAL POKéMON");
const u8 gText_TypeSlash[] = _("TYPE/");
const u8 gText_Power[] = _("POWER");
const u8 gText_Accuracy2[] = _("ACCURACY");
const u8 gText_Appeal[] = _("APPEAL");
const u8 gText_Jam[] = _("JAM");
const u8 gText_Status[] = _("STATUS");
const u8 gText_ExpPoints[] = _("EXP. POINTS");
const u8 gText_NextLv[] = _("NEXT LV.");
const u8 gText_RibbonsVar1[] = _("RIBBONS: {STR_VAR_1}");
const u8 gText_RentalPkmn[] = _("Rental Pokémon");
const u8 gText_TypeSlash[] = _("Type/");
const u8 gText_Power[] = _("Power");
const u8 gText_Accuracy2[] = _("Accuracy");
const u8 gText_Appeal[] = _("Appeal");
const u8 gText_Jam[] = _("Jam");
const u8 gText_Status[] = _("Status");
const u8 gText_ExpPoints[] = _("EXP. Points");
const u8 gText_NextLv[] = _("Next LV.");
const u8 gText_RibbonsVar1[] = _("Ribbons: {STR_VAR_1}");
const u8 gText_EmptyString5[] = _("");
const u8 gText_Events[] = _("EVENTS"); // Unused
const u8 gText_Switch[] = _("SWITCH");
const u8 gText_PkmnInfo[] = _("POKéMON INFO");
const u8 gText_PkmnSkills[] = _("POKéMON SKILLS");
const u8 gText_BattleMoves[] = _("BATTLE MOVES");
const u8 gText_ContestMoves[] = _("C0NTEST MOVES");
const u8 gText_Info[] = _("INFO");
const u8 gText_EggWillTakeALongTime[] = _("It looks like this EGG will\ntake a long time to hatch.");
const u8 gText_Switch[] = _("Switch");
const u8 gText_PkmnInfo[] = _("Pokémon Info");
const u8 gText_PkmnSkills[] = _("Pokémon Skills");
const u8 gText_BattleMoves[] = _("Battle Moves");
const u8 gText_ContestMoves[] = _("Contest Moves");
const u8 gText_Info[] = _("Info");
const u8 gText_EggWillTakeALongTime[] = _("It looks like this Egg will\ntake a long time to hatch.");
const u8 gText_EggWillTakeSomeTime[] = _("What will hatch from this?\nIt will take some time.");
const u8 gText_EggWillHatchSoon[] = _("It moves occasionally.\nIt should hatch soon.");
const u8 gText_EggAboutToHatch[] = _("It's making sounds.\nIt's about to hatch!");
@ -530,20 +533,20 @@ const u8 gText_XNatureProbablyMetAt[] = _("{DYNAMIC 0}{DYNAMIC 2}{DYNAMIC 1}{DYN
const u8 gText_XNature[] = _("{DYNAMIC 0}{DYNAMIC 2}{DYNAMIC 1}{DYNAMIC 5} nature");
const u8 gText_XNatureMetSomewhereAt[] = _("{DYNAMIC 0}{DYNAMIC 2}{DYNAMIC 1}{DYNAMIC 5} nature,\nmet somewhere at {LV_2}{DYNAMIC 0}{DYNAMIC 3}{DYNAMIC 1}.");
const u8 gText_XNatureHatchedSomewhereAt[] = _("{DYNAMIC 0}{DYNAMIC 2}{DYNAMIC 1}{DYNAMIC 5} nature,\nhatched somewhere at {LV_2}{DYNAMIC 0}{DYNAMIC 3}{DYNAMIC 1}.");
const u8 gText_OddEggFoundByCouple[] = _("An odd POKéMON EGG found\nby the DAY CARE couple.");
const u8 gText_PeculiarEggNicePlace[] = _("A peculiar POKéMON EGG\nobtained at the nice place.");
const u8 gText_PeculiarEggTrade[] = _("A peculiar POKéMON EGG\nobtained in a trade.");
const u8 gText_EggFromHotSprings[] = _("A POKéMON EGG obtained\nat the hot springs.");
const u8 gText_EggFromTraveler[] = _("An odd POKéMON EGG\nobtained from a traveler.");
const u8 gText_ApostropheSBase[] = _("'s BASE");
const u8 gText_OddEggFoundByCouple[] = _("An odd Pokémon Egg found\nby the Day Care couple.");
const u8 gText_PeculiarEggNicePlace[] = _("A peculiar POKéMON Egg\nobtained at the nice place.");
const u8 gText_PeculiarEggTrade[] = _("A peculiar POKéMON Egg\nobtained in a trade.");
const u8 gText_EggFromHotSprings[] = _("A Pokémon Egg obtained\nat the hot springs.");
const u8 gText_EggFromTraveler[] = _("An odd Pokémon Egg\nobtained from a traveler.");
const u8 gText_ApostropheSBase[] = _("'s Base");
const u8 gText_OkayToDeleteFromRegistry[] = _("Is it okay to delete {STR_VAR_1}\nfrom the REGISTRY?");
const u8 gText_RegisteredDataDeleted[] = _("The registered data was deleted.{PAUSE_UNTIL_PRESS}");
const u8 gText_NoRegistry[] = _("There is no REGISTRY.{PAUSE_UNTIL_PRESS}");
const u8 gText_DelRegist[] = _("DEL REGIST.");
const u8 gText_Var3Var1SlashVar2[] = _("{STR_VAR_3}{STR_VAR_1}/{STR_VAR_2}"); // Unused
const u8 gText_Decorate[] = _("DECORATE");
const u8 gText_PutAway[] = _("PUT AWAY");
const u8 gText_Toss2[] = _("TOSS");
const u8 gText_Decorate[] = _("Decorate");
const u8 gText_PutAway[] = _("Put Away");
const u8 gText_Toss2[] = _("Toss");
const u8 gText_Color161Shadow161[] = _("{COLOR 161}{SHADOW 161}");
const u8 gText_PutOutSelectedDecorItem[] = _("Put out the selected decoration item.");
const u8 gText_StoreChosenDecorInPC[] = _("Store the chosen decoration in the PC.");
@ -706,17 +709,17 @@ const u8 gText_Beauty2[] = _("BEAUTY");
const u8 gText_Cute2[] = _("CUTE");
const u8 gText_Smart2[] = _("SMART");
const u8 gText_Tough2[] = _("TOUGH");
const u8 gText_Items[] = _("ITEMS");
const u8 gText_Key_Items[] = _("KEY ITEMS");
const u8 gText_Poke_Balls[] = _("POKé BALLS");
const u8 gText_Items[] = _("Items");
const u8 gText_Key_Items[] = _("Key Items");
const u8 gText_Poke_Balls[] = _("Poké Balls");
const u8 gText_TMs_Hms[] = _("TMs & HMs");
const u8 gText_Berries2[] = _("BERRIES");
const u8 gText_SomeonesPC[] = _("SOMEONE'S PC");
const u8 gText_LanettesPC[] = _("LANETTE'S PC");
const u8 gText_Berries2[] = _("Berries");
const u8 gText_SomeonesPC[] = _("Someone's PC");
const u8 gText_LanettesPC[] = _("Lanette's PC");
const u8 gText_PlayersPC[] = _("{PLAYER}'s PC");
const u8 gText_HallOfFame[] = _("HALL OF FAME");
const u8 gText_LogOff[] = _("LOG OFF");
const u8 gText_Opponent[] = _("OPPONENT");
const u8 gText_HallOfFame[] = _("Hall Of Fame");
const u8 gText_LogOff[] = _("Log Off");
const u8 gText_Opponent[] = _("Opponnent");
const u8 gText_Tourney_Tree[] = _("TOURNEY TREE");
const u8 gText_ReadyToStart[] = _("READY TO START");
const u8 gText_NormalRank[] = _("NORMAL RANK");
@ -734,14 +737,14 @@ const u8 gText_AboutE_Mode[] = _("ABOUT E-MODE");
const u8 gText_AboutG_Mode[] = _("ABOUT G-MODE");
const u8 gText_E_Mode[] = _("E-MODE");
const u8 gText_G_Mode[] = _("G-MODE");
const u8 gText_MenuOptionPokedex[] = _("POKéDEX");
const u8 gText_MenuOptionPokemon[] = _("POKéMON");
const u8 gText_MenuOptionBag[] = _("BAG");
const u8 gText_MenuOptionPokedex[] = _("Pokédex");
const u8 gText_MenuOptionPokemon[] = _("Pokémon");
const u8 gText_MenuOptionBag[] = _("Bag");
const u8 gText_MenuOptionPokenav[] = _("POKéNAV");
const u8 gText_Blank[] = _("");
const u8 gText_MenuOptionSave[] = _("SAVE");
const u8 gText_MenuOptionOption[] = _("OPTION");
const u8 gText_MenuOptionExit[] = _("EXIT");
const u8 gText_MenuOptionSave[] = _("Save");
const u8 gText_MenuOptionOption[] = _("Option");
const u8 gText_MenuOptionExit[] = _("Exip");
const u8 gText_5BP[] = _(" 5BP");
const u8 gText_10BP[] = _("10BP");
const u8 gText_15BP[] = _("15BP");
@ -1587,22 +1590,22 @@ const u8 gEasyChatGroupName_TrendySaying[] = _("TRENDY SAYING");
const u8 gEasyChatGroupName_Pokemon2[] = _("POKéMON2");
const u8 gText_ThreeQuestionMarks[] = _("???");
const u8 gText_MaxHP[] = _("MAX. HP");
const u8 gText_Attack[] = _("ATTACK");
const u8 gText_Defense[] = _("DEFENSE");
const u8 gText_Speed[] = _("SPEED");
const u8 gText_SpAtk[] = _("SP. ATK");
const u8 gText_SpDef[] = _("SP. DEF");
const u8 gText_MaxHP[] = _("Max. HP");
const u8 gText_Attack[] = _("Attack");
const u8 gText_Defense[] = _("Defense");
const u8 gText_Speed[] = _("Speed");
const u8 gText_SpAtk[] = _("SP. Atk");
const u8 gText_SpDef[] = _("SP. Def");
const u8 gText_Plus[] = _("{PLUS}");
const u8 gText_Dash[] = _("-");
const u8 gText_FromSpace[] = _("From ");
const u8 gText_MixingRecords[] = _("Mixing records…");
const u8 gText_RecordMixingComplete[] = _("Record mixing completed.\nThank you for waiting.");
const u8 gText_YourName[] = _("YOUR NAME?");
const u8 gText_BoxName[] = _("BOX NAME?");
const u8 gText_YourName[] = _("Your Name?");
const u8 gText_BoxName[] = _("Box Name?");
const u8 gText_PkmnsNickname[] = _("{STR_VAR_1}'s nickname?");
const u8 gText_TellHimTheWords[] = _("Tell him the words.");
const u8 gText_MoveOkBack[] = _("{DPAD_NONE}MOVE {A_BUTTON}OK {B_BUTTON}BACK");
const u8 gText_MoveOkBack[] = _("{DPAD_NONE}Move {A_BUTTON}OK {B_BUTTON}Back");
const u8 gText_CallCantBeMadeHere[] = _("A call can't be made from here.");
const u8 gText_ContestLady_Handsome[] = _("HANDSOME");
const u8 gText_ContestLady_Vinny[] = _("VINNY");
@ -1621,43 +1624,43 @@ const u8 gText_FavorLady_Whamish[] = _("wham-ish");
const u8 gText_FavorLady_Shiny[] = _("shiny");
const u8 gText_FavorLady_Sticky[] = _("sticky");
const u8 gText_FavorLady_Pointy[] = _("pointy");
const u8 gText_RentalPkmn2[] = _("RENTAL POKéMON");
const u8 gText_SelectFirstPkmn[] = _("Select the first POKéMON.");
const u8 gText_SelectSecondPkmn[] = _("Select the second POKéMON.");
const u8 gText_SelectThirdPkmn[] = _("Select the third POKéMON.");
const u8 gText_Rent[] = _("RENT");
const u8 gText_Summary[] = _("SUMMARY");
const u8 gText_Others2[] = _("OTHERS");
const u8 gText_Deselect[] = _("DESELECT");
const u8 gText_TheseThreePkmnOkay[] = _("Are these three POKéMON OK?");
const u8 gText_Yes2[] = _("YES");
const u8 gText_No2[] = _("NO");
const u8 gText_RentalPkmn2[] = _("Rental Pokémon");
const u8 gText_SelectFirstPkmn[] = _("Select the first Pokémon.");
const u8 gText_SelectSecondPkmn[] = _("Select the second Pokémon.");
const u8 gText_SelectThirdPkmn[] = _("Select the third Pokémon.");
const u8 gText_Rent[] = _("Rent");
const u8 gText_Summary[] = _("Summary");
const u8 gText_Others2[] = _("Others");
const u8 gText_Deselect[] = _("Deselect");
const u8 gText_TheseThreePkmnOkay[] = _("Are these three Pokémon OK?");
const u8 gText_Yes2[] = _("Yes");
const u8 gText_No2[] = _("No");
const u8 gText_CantSelectSamePkmn[] = _("Can't select same {PKMN}.");
const u8 gText_PkmnSwap[] = _("POKéMON SWAP");
const u8 gText_SelectPkmnToSwap[] = _("Select POKéMON to swap.");
const u8 gText_SelectPkmnToAccept[] = _("Select POKéMON to accept.");
const u8 gText_Swap[] = _("SWAP");
const u8 gText_Summary2[] = _("SUMMARY");
const u8 gText_Rechoose[] = _("RECHOOSE");
const u8 gText_PkmnSwap[] = _("Pokémon Swap");
const u8 gText_SelectPkmnToSwap[] = _("Select Pokémon to swap.");
const u8 gText_SelectPkmnToAccept[] = _("Select Pokémon to accept.");
const u8 gText_Swap[] = _("Swap");
const u8 gText_Summary2[] = _("Summary");
const u8 gText_Rechoose[] = _("Rechoose");
const u8 gText_QuitSwapping[] = _("Quit swapping?");
const u8 gText_Yes3[] = _("YES");
const u8 gText_No3[] = _("NO");
const u8 gText_PkmnForSwap[] = _("{PKMN} FOR SWAP");
const u8 gText_Cancel3[] = _("CANCEL");
const u8 gText_Swap2[] = _("SWAP"); // Unused
const u8 gText_Accept[] = _("ACCEPT"); // Unused
const u8 gText_AcceptThisPkmn[] = _("Accept this POKéMON?");
const u8 gText_Yes3[] = _("Yes");
const u8 gText_No3[] = _("No");
const u8 gText_PkmnForSwap[] = _("{PKMN} For Swap");
const u8 gText_Cancel3[] = _("Cancel");
const u8 gText_Swap2[] = _("Swap"); // Unused
const u8 gText_Accept[] = _("Accept"); // Unused
const u8 gText_AcceptThisPkmn[] = _("Accept this Pokémon?");
const u8 gText_4Spaces[] = _(" "); // Unused
const u8 gText_SamePkmnInPartyAlready[] = _("Same {PKMN} in party already.");
const u8 gText_DecimalPoint[] = _(".");
const u8 gText_SavingPlayer[] = _("PLAYER");
const u8 gText_SavingBadges[] = _("BADGES");
const u8 gText_SavingPokedex[] = _("POKéDEX");
const u8 gText_SavingTime[] = _("TIME");
const u8 gText_SavingPlayer[] = _("Player");
const u8 gText_SavingBadges[] = _("Badges");
const u8 gText_SavingPokedex[] = _("Pokédex");
const u8 gText_SavingTime[] = _("Time");
const u8 gText_WirelessCommStatus[] = _("Wireless Communication Status");
const u8 gText_PeopleTrading[] = _("People trading:");
const u8 gText_PeopleBattling[] = _("People battling:");
const u8 gText_PeopleInUnionRoom[] = _("People in the UNION ROOM:");
const u8 gText_PeopleInUnionRoom[] = _("People in the Union Room:");
const u8 gText_PeopleCommunicating[] = _("People communicating:");
const u8 gText_F700Players[] = _("{DYNAMIC 0} players");
const u8 gText_F701Players[] = _("{DYNAMIC 1} players");

View File

@ -151,3 +151,4 @@
.include "src/debug.o"
.include "src/battle_controller_player.o"
.include "src/text_screen.o"
.include "src/ev_iv_screen.o"