mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-12-26 19:54:21 +01:00
Compare commits
8 Commits
9951094e81
...
a5d661b512
Author | SHA1 | Date | |
---|---|---|---|
a5d661b512 | |||
17588ff532 | |||
36ed0c9da5 | |||
490e121852 | |||
55db97fccf | |||
eb476f9f0c | |||
5ab869b581 | |||
3bb5951def |
@ -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.
@ -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": [
|
||||
|
@ -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 ?$"
|
||||
|
@ -536,3 +536,4 @@ gSpecials::
|
||||
def_special TrySetBattleTowerLinkType
|
||||
def_special SetTotemBoost
|
||||
def_special TrySpecialOverworldEvo
|
||||
def_special ShowEvIvScreen
|
||||
|
@ -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"
|
||||
|
Binary file not shown.
@ -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
17
include/ev_iv_screen.h
Normal 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
|
@ -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[];
|
||||
|
@ -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 |
@ -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},
|
||||
|
@ -3,8 +3,8 @@
|
||||
{
|
||||
"map_section": "MAPSEC_BUDPORT_CITY",
|
||||
"name": "BUDPORT CITY",
|
||||
"x": 2,
|
||||
"y": 2,
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"width": 1,
|
||||
"height": 1
|
||||
},
|
||||
|
@ -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
689
src/ev_iv_screen.c
Normal 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);
|
||||
}
|
@ -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);
|
||||
|
@ -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)
|
||||
|
279
src/strings.c
279
src/strings.c
@ -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");
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user