Merge branch 'master' into multiplayer-stuff

This commit is contained in:
Phlosioneer
2019-02-21 21:21:10 -05:00
48 changed files with 5297 additions and 8331 deletions

View File

@@ -10,21 +10,20 @@
#include "constants/maps.h"
#include "constants/songs.h"
#include "constants/species.h"
extern void MapGridSetMetatileIdAt(s32 x, s32 y, u16 metatileId); // fieldmap
extern u8 GetCursorSelectionMonId(void);
extern u8 oei_task_add(void);
#include "fieldmap.h"
#include "party_menu.h"
#include "fldeff.h"
// why do this, GF?
enum
{
STRENGTH_PUZZLE,
FLY_PUZZLE
REGIROCK_PUZZLE,
REGISTEEL_PUZZLE
};
EWRAM_DATA static u8 sBraillePuzzleCallbackFlag = 0;
static const u8 gUnknown_085EFE74[][2] =
static const u8 gRegicePathCoords[][2] =
{
{0x04, 0x15},
{0x05, 0x15},
@@ -65,14 +64,14 @@ static const u8 gUnknown_085EFE74[][2] =
};
void SealedChamberShakingEffect(u8);
void sub_8179860(void);
void sub_8179944(void);
void DoBrailleRegirockEffect(void);
void DoBrailleRegisteelEffect(void);
bool8 ShouldDoBrailleDigEffect(void)
{
if (!FlagGet(FLAG_SYS_BRAILLE_DIG)
&& (gSaveBlock1Ptr->location.mapGroup == 0x18
&& gSaveBlock1Ptr->location.mapNum == 0x47))
&& (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEALED_CHAMBER_OUTER_ROOM)
&& gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEALED_CHAMBER_OUTER_ROOM)))
{
if (gSaveBlock1Ptr->pos.x == 10 && gSaveBlock1Ptr->pos.y == 3)
return TRUE;
@@ -87,12 +86,12 @@ bool8 ShouldDoBrailleDigEffect(void)
void DoBrailleDigEffect(void)
{
MapGridSetMetatileIdAt(16, 8, 554);
MapGridSetMetatileIdAt(17, 8, 555);
MapGridSetMetatileIdAt(18, 8, 556);
MapGridSetMetatileIdAt(16, 9, 3634);
MapGridSetMetatileIdAt(17, 9, 563);
MapGridSetMetatileIdAt(18, 9, 3636);
MapGridSetMetatileIdAt(16, 8, 0x22A);
MapGridSetMetatileIdAt(17, 8, 0x22B);
MapGridSetMetatileIdAt(18, 8, 0x22C);
MapGridSetMetatileIdAt(16, 9, 0xE32);
MapGridSetMetatileIdAt(17, 9, 0x233);
MapGridSetMetatileIdAt(18, 9, 0xE34);
DrawWholeMapView();
PlaySE(SE_BAN);
FlagSet(FLAG_SYS_BRAILLE_DIG);
@@ -115,10 +114,10 @@ bool8 CheckRelicanthWailord(void)
// THEORY: this was caused by block commenting out all of the older R/S braille functions but leaving the call to it itself, which creates the nullsub.
// the code is shown below to show what this might look like.
void ShouldDoBrailleStrengthEffectOld(void)
void ShouldDoBrailleRegirockEffectOld(void)
{
/*
if (!FlagGet(FLAG_SYS_BRAILLE_STRENGTH) && (gSaveBlock1.location.mapGroup == MAP_GROUP_DESERT_RUINS && gSaveBlock1.location.mapNum == MAP_ID_DESERT_RUINS))
if (!FlagGet(FLAG_SYS_REGIROCK_PUZZLE_COMPLETED) && (gSaveBlock1.location.mapGroup == MAP_GROUP_DESERT_RUINS && gSaveBlock1.location.mapNum == MAP_ID_DESERT_RUINS))
{
if (gSaveBlock1.pos.x == 10 && gSaveBlock1.pos.y == 23)
return TRUE;
@@ -131,7 +130,7 @@ void ShouldDoBrailleStrengthEffectOld(void)
return FALSE;
}
void DoBrailleStrengthEffect(void)
void DoBrailleRegirockEffect(void)
{
FieldEffectActiveListRemove(FLDEFF_USE_STRENGTH);
MapGridSetMetatileIdAt(14, 26, 554);
@@ -142,13 +141,13 @@ void DoBrailleStrengthEffect(void)
MapGridSetMetatileIdAt(16, 27, 3636);
DrawWholeMapView();
PlaySE(SE_BAN);
FlagSet(FLAG_SYS_BRAILLE_STRENGTH);
FlagSet(FLAG_SYS_REGIROCK_PUZZLE_COMPLETED);
ScriptContext2_Disable();
}
bool8 ShouldDoBrailleFlyEffect(void)
bool8 ShouldDoBrailleRegisteelEffect(void)
{
if (!FlagGet(FLAG_SYS_BRAILLE_FLY) && (gSaveBlock1.location.mapGroup == MAP_GROUP_ANCIENT_TOMB && gSaveBlock1.location.mapNum == MAP_ID_ANCIENT_TOMB))
if (!FlagGet(FLAG_SYS_REGISTEEL_PUZZLE_COMPLETED) && (gSaveBlock1.location.mapGroup == MAP_GROUP_ANCIENT_TOMB && gSaveBlock1.location.mapNum == MAP_ID_ANCIENT_TOMB))
{
if (gSaveBlock1.pos.x == 8 && gSaveBlock1.pos.y == 25)
return TRUE;
@@ -157,24 +156,24 @@ bool8 ShouldDoBrailleFlyEffect(void)
return FALSE;
}
void DoBrailleFlyEffect(void)
void DoBrailleRegisteelEffect(void)
{
gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
FieldEffectStart(FLDEFF_USE_FLY_ANCIENT_TOMB);
FieldEffectStart(FLDEFF_USE_TOMB_PUZZLE_EFFECT);
}
bool8 FldEff_UseFlyAncientTomb(void)
{
u8 taskId = oei_task_add();
gTasks[taskId].data[8] = (u32)UseFlyAncientTomb_Callback >> 16;
gTasks[taskId].data[9] = (u32)UseFlyAncientTomb_Callback;
gTasks[taskId].data[8] = (u32)UseRegisteelHm_Callback >> 16;
gTasks[taskId].data[9] = (u32)UseRegisteelHm_Callback;
return FALSE;
}
void UseFlyAncientTomb_Callback(void)
void UseRegisteelHm_Callback(void)
{
FieldEffectActiveListRemove(FLDEFF_USE_FLY_ANCIENT_TOMB);
FieldEffectActiveListRemove(FLDEFF_USE_TOMB_PUZZLE_EFFECT);
UseFlyAncientTomb_Finish();
}
@@ -188,7 +187,7 @@ void UseFlyAncientTomb_Finish(void)
MapGridSetMetatileIdAt(16, 27, 3636);
DrawWholeMapView();
PlaySE(SE_BAN);
FlagSet(FLAG_SYS_BRAILLE_FLY);
FlagSet(FLAG_SYS_REGISTEEL_PUZZLE_COMPLETED);
ScriptContext2_Disable();
}
*/
@@ -240,25 +239,25 @@ void SealedChamberShakingEffect(u8 taskId)
}
// moved later in the function because it was rewritten.
bool8 ShouldDoBrailleStrengthEffect(void)
bool8 ShouldDoBrailleRegirockEffect(void)
{
if (!FlagGet(FLAG_SYS_BRAILLE_STRENGTH)
if (!FlagGet(FLAG_SYS_REGIROCK_PUZZLE_COMPLETED)
&& gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(DESERT_RUINS)
&& gSaveBlock1Ptr->location.mapNum == MAP_NUM(DESERT_RUINS))
{
if (gSaveBlock1Ptr->pos.x == 6 && gSaveBlock1Ptr->pos.y == 23)
{
sBraillePuzzleCallbackFlag = STRENGTH_PUZZLE;
sBraillePuzzleCallbackFlag = REGIROCK_PUZZLE;
return TRUE;
}
else if (gSaveBlock1Ptr->pos.x == 5 && gSaveBlock1Ptr->pos.y == 23)
{
sBraillePuzzleCallbackFlag = STRENGTH_PUZZLE;
sBraillePuzzleCallbackFlag = REGIROCK_PUZZLE;
return TRUE;
}
else if (gSaveBlock1Ptr->pos.x == 7 && gSaveBlock1Ptr->pos.y == 23)
{
sBraillePuzzleCallbackFlag = STRENGTH_PUZZLE;
sBraillePuzzleCallbackFlag = REGIROCK_PUZZLE;
return TRUE;
}
}
@@ -266,65 +265,68 @@ bool8 ShouldDoBrailleStrengthEffect(void)
return FALSE;
}
void sub_8179834(void)
void SetUpPuzzleEffectRegirock(void)
{
gFieldEffectArguments[0] = GetCursorSelectionMonId();
FieldEffectStart(FLDEFF_USE_FLY_ANCIENT_TOMB);
FieldEffectStart(FLDEFF_USE_TOMB_PUZZLE_EFFECT);
}
void UseStrengthDesertRuins_Callback(void)
void UseRegirockHm_Callback(void)
{
FieldEffectActiveListRemove(FLDEFF_USE_FLY_ANCIENT_TOMB);
sub_8179860();
FieldEffectActiveListRemove(FLDEFF_USE_TOMB_PUZZLE_EFFECT);
DoBrailleRegirockEffect();
}
void sub_8179860(void)
void DoBrailleRegirockEffect(void)
{
MapGridSetMetatileIdAt(14, 26, 554);
MapGridSetMetatileIdAt(15, 26, 555);
MapGridSetMetatileIdAt(16, 26, 556);
MapGridSetMetatileIdAt(14, 27, 3634);
MapGridSetMetatileIdAt(15, 27, 563);
MapGridSetMetatileIdAt(16, 27, 3636);
MapGridSetMetatileIdAt(14, 26, 0x22A);
MapGridSetMetatileIdAt(15, 26, 0x22B);
MapGridSetMetatileIdAt(16, 26, 0x22C);
MapGridSetMetatileIdAt(14, 27, 0xE32);
MapGridSetMetatileIdAt(15, 27, 0x233);
MapGridSetMetatileIdAt(16, 27, 0xE34);
DrawWholeMapView();
PlaySE(SE_BAN);
FlagSet(FLAG_SYS_BRAILLE_STRENGTH);
FlagSet(FLAG_SYS_REGIROCK_PUZZLE_COMPLETED);
ScriptContext2_Disable();
}
bool8 ShouldDoBrailleFlyEffect(void)
bool8 ShouldDoBrailleRegisteelEffect(void)
{
if (!FlagGet(FLAG_SYS_BRAILLE_FLY) && (gSaveBlock1Ptr->location.mapGroup == 0x18 && gSaveBlock1Ptr->location.mapNum == 0x44))
if (!FlagGet(FLAG_SYS_REGISTEEL_PUZZLE_COMPLETED) && (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ANCIENT_TOMB) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ANCIENT_TOMB)))
{
if (gSaveBlock1Ptr->pos.x == 8 && gSaveBlock1Ptr->pos.y == 25)
{ sBraillePuzzleCallbackFlag = FLY_PUZZLE; return TRUE; }
{
sBraillePuzzleCallbackFlag = REGISTEEL_PUZZLE;
return TRUE;
}
}
return FALSE;
}
void sub_8179918(void)
void SetUpPuzzleEffectRegisteel(void)
{
gFieldEffectArguments[0] = GetCursorSelectionMonId();
FieldEffectStart(FLDEFF_USE_FLY_ANCIENT_TOMB);
FieldEffectStart(FLDEFF_USE_TOMB_PUZZLE_EFFECT);
}
void UseFlyAncientTomb_Callback(void)
void UseRegisteelHm_Callback(void)
{
FieldEffectActiveListRemove(FLDEFF_USE_FLY_ANCIENT_TOMB);
sub_8179944();
FieldEffectActiveListRemove(FLDEFF_USE_TOMB_PUZZLE_EFFECT);
DoBrailleRegisteelEffect();
}
void sub_8179944(void)
void DoBrailleRegisteelEffect(void)
{
MapGridSetMetatileIdAt(14, 26, 554);
MapGridSetMetatileIdAt(15, 26, 555);
MapGridSetMetatileIdAt(16, 26, 556);
MapGridSetMetatileIdAt(14, 27, 3634);
MapGridSetMetatileIdAt(15, 27, 563);
MapGridSetMetatileIdAt(16, 27, 3636);
MapGridSetMetatileIdAt(14, 26, 0x22A);
MapGridSetMetatileIdAt(15, 26, 0x22B);
MapGridSetMetatileIdAt(16, 26, 0x22C);
MapGridSetMetatileIdAt(14, 27, 0xE32);
MapGridSetMetatileIdAt(15, 27, 0x233);
MapGridSetMetatileIdAt(16, 27, 0xE34);
DrawWholeMapView();
PlaySE(SE_BAN);
FlagSet(FLAG_SYS_BRAILLE_FLY);
FlagSet(FLAG_SYS_REGISTEEL_PUZZLE_COMPLETED);
ScriptContext2_Disable();
}
@@ -332,7 +334,7 @@ void sub_8179944(void)
void DoBrailleWait(void)
{
/*
if (!FlagGet(FLAG_SYS_BRAILLE_WAIT))
if (!FlagGet(FLAG_SYS_BRAILLE_REGICE_COMPLETED))
CreateTask(Task_BrailleWait, 0x50);
}
@@ -410,15 +412,15 @@ bool8 FldEff_UsePuzzleEffect(void)
{
u8 taskId = oei_task_add();
if (sBraillePuzzleCallbackFlag == FLY_PUZZLE)
if (sBraillePuzzleCallbackFlag == REGISTEEL_PUZZLE)
{
gTasks[taskId].data[8] = (u32)UseFlyAncientTomb_Callback >> 16;
gTasks[taskId].data[9] = (u32)UseFlyAncientTomb_Callback;
gTasks[taskId].data[8] = (u32)UseRegisteelHm_Callback >> 16;
gTasks[taskId].data[9] = (u32)UseRegisteelHm_Callback;
}
else
{
gTasks[taskId].data[8] = (u32)UseStrengthDesertRuins_Callback >> 16;
gTasks[taskId].data[9] = (u32)UseStrengthDesertRuins_Callback;
gTasks[taskId].data[8] = (u32)UseRegirockHm_Callback >> 16;
gTasks[taskId].data[9] = (u32)UseRegirockHm_Callback;
}
return FALSE;
}
@@ -427,10 +429,10 @@ bool8 ShouldDoBrailleRegicePuzzle(void)
{
u8 i;
if (gSaveBlock1Ptr->location.mapGroup == 0x18
&& gSaveBlock1Ptr->location.mapNum == 0x43)
if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ISLAND_CAVE)
&& gSaveBlock1Ptr->location.mapNum == MAP_NUM(ISLAND_CAVE))
{
if (FlagGet(FLAG_SYS_BRAILLE_WAIT) != FALSE)
if (FlagGet(FLAG_SYS_BRAILLE_REGICE_COMPLETED))
return FALSE;
if (FlagGet(FLAG_TEMP_2) == FALSE)
return FALSE;
@@ -439,35 +441,36 @@ bool8 ShouldDoBrailleRegicePuzzle(void)
for (i = 0; i < 36; i++)
{
u8 xPos = gUnknown_085EFE74[i][0];
u8 yPos = gUnknown_085EFE74[i][1];
u8 xPos = gRegicePathCoords[i][0];
u8 yPos = gRegicePathCoords[i][1];
if (gSaveBlock1Ptr->pos.x == xPos && gSaveBlock1Ptr->pos.y == yPos)
{
u16 varValue;
if (i < 16)
{
u16 val = VarGet(VAR_0x403B);
u16 val = VarGet(VAR_REGICE_STEPS_1);
val |= 1 << i;
VarSet(VAR_0x403B, val);
VarSet(VAR_REGICE_STEPS_1, val);
}
else if (i < 32)
{
u16 val = VarGet(VAR_0x403C);
u16 val = VarGet(VAR_REGICE_STEPS_2);
val |= 1 << (i - 16);
VarSet(VAR_0x403C, val);
VarSet(VAR_REGICE_STEPS_2, val);
}
else
{
u16 val = VarGet(VAR_0x403D);
u16 val = VarGet(VAR_REGICE_STEPS_3);
val |= 1 << (i - 32);
VarSet(VAR_0x403D, val);
VarSet(VAR_REGICE_STEPS_3, val);
}
varValue = VarGet(VAR_0x403B);
if (varValue != 0xFFFF || VarGet(VAR_0x403C) != varValue || VarGet(VAR_0x403D) != 0xF)
varValue = VarGet(VAR_REGICE_STEPS_1);
if (varValue != 0xFFFF || VarGet(VAR_REGICE_STEPS_2) != 0xFFFF || VarGet(VAR_REGICE_STEPS_3) != 0xF)
return FALSE;
// This final check is redundant.
if (gSaveBlock1Ptr->pos.x == 8 && gSaveBlock1Ptr->pos.y == 21)
return TRUE;
else

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -28,8 +28,6 @@ EWRAM_DATA static u8 gUnknown_020375FC[16] = {0};
extern u16 *const gSpecialVars[];
extern void sub_80BB358(void);
void InitEventData(void)
{
memset(gSaveBlock1Ptr->flags, 0, sizeof(gSaveBlock1Ptr->flags));
@@ -69,7 +67,7 @@ void EnableNationalPokedex(void)
FlagSet(FLAG_SYS_NATIONAL_DEX);
gSaveBlock2Ptr->pokedex.mode = DEX_MODE_NATIONAL;
gSaveBlock2Ptr->pokedex.order = 0;
sub_80BB358();
ResetPokedexScrollPositions();
}
bool32 IsNationalPokedexEnabled(void)

View File

@@ -74,11 +74,13 @@ static const u32 gCaveTransitionTiles[] = INCBIN_U32("graphics/misc/cave_transit
// text
bool8 SetUpFieldMove_Flash(void)
{
if (ShouldDoBrailleFlyEffect())
// In Ruby and Sapphire, Registeel's tomb is opened by using Fly. In Emerald,
// Flash is used instead.
if (ShouldDoBrailleRegisteelEffect())
{
gSpecialVar_Result = GetCursorSelectionMonId();
gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
gPostMenuFieldCallback = sub_8179918;
gPostMenuFieldCallback = SetUpPuzzleEffectRegisteel;
return TRUE;
}
else if (gMapHeader.cave == TRUE && !FlagGet(FLAG_SYS_USE_FLASH))

View File

@@ -119,11 +119,13 @@ static void sub_813561C(u8 taskId)
bool8 SetUpFieldMove_RockSmash(void)
{
if (ShouldDoBrailleStrengthEffect())
// In Ruby and Sapphire, Regirock's tomb is opened by using Strength. In Emerald,
// it is opened by using Rock Smash.
if (ShouldDoBrailleRegirockEffect())
{
gSpecialVar_Result = GetCursorSelectionMonId();
gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
gPostMenuFieldCallback = sub_8179834;
gPostMenuFieldCallback = SetUpPuzzleEffectRegirock;
return TRUE;
}
else if (CheckObjectGraphicsInFrontOfPlayer(EVENT_OBJ_GFX_BREAKABLE_ROCK) == TRUE)

View File

@@ -1,13 +1,16 @@
#include "global.h"
#include "battle_anim.h"
#include "palette.h"
#include "trig.h"
#include "constants/battle_anim.h"
#include "constants/rgb.h"
extern void sub_810DE70(struct Sprite *);
extern void sub_810DFA8(struct Sprite *);
extern void sub_810E044(struct Sprite *);
extern void sub_810E13C(struct Sprite *);
extern void sub_810E1C8(struct Sprite *);
extern void sub_810E314(struct Sprite *);
void sub_810DE70(struct Sprite *);
void sub_810DFA8(struct Sprite *);
void sub_810E044(struct Sprite *);
void sub_810E13C(struct Sprite *);
void sub_810E1C8(struct Sprite *);
void sub_810E314(struct Sprite *);
extern void sub_810EA4C(struct Sprite *);
extern void sub_810EAA0(struct Sprite *);
extern void sub_810EC34(struct Sprite *);
@@ -18,6 +21,13 @@ extern void sub_810EEF8(struct Sprite *);
extern void sub_810F004(struct Sprite *);
extern void sub_810F084(struct Sprite *);
static void sub_810DE98(struct Sprite *);
static void sub_810DF18(u8);
static void sub_810E028(struct Sprite *);
static void sub_810E184(struct Sprite *);
static void sub_810E24C(struct Sprite *);
void sub_810E520(struct Sprite *);
const struct SpriteTemplate gUnknown_08596270 =
{
.tileTag = ANIM_TAG_GUST,
@@ -326,3 +336,293 @@ const struct SpriteTemplate gUnknown_08596514 =
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_810F084,
};
void sub_810DE70(struct Sprite *sprite)
{
InitSpritePosToAnimTarget(sprite, FALSE);
sprite->pos1.y += 20;
sprite->data[1] = 191;
sprite->callback = sub_810DE98;
sprite->callback(sprite);
}
static void sub_810DE98(struct Sprite *sprite) {
sprite->pos2.x = Sin(sprite->data[1], 32);
sprite->pos2.y = Cos(sprite->data[1], 8);
sprite->data[1] += 5;
sprite->data[1] &= 0xFF;
if (++sprite->data[0] == 71)
DestroyAnimSprite(sprite);
}
void sub_810DED8(u8 taskId)
{
gTasks[taskId].data[0] = gBattleAnimArgs[1];
gTasks[taskId].data[1] = gBattleAnimArgs[0];
gTasks[taskId].data[2] = IndexOfSpritePaletteTag(ANIM_TAG_GUST);
gTasks[taskId].func = sub_810DF18;
}
static void sub_810DF18(u8 taskId)
{
u8 data2;
u16 temp;
int i, base;
if (gTasks[taskId].data[10]++ == gTasks[taskId].data[1])
{
gTasks[taskId].data[10] = 0;
data2 = gTasks[taskId].data[2];
temp = gPlttBufferFaded[16 * data2 + 0x108];
i = 7;
base = data2 * 16;
do
{
gPlttBufferFaded[base + 0x101 + i] = gPlttBufferFaded[base + 0x100 + i];
i--;
}
while (i > 0);
gPlttBufferFaded[base + 0x101] = temp;
}
if (--gTasks[taskId].data[0] == 0)
DestroyAnimVisualTask(taskId);
}
void sub_810DFA8(struct Sprite *sprite)
{
InitSpritePosToAnimAttacker(sprite, TRUE);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
sprite->data[0] = gBattleAnimArgs[4];
sprite->data[1] = sprite->pos1.x;
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];
sprite->data[3] = sprite->pos1.y;
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
InitAnimLinearTranslation(sprite);
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
StoreSpriteCallbackInData6(sprite, sub_810E028);
}
static void sub_810E028(struct Sprite *sprite)
{
if (AnimTranslateLinear(sprite))
DestroyAnimSprite(sprite);
}
void sub_810E044(struct Sprite *sprite)
{
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
{
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
gBattleAnimArgs[3] = -gBattleAnimArgs[3];
}
if (IsContest())
{
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
gBattleAnimArgs[3] = -gBattleAnimArgs[3];
}
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
sprite->pos1.x += gBattleAnimArgs[0];
sprite->pos1.y += gBattleAnimArgs[1];
sprite->data[0] = gBattleAnimArgs[4];
if (gBattleAnimArgs[6] == 0)
{
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
}
else
{
SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]);
}
sprite->data[2] = sprite->data[2] + gBattleAnimArgs[2];
sprite->data[4] = sprite->data[4] + gBattleAnimArgs[3];
sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
SeekSpriteAnim(sprite, gBattleAnimArgs[5]);
}
void sub_810E13C(struct Sprite *sprite)
{
InitSpritePosToAnimAttacker(sprite, TRUE);
sprite->data[0] = gBattleAnimArgs[2];
sprite->data[1] = gBattleAnimArgs[3];
sprite->callback = sub_810E184;
gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = 1;
}
static void sub_810E184(struct Sprite *sprite)
{
if (sprite->data[0] > 0)
{
sprite->data[0]--;
}
else
{
sprite->data[2] += sprite->data[1];
sprite->pos2.y -= (sprite->data[2] >> 8);
}
if (sprite->pos1.y + sprite->pos2.y < -32)
DestroyAnimSprite(sprite);
}
void sub_810E1C8(struct Sprite *sprite)
{
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
{
sprite->pos1.x = 272;
sprite->pos1.y = -32;
StartSpriteAffineAnim(sprite, 1);
}
else
{
sprite->pos1.x = -32;
sprite->pos1.y = -32;
}
sprite->data[0] = gBattleAnimArgs[0];
sprite->data[1] = sprite->pos1.x;
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[3] = sprite->pos1.y;
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
InitAnimLinearTranslation(sprite);
sprite->callback = sub_810E24C;
}
static void sub_810E24C(struct Sprite *sprite)
{
sprite->data[0] = 1;
AnimTranslateLinear(sprite);
if (((u16)sprite->data[3] >> 8) > 200)
{
sprite->pos1.x += sprite->pos2.x;
sprite->pos2.x = 0;
sprite->data[3] &= 0xFF;
}
if ((u32)(sprite->pos1.x + sprite->pos2.x + 32) > 304 || sprite->pos1.y + sprite->pos2.y > 160)
{
gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = 0;
DestroyAnimSprite(sprite);
}
}
void sub_810E2C8(struct Sprite *sprite)
{
if (sprite->data[0]-- <= 0)
{
if (sprite->oam.affineMode & ST_OAM_AFFINE_ON_MASK)
{
FreeOamMatrix(sprite->oam.matrixNum);
sprite->oam.affineMode = 0;
}
DestroySprite(sprite);
gAnimVisualTaskCount--;
}
}
// FAKEMATCHING
void sub_810E314(struct Sprite *sprite)
{
s16 *data;
u8 slot;
s16 spriteCoord;
int t1, t2;
u32 arg2;
u32 matrixNum;
u8 sinIndex;
register s16 sinVal asm ("r4");
register int sinVal2 asm ("r0");
data = sprite->data;
if (gBattleAnimArgs[7] & 0x100)
slot = gBattleAnimAttacker;
else
slot = gBattleAnimTarget;
if (GetBattlerSide(slot) == B_SIDE_PLAYER)
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
sprite->pos1.x = GetBattlerSpriteCoord(slot, 0) + gBattleAnimArgs[0];
spriteCoord = GetBattlerSpriteCoord(slot, 1);
sprite->pos1.y = spriteCoord + gBattleAnimArgs[1];
data[4] = sprite->pos1.y << 8;
t1 = (spriteCoord + (u16) gBattleAnimArgs[6]) << 1;
data[7] = (data[7] & 1) | t1;
((u8 *) data)[0] |= 4;
arg2 = (u16) gBattleAnimArgs[2];
data[1] = (u8) gBattleAnimArgs[2];
arg2 <<= 16;
data[5] = arg2 >> 24;
data[2] = gBattleAnimArgs[3];
data[3] = gBattleAnimArgs[4];
data[6] = gBattleAnimArgs[5];
if ((u16) (data[1] - 64) <= 0x7f)
{
if (!IsContest())
sprite->oam.priority = GetBattlerSpriteBGPriority(slot) + 1;
else
sprite->oam.priority = GetBattlerSpriteBGPriority(slot);
((u8 *) data)[14] = data[7] & -2;
if (!(data[2] & 0x8000))
{
sprite->hFlip ^= 1;
sprite->animNum = sprite->hFlip;
sprite->animBeginning = 1;
sprite->animEnded = 0;
}
}
else
{
sprite->oam.priority = GetBattlerSpriteBGPriority(slot);
((u8 *) data)[14] |= 1;
if (data[2] & 0x8000)
{
sprite->hFlip ^= 1;
sprite->animNum = sprite->hFlip;
sprite->animBeginning = 1;
sprite->animEnded = 0;
}
}
t2 = (u16) data[1] >> 6 << 4;
((u8 *) data)[0] = (15 & data[0]) | t2;
sprite->pos2.x = (gSineTable[(u16) data[1]] * (u8) data[6]) >> 8;
matrixNum = sprite->oam.matrixNum;
sinIndex = (-sprite->pos2.x >> 1) + data[5];
sinVal = gSineTable[sinIndex];
gOamMatrices[matrixNum].a = gOamMatrices[matrixNum].d = gSineTable[sinIndex + 64];
gOamMatrices[matrixNum].b = sinVal;
sinVal2 = -sinVal;
gOamMatrices[matrixNum].c = sinVal2;
sprite->callback = sub_810E520;
}

View File

@@ -1528,7 +1528,7 @@ static void ShowLinkContestResultsWindow(void)
static void sub_81A31FC(void)
{
u8 text[32];
u8 name[32];
s32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
s32 facility = VarGet(VAR_FRONTIER_FACILITY);
s32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
@@ -1541,9 +1541,9 @@ static void sub_81A31FC(void)
gSaveBlock2Ptr->frontier.towerRecordWinStreaks[battleMode][lvlMode] = gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode];
if (battleMode == FRONTIER_MODE_LINK_MULTIS)
{
StringCopy(text, gLinkPlayers[gBattleScripting.multiplayerId ^ 1].name);
StripExtCtrlCodes(text);
StringCopy(gSaveBlock2Ptr->frontier.field_EE1[lvlMode], text);
StringCopy(name, gLinkPlayers[gBattleScripting.multiplayerId ^ 1].name);
StripExtCtrlCodes(name);
StringCopy(gSaveBlock2Ptr->frontier.opponentName[lvlMode], name);
SetTrainerId(gLinkPlayers[gBattleScripting.multiplayerId ^ 1].trainerId, gSaveBlock2Ptr->frontier.field_EF1[lvlMode]);
}
if (gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] > 1
@@ -2336,8 +2336,8 @@ static void PrintHallRecords(s32 hallFacilityId, s32 lvlMode)
AddTextPrinterParameterized(gRecordsWindowId, 1, gLevelModeText[lvlMode], x, 1, TEXT_SPEED_FF, NULL);
if (hallFacilityId == HALL_FACILITIES_COUNT)
{
gSaveBlock2Ptr->frontier.field_EE1[0][PLAYER_NAME_LENGTH] = EOS;
gSaveBlock2Ptr->frontier.field_EE1[1][PLAYER_NAME_LENGTH] = EOS;
gSaveBlock2Ptr->frontier.opponentName[0][PLAYER_NAME_LENGTH] = EOS;
gSaveBlock2Ptr->frontier.opponentName[1][PLAYER_NAME_LENGTH] = EOS;
Fill2PRecords(records2P, lvlMode);
for (i = 0; i < 3; i++)
Print2PRecord(i, 1, 4, &records2P[i]);

View File

@@ -16,6 +16,7 @@
#include "task.h"
#include "text.h"
#include "constants/species.h"
#include "save.h"
extern u16 gHeldKeyCodeToSend;
extern void nullsub_89(u8 taskId);
@@ -2347,17 +2348,17 @@ void sub_800E174(void)
}
}
void sub_800E378(struct UnkSaveSubstruct_3b98 *dest, u32 trainerId, const u8 *name)
void CopyTrainerRecord(struct TrainerNameRecord *dest, u32 trainerId, const u8 *name)
{
dest->trainerId = trainerId;
StringCopy(dest->trainerName, name);
}
bool32 sub_800E388(const u8 *name)
bool32 NameIsNotEmpty(const u8 *name)
{
s32 i;
for (i = 0; i < 8; i++)
for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)
{
if (name[i] != 0)
{
@@ -2367,52 +2368,64 @@ bool32 sub_800E388(const u8 *name)
return FALSE;
}
void sub_800E3A8(void)
// Save the currently connected players into the trainer records, shifting all previous records down.
void RecordMixTrainerNames(void)
{
if (gWirelessCommType != 0)
{
s32 i;
s32 j;
s32 cnt;
s32 sp0[5];
struct UnkSaveSubstruct_3b98 *sp14 = calloc(20, sizeof(struct UnkSaveSubstruct_3b98));
s32 nextSpace;
s32 connectedTrainerRecordIndices[5];
struct TrainerNameRecord *newRecords = calloc(20, sizeof(struct TrainerNameRecord));
// Check if we already have a record saved for connected trainers.
for (i = 0; i < GetLinkPlayerCount(); i++)
{
sp0[i] = -1;
connectedTrainerRecordIndices[i] = -1;
for (j = 0; j < 20; j++)
{
if ((u16)gLinkPlayers[i].trainerId == gSaveBlock1Ptr->unk_3B98[j].trainerId && StringCompare(gLinkPlayers[i].name, gSaveBlock1Ptr->unk_3B98[j].trainerName) == 0)
if ((u16)gLinkPlayers[i].trainerId == gSaveBlock1Ptr->trainerNameRecords[j].trainerId && StringCompare(gLinkPlayers[i].name, gSaveBlock1Ptr->trainerNameRecords[j].trainerName) == 0)
{
sp0[i] = j;
connectedTrainerRecordIndices[i] = j;
}
}
}
cnt = 0;
// Save the connected trainers first, at the top of the list.
nextSpace = 0;
for (i = 0; i < GetLinkPlayerCount(); i++)
{
if (i != GetMultiplayerId() && gLinkPlayers[i].language != LANGUAGE_JAPANESE)
{
sub_800E378(&sp14[cnt], (u16)gLinkPlayers[i].trainerId, gLinkPlayers[i].name);
if (sp0[i] >= 0)
CopyTrainerRecord(&newRecords[nextSpace], (u16)gLinkPlayers[i].trainerId, gLinkPlayers[i].name);
// If we already had a record for this trainer, wipe it so that the next step doesn't duplicate it.
if (connectedTrainerRecordIndices[i] >= 0)
{
memset(gSaveBlock1Ptr->unk_3B98[sp0[i]].trainerName, 0, 8);
memset(gSaveBlock1Ptr->trainerNameRecords[connectedTrainerRecordIndices[i]].trainerName, 0, 8);
}
cnt++;
nextSpace++;
}
}
// Copy all non-empty records to the new list, in the order they appear on the old list. If the list is full,
// the last (oldest) records will be dropped.
for (i = 0; i < 20; i++)
{
if (sub_800E388(gSaveBlock1Ptr->unk_3B98[i].trainerName))
if (NameIsNotEmpty(gSaveBlock1Ptr->trainerNameRecords[i].trainerName))
{
sub_800E378(&sp14[cnt], gSaveBlock1Ptr->unk_3B98[i].trainerId, gSaveBlock1Ptr->unk_3B98[i].trainerName);
if (++cnt >= 20)
CopyTrainerRecord(&newRecords[nextSpace], gSaveBlock1Ptr->trainerNameRecords[i].trainerId, gSaveBlock1Ptr->trainerNameRecords[i].trainerName);
if (++nextSpace >= 20)
{
break;
}
}
}
memcpy(gSaveBlock1Ptr->unk_3B98, sp14, 20 * sizeof(struct UnkSaveSubstruct_3b98));
free(sp14);
// Finalize the new list, and clean up.
memcpy(gSaveBlock1Ptr->trainerNameRecords, newRecords, 20 * sizeof(struct TrainerNameRecord));
free(newRecords);
}
}
@@ -2422,11 +2435,11 @@ bool32 sub_800E540(u16 id, u8 *name)
for (i = 0; i < 20; i++)
{
if (StringCompare(gSaveBlock1Ptr->unk_3B98[i].trainerName, name) == 0 && gSaveBlock1Ptr->unk_3B98[i].trainerId == id)
if (StringCompare(gSaveBlock1Ptr->trainerNameRecords[i].trainerName, name) == 0 && gSaveBlock1Ptr->trainerNameRecords[i].trainerId == id)
{
return TRUE;
}
if (!sub_800E388(gSaveBlock1Ptr->unk_3B98[i].trainerName))
if (!NameIsNotEmpty(gSaveBlock1Ptr->trainerNameRecords[i].trainerName))
{
return FALSE;
}
@@ -2434,14 +2447,14 @@ bool32 sub_800E540(u16 id, u8 *name)
return FALSE;
}
void sub_800E5AC(void)
void WipeTrainerNameRecords(void)
{
s32 i;
for (i = 0; i < 20; i++)
{
gSaveBlock1Ptr->unk_3B98[i].trainerId = 0;
CpuFill16(0, gSaveBlock1Ptr->unk_3B98[i].trainerName, 8);
gSaveBlock1Ptr->trainerNameRecords[i].trainerId = 0;
CpuFill16(0, gSaveBlock1Ptr->trainerNameRecords[i].trainerName, 8);
}
}

View File

@@ -30,31 +30,25 @@
#include "apprentice.h"
#include "frontier_util.h"
#include "constants/maps.h"
#include "pokedex.h"
#include "save.h"
#include "link_rfu.h"
#include "main.h"
#include "contest.h"
#include "item_menu.h"
#include "pokemon_storage_system.h"
#include "decoration_inventory.h"
#include "secret_base.h"
#include "player_pc.h"
#include "field_specials.h"
extern u16 gSaveFileStatus;
extern u8 gUnknown_030060B0;
// TODO: replace those declarations with file headers
extern u16 GetGeneratedTrainerIdLower(void);
extern void ClearContestWinnerPicsInContestHall(void);
extern void sub_80BB358(void);
extern void ResetBagScrollPositions(void);
extern void ResetGabbyAndTy(void);
extern void ResetSecretBases(void);
extern void ResetLinkContestBoolean(void);
extern void sub_8052DA8(void);
extern void ResetPokemonStorageSystem(void);
extern void NewGameInitPCItems(void);
extern void ClearDecorationInventories(void);
extern void ResetFanClub(void);
extern void copy_strings_to_sav1(void);
extern void sub_801AFD8(void);
extern void sub_800E5AC(void);
extern void ResetContestLinkResults(void);
extern void ResetPokeJumpResults(void);
extern void SetBerryPowder(u32* powder, u32 newValue);
extern const u8 EventScript_2715DE[];
extern const u8 EventScript_ResetAllMapFlags[];
// this file's functions
static void ClearFrontierRecord(void);
@@ -112,7 +106,7 @@ static void SetDefaultOptions(void)
static void ClearPokedexFlags(void)
{
gUnknown_030060B0 = 0;
gUnusedPokedexU8 = 0;
memset(&gSaveBlock2Ptr->pokedex.owned, 0, sizeof(gSaveBlock2Ptr->pokedex.owned));
memset(&gSaveBlock2Ptr->pokedex.seen, 0, sizeof(gSaveBlock2Ptr->pokedex.seen));
}
@@ -130,8 +124,8 @@ static void ClearFrontierRecord(void)
{
CpuFill32(0, &gSaveBlock2Ptr->frontier, sizeof(gSaveBlock2Ptr->frontier));
gSaveBlock2Ptr->frontier.field_EE1[0][0] = EOS;
gSaveBlock2Ptr->frontier.field_EE1[1][0] = EOS;
gSaveBlock2Ptr->frontier.opponentName[0][0] = EOS;
gSaveBlock2Ptr->frontier.opponentName[1][0] = EOS;
}
static void WarpToTruck(void)
@@ -149,7 +143,7 @@ void Sav2_ClearSetDefault(void)
void ResetMenuAndMonGlobals(void)
{
gDifferentSaveFile = 0;
sub_80BB358();
ResetPokedexScrollPositions();
ZeroPlayerPartyMons();
ZeroEnemyPartyMons();
ResetBagScrollPositions();
@@ -203,7 +197,7 @@ void NewGameInitData(void)
ResetFanClub();
ResetLotteryCorner();
WarpToTruck();
ScriptContext2_RunNewScript(EventScript_2715DE);
ScriptContext2_RunNewScript(EventScript_ResetAllMapFlags);
ResetMiniGamesResults();
copy_strings_to_sav1();
SetLilycoveLady();
@@ -211,7 +205,7 @@ void NewGameInitData(void)
ClearRankingHallRecords();
InitMatchCallCounters();
sub_801AFD8();
sub_800E5AC();
WipeTrainerNameRecords();
ResetTrainerHillResults();
ResetContestLinkResults();
}

View File

@@ -37,7 +37,8 @@ static EWRAM_DATA u8 gUnknown_02039B52 = 0;
static EWRAM_DATA struct PokedexListItem *sPokedexListItem = NULL;
// IWRAM common
u8 gUnknown_030060B0;
// This is written to, but never read.
u8 gUnusedPokedexU8;
void (*gUnknown_030060B4)(void);
struct PokedexOption
@@ -1225,7 +1226,7 @@ void ResetPokedex(void)
gUnknown_02039B50 = 0;
gUnknown_02039B52 = 64;
gUnknown_030060B0 = 0;
gUnusedPokedexU8 = 0;
gSaveBlock2Ptr->pokedex.mode = DEX_MODE_HOENN;
gSaveBlock2Ptr->pokedex.order = 0;
gSaveBlock2Ptr->pokedex.nationalMagic = 0;
@@ -1243,7 +1244,7 @@ void ResetPokedex(void)
}
}
void sub_80BB358(void)
void ResetPokedexScrollPositions(void)
{
gUnknown_02039B50 = 0;
gUnknown_02039B52 = 64;
@@ -4041,7 +4042,7 @@ void sub_80C0460(u16 weight, u8 left, u8 top)
lsls r2, 24\n\
lsrs r2, 24\n\
str r2, [sp, 0x10]\n\
ldr r5, =0x000186a0\n\
ldr r5, =0x000186a0 @ Note to decompiler: See UNKNOWN_OFFSET\n\
muls r0, r5\n\
ldr r1, =0x000011b8\n\
bl __divsi3\n\
@@ -4075,7 +4076,7 @@ _080C04C0:\n\
mov r8, r1\n\
movs r6, 0x1\n\
_080C04C6:\n\
ldr r1, =0x000186a0\n\
ldr r1, =0x000186a0 @ Note to decompiler: See UNKNOWN_OFFSET\n\
adds r0, r7, 0\n\
bl __umodsi3\n\
adds r7, r0, 0\n\

1211
src/pokenav.c Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1095,7 +1095,7 @@ void GetPlayerHallRecords(struct PlayerHallRecords *dst)
CopyTrainerId(dst->twoPlayers[j].id1, gSaveBlock2Ptr->playerTrainerId);
CopyTrainerId(dst->twoPlayers[j].id2, gSaveBlock2Ptr->frontier.field_EF1[j]);
StringCopy(dst->twoPlayers[j].name1, gSaveBlock2Ptr->playerName);
StringCopy(dst->twoPlayers[j].name2, gSaveBlock2Ptr->frontier.field_EE1[j]);
StringCopy(dst->twoPlayers[j].name2, gSaveBlock2Ptr->frontier.opponentName[j]);
}
for (i = 0; i < 2; i++)

View File

@@ -1687,7 +1687,7 @@ void sub_801440C(u8 taskId)
case 9 ... 11:
case 13:
case 15:
sub_800E3A8();
RecordMixTrainerNames();
break;
}
@@ -1800,12 +1800,12 @@ void sub_8014790(u8 taskId)
sendBuff[1] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[1] - 1], MON_DATA_SPECIES, NULL);
gMain.savedCallback = NULL;
data[0] = 4;
sub_800E3A8();
RecordMixTrainerNames();
ResetBlockReceivedFlags();
break;
case 16:
case 23 ... 27:
sub_800E3A8();
RecordMixTrainerNames();
DestroyTask(taskId);
default:
EnableBothScriptContexts();

View File

@@ -965,18 +965,18 @@ const u8 gUnknown_085EBE8E[] = _("Can't call opponent here.");
const u8 gUnknown_085EBEA8[] = _("STRATEGY");
const u8 gUnknown_085EBEB1[] = _("TRAINER'S POKéMON");
const u8 gUnknown_085EBEC3[] = _("SELF-INTRODUCTION");
const u8 gUnknown_085EBED5[] = _("{CLEAR 0x80}");
const u8 gUnknown_085EBED9[] = _("{A_BUTTON}ZOOM {B_BUTTON}CANCEL");
const u8 gUnknown_085EBEE9[] = _("{A_BUTTON}FULL {B_BUTTON}CANCEL");
const u8 gUnknown_085EBEF9[] = _("{A_BUTTON}CONDITION {B_BUTTON}CANCEL");
const u8 gUnknown_085EBF0E[] = _("{A_BUTTON}MARKINGS {B_BUTTON}CANCEL");
const u8 gUnknown_085EBF22[] = _("{A_BUTTON}SELECT MARK {B_BUTTON}CANCEL");
const u8 gUnknown_085EBF39[] = _("{A_BUTTON}MENU {B_BUTTON}CANCEL");
const u8 gUnknown_085EBF49[] = _("{A_BUTTON}OK {B_BUTTON}CANCEL");
const u8 gUnknown_085EBF57[] = _("{B_BUTTON}CANCEL");
const u8 gUnknown_085EBF60[] = _("{A_BUTTON}RIBBONS {B_BUTTON}CANCEL");
const u8 gUnknown_085EBF73[] = _("{A_BUTTON}CHECK {B_BUTTON}CANCEL");
const u8 gUnknown_085EBF84[] = _("{B_BUTTON}CANCEL");
const u8 gText_Navgear_ClearButtonList[] = _("{CLEAR 0x80}");
const u8 gText_NavgearMap_ZoomedOutButtons[] = _("{A_BUTTON}ZOOM {B_BUTTON}CANCEL");
const u8 gText_NavgearMap_ZoomedInButtons[] = _("{A_BUTTON}FULL {B_BUTTON}CANCEL");
const u8 gText_NavgearCondition_MonListButtons[] = _("{A_BUTTON}CONDITION {B_BUTTON}CANCEL");
const u8 gText_NavgearCondition_MonStatusButtons[] = _("{A_BUTTON}MARKINGS {B_BUTTON}CANCEL");
const u8 gText_NavgearCondition_MarkingButtons[] = _("{A_BUTTON}SELECT MARK {B_BUTTON}CANCEL");
const u8 gText_NavgearMatchCall_TrainerListButtons[] = _("{A_BUTTON}MENU {B_BUTTON}CANCEL");
const u8 gText_NavgearMatchCall_CallMenuButtons[] = _("{A_BUTTON}OK {B_BUTTON}CANCEL");
const u8 gText_NavgearMatchCall_CheckTrainerButtons[] = _("{B_BUTTON}CANCEL");
const u8 gText_NavgearRibbons_MonListButtons[] = _("{A_BUTTON}RIBBONS {B_BUTTON}CANCEL");
const u8 gText_NavgearRibbons_RibbonListButtons[] = _("{A_BUTTON}CHECK {B_BUTTON}CANCEL");
const u8 gText_NavgearRibbons_RibbonCheckButtons[] = _("{B_BUTTON}CANCEL");
const u8 gText_NatureSlash[] = _("NATURE/");
const u8 gText_TrainerCloseBy[] = _("That TRAINER is close by.\nTalk to the TRAINER in person!");
const u8 gText_InParty[] = _("IN PARTY");