Adds type checking for battler positions (#8792)

This commit is contained in:
Bassoonian 2026-01-11 15:53:22 +01:00 committed by GitHub
parent 3e273221ff
commit b0f922d3c1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
21 changed files with 68 additions and 50 deletions

View File

@ -1094,12 +1094,12 @@ static inline bool32 IsBattlerAtMaxHp(u32 battler)
return gBattleMons[battler].hp == gBattleMons[battler].maxHP;
}
static inline u32 GetBattlerPosition(u32 battler)
static inline enum BattlerPosition GetBattlerPosition(u32 battler)
{
return gBattlerPositions[battler];
}
static inline u32 GetBattlerAtPosition(u32 position)
static inline u32 GetBattlerAtPosition(enum BattlerPosition position)
{
u32 battler;
for (battler = 0; battler < gBattlersCount; battler++)

View File

@ -99,7 +99,7 @@ void LoadMoveBg(u16 bgId);
// battle_intro.c
void SetAnimBgAttribute(u8 bgId, u8 attributeId, u8 value);
void DrawBattlerOnBg(int bgId, u8 x, u8 y, u8 battlerPosition, u8 paletteId, u8 *tiles, u16 *tilemap, u16 tilesOffset);
void DrawBattlerOnBg(int bgId, u8 x, u8 y, enum BattlerPosition battlerPosition, u8 paletteId, u8 *tiles, u16 *tilemap, u16 tilesOffset);
void HandleIntroSlide(u8 environment);
void BattleIntroSlide1(u8 taskId);
void BattleIntroSlide2(u8 taskId);

View File

@ -32,6 +32,7 @@ enum BattlerPosition
B_POSITION_PLAYER_RIGHT,
B_POSITION_OPPONENT_RIGHT,
MAX_POSITION_COUNT,
B_POSITION_ABSENT = 0xFF,
};
enum BattlerId

View File

@ -747,9 +747,9 @@ u8 GetBoxMonGender(struct BoxPokemon *boxMon);
u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality);
bool32 IsPersonalityFemale(u16 species, u32 personality);
u32 GetUnownSpeciesId(u32 personality);
void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition);
void SetMultiuseSpriteTemplateToTrainerBack(enum TrainerPicID trainerPicId, u8 battlerPosition);
void SetMultiuseSpriteTemplateToTrainerFront(enum TrainerPicID trainerPicId, u8 battlerPosition);
void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, enum BattlerPosition battlerPosition);
void SetMultiuseSpriteTemplateToTrainerBack(enum TrainerPicID trainerPicId, enum BattlerPosition battlerPosition);
void SetMultiuseSpriteTemplateToTrainerFront(enum TrainerPicID trainerPicId, enum BattlerPosition battlerPosition);
/* GameFreak called Get(Box)MonData with either 2 or 3 arguments, for
* type safety we have a Get(Box)MonData macro which dispatches to

View File

@ -265,7 +265,7 @@ static inline bool32 CanBattlerWin1v1(u32 hitsToKOAI, u32 hitsToKOPlayer, bool32
static bool32 ShouldSwitchIfHasBadOdds(u32 battler)
{
//Variable initialization
u32 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler));
enum BattlerPosition opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler));
u32 opposingBattler = GetBattlerAtPosition(opposingPosition);
enum Move *playerMoves = GetMovesArray(opposingBattler);
enum Move aiMove, playerMove, bestPlayerPriorityMove = MOVE_NONE, bestPlayerMove = MOVE_NONE, expectedMove = MOVE_NONE;
@ -700,7 +700,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler)
bool32 switchMon = FALSE;
enum Ability monAbility = gAiLogicData->abilities[battler];
enum HoldEffect holdEffect = gAiLogicData->holdEffects[battler];
u8 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler));
enum BattlerPosition opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler));
u8 opposingBattler = GetBattlerAtPosition(opposingPosition);
bool32 hasStatRaised = AnyUsefulStatIsRaised(battler);

View File

@ -5648,7 +5648,7 @@ bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, enum Move mo
{
u32 preventsStatLoss;
enum Ability partnerAbility = aiData->abilities[battlerAtkPartner];
u32 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battlerAtk));
enum BattlerPosition opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battlerAtk));
u32 opposingBattler = GetBattlerAtPosition(opposingPosition);
if (gBattleMons[battlerAtkPartner].statStages[STAT_ATK] == MAX_STAT_STAGE
@ -6330,7 +6330,7 @@ bool32 CanMoveBeBouncedBack(u32 battler, enum Move move)
u32 GetActiveBattlerIds(u32 battler, u32 *battlerIn1, u32 *battlerIn2)
{
u32 opposingBattler = 0;
u32 battlerPosition = GetBattlerPosition(battler);
enum BattlerPosition battlerPosition = GetBattlerPosition(battler);
if (IsDoubleBattle())
{
*battlerIn1 = battler;

View File

@ -999,7 +999,7 @@ static void Cmd_monbg(void)
// Move designated battler to background
if (IsBattlerSpriteVisible(battler))
{
u8 position = GetBattlerPosition(battler);
enum BattlerPosition position = GetBattlerPosition(battler);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
@ -1019,7 +1019,7 @@ static void Cmd_monbg(void)
battler ^= BIT_FLANK;
if (IsBattlerSpriteVisible(battler))
{
u8 position = GetBattlerPosition(battler);
enum BattlerPosition position = GetBattlerPosition(battler);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
@ -1083,7 +1083,7 @@ void MoveBattlerSpriteToBG(u8 battler, bool8 toBG_2, bool8 setSpriteInvisible)
if (!toBG_2)
{
u8 battlerPosition;
enum BattlerPosition battlerPosition;
if (IsContest() == TRUE)
{
@ -1299,7 +1299,7 @@ static void Task_ClearMonBg(u8 taskId)
if (gTasks[taskId].data[1] != 1)
{
u8 to_BG2;
u8 position = GetBattlerPosition(gTasks[taskId].data[2]);
enum BattlerPosition position = GetBattlerPosition(gTasks[taskId].data[2]);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
to_BG2 = FALSE;
else
@ -1344,7 +1344,7 @@ static void Cmd_monbg_static(void)
if (IsBattlerSpriteVisible(battler))
{
u8 position = GetBattlerPosition(battler);
enum BattlerPosition position = GetBattlerPosition(battler);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
@ -1356,7 +1356,7 @@ static void Cmd_monbg_static(void)
battler ^= BIT_FLANK;
if (animBattlerId > 1 && IsBattlerSpriteVisible(battler))
{
u8 position = GetBattlerPosition(battler);
enum BattlerPosition position = GetBattlerPosition(battler);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
@ -1408,7 +1408,7 @@ static void Task_ClearMonBgStatic(u8 taskId)
{
bool8 toBG_2;
u8 battler = gTasks[taskId].data[2];
u8 position = GetBattlerPosition(battler);
enum BattlerPosition position = GetBattlerPosition(battler);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
@ -2096,7 +2096,7 @@ static void Cmd_splitbgprio(void)
{
u8 wantedBattler;
u8 battler;
u8 battlerPosition;
enum BattlerPosition battlerPosition;
wantedBattler = sBattleAnimScriptPtr[1];
sBattleAnimScriptPtr += 2;
@ -2128,7 +2128,7 @@ static void Cmd_splitbgprio_all(void)
static void Cmd_splitbgprio_foes(void)
{
u8 wantedBattler;
u8 battlerPosition;
enum BattlerPosition battlerPosition;
u8 battler;
wantedBattler = sBattleAnimScriptPtr[1];

View File

@ -2324,7 +2324,7 @@ void AnimTask_SwallowDeformMon(u8 taskId)
void AnimTask_HideSwapSprite(u8 taskId)
{
int i, j;
u8 position;
enum BattlerPosition position;
struct BattleAnimBgData animBg;
u8 *dest;
u8 *src;
@ -2423,7 +2423,7 @@ void AnimTask_SetOpponentShadowCallbacks(u8 taskId)
void AnimTask_TransformMon(u8 taskId)
{
int i, j;
u8 position;
enum BattlerPosition position;
struct BattleAnimBgData animBg;
u8 *dest;
u8 *src;
@ -2743,7 +2743,7 @@ void AnimTask_DoomDesireLightBeam(u8 taskId)
}
else
{
u8 position = GetBattlerPosition(gBattleAnimTarget);
enum BattlerPosition position = GetBattlerPosition(gBattleAnimTarget);
if (IsDoubleBattle() == TRUE)
{
if (position == B_POSITION_OPPONENT_LEFT)

View File

@ -824,7 +824,7 @@ bool8 IsBattlerSpritePresent(u8 battler)
}
else
{
if (GetBattlerPosition(battler) == 0xff)
if (GetBattlerPosition(battler) == B_POSITION_ABSENT)
return FALSE;
if (gBattleStruct->battlerState[battler].fainted)
@ -1977,7 +1977,7 @@ void InitPrioritiesForVisibleBattlers(void)
u8 GetBattlerSpriteSubpriority(u8 battler)
{
u8 position;
enum BattlerPosition position;
u8 subpriority;
if (IsContest())
@ -2005,7 +2005,7 @@ u8 GetBattlerSpriteSubpriority(u8 battler)
u8 GetBattlerSpriteBGPriority(u8 battler)
{
u8 position = GetBattlerPosition(battler);
enum BattlerPosition position = GetBattlerPosition(battler);
if (IsContest())
return 2;
@ -2019,7 +2019,7 @@ u8 GetBattlerSpriteBGPriorityRank(u8 battler)
{
if (!IsContest())
{
u8 position = GetBattlerPosition(battler);
enum BattlerPosition position = GetBattlerPosition(battler);
if (position == B_POSITION_PLAYER_LEFT || position == B_POSITION_OPPONENT_RIGHT)
return 2;
else

View File

@ -162,9 +162,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler)
gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE;
if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_RIGHT)
{
FreeShinyStars();
}
}
gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3;

View File

@ -169,7 +169,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler)
}
else if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim)
{
if (GetBattlerPosition(battler) == 3)
if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_RIGHT)
{
if (!gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].triedShinyMonAnim
&& !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].finishedShinyMonAnim)
@ -240,7 +240,7 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK)
{
if (GetBattlerPosition(battler) == 1)
if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_LEFT)
m4aMPlayContinue(&gMPlayInfo_BGM);
}
else

View File

@ -469,7 +469,7 @@ void HandleInputChooseTarget(u32 battler)
{
do
{
u8 currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor);
enum BattlerPosition currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor);
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
@ -495,6 +495,8 @@ void HandleInputChooseTarget(u32 battler)
case B_POSITION_OPPONENT_RIGHT:
i++;
break;
default:
break;
}
if (B_SHOW_EFFECTIVENESS)
MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(battler, GetBattlerPosition(gMultiUsePlayerCursor)), battler);
@ -520,7 +522,7 @@ void HandleInputChooseTarget(u32 battler)
{
do
{
u8 currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor);
enum BattlerPosition currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor);
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
@ -546,6 +548,8 @@ void HandleInputChooseTarget(u32 battler)
case B_POSITION_OPPONENT_RIGHT:
i++;
break;
default:
break;
}
if (B_SHOW_EFFECTIVENESS)
MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(battler, GetBattlerPosition(gMultiUsePlayerCursor)), battler);

View File

@ -141,7 +141,7 @@ void SetUpBattleVarsAndBirchZigzagoon(void)
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
gBattlerControllerFuncs[i] = BattleControllerDummy;
gBattlerPositions[i] = 0xFF;
gBattlerPositions[i] = B_POSITION_ABSENT;
gActionSelectionCursor[i] = 0;
gMoveSelectionCursor[i] = 0;
}
@ -340,7 +340,7 @@ static void InitBtlControllersInternal(void)
for (i = 0; i < MAX_LINK_PLAYERS; i++)
{
u32 linkPositionLeft, linkPositionRight;
enum BattlerPosition linkPositionLeft, linkPositionRight;
BattleControllerFunc linkBtlControllerFunc;
if (i == multiplayerId)

View File

@ -615,7 +615,8 @@ bool8 IsBattleSEPlaying(u8 battler)
void BattleLoadMonSpriteGfx(struct Pokemon *mon, u32 battler)
{
u32 personalityValue, isShiny, species, paletteOffset, position;
u32 personalityValue, isShiny, species, paletteOffset;
enum BattlerPosition position;
const u16 *paletteData;
struct Pokemon *illusionMon = GetIllusionMonPtr(battler);
if (illusionMon != NULL)
@ -689,7 +690,7 @@ void BattleGfxSfxDummy2(u16 species)
void DecompressTrainerFrontPic(u16 frontPicId, u8 battler)
{
u8 position = GetBattlerPosition(battler);
enum BattlerPosition position = GetBattlerPosition(battler);
DecompressPicFromTable(&gTrainerSprites[frontPicId].frontPic,
gMonSpritesGfxPtr->spritesGfx[position]);
LoadSpritePalette(&gTrainerSprites[frontPicId].palette);
@ -697,7 +698,7 @@ void DecompressTrainerFrontPic(u16 frontPicId, u8 battler)
void DecompressTrainerBackPic(enum TrainerPicID backPicId, u8 battler)
{
u8 position = GetBattlerPosition(battler);
enum BattlerPosition position = GetBattlerPosition(battler);
CopyTrainerBackspriteFramesToDest(backPicId, gMonSpritesGfxPtr->spritesGfx[position]);
// Aiming for palette slots 8 and 9 for Player and PlayerPartner to prevent Trainer Slides causing mons to change colour
LoadPalette(gTrainerBacksprites[backPicId].palette.data,
@ -914,7 +915,8 @@ void CopyBattleSpriteInvisibility(u8 battler)
void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, u8 changeType)
{
u32 personalityValue, position, paletteOffset, targetSpecies;
u32 personalityValue, paletteOffset, targetSpecies;
enum BattlerPosition position;
bool32 isShiny;
const void *src;
const u16 *paletteData;
@ -1005,7 +1007,8 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, u8 changeType)
void BattleLoadSubstituteOrMonSpriteGfx(u8 battler, bool8 loadMonSprite)
{
s32 i, position, palOffset;
s32 i, palOffset;
enum BattlerPosition position;
if (!loadMonSprite)
{

View File

@ -380,7 +380,8 @@ static const s8 sIndicatorPositions[][2] =
void CreateIndicatorSprite(u32 battler)
{
u32 position, spriteId;
enum BattlerPosition position;
u32 spriteId;
s16 xHealthbox = 0, x = 0, y = 0;
position = GetBattlerPosition(battler);

View File

@ -844,7 +844,7 @@ static const s16 sBattlerHealthboxCoords[BATTLE_COORDS_COUNT][MAX_BATTLERS_COUNT
void GetBattlerHealthboxCoords(u8 battler, s16 *x, s16 *y)
{
u8 position = GetBattlerPosition(battler);
enum BattlerPosition position = GetBattlerPosition(battler);
enum BattleCoordTypes index = GetBattlerCoordsIndex(battler);
*x = sBattlerHealthboxCoords[index][position][0];
@ -2598,7 +2598,8 @@ static inline bool32 IsAnyAbilityPopUpActive(void)
void CreateAbilityPopUp(u8 battler, enum Ability ability, bool32 isDoubleBattle)
{
u8 *spriteIds;
u32 xSlide, tileTag, battlerPosition = GetBattlerPosition(battler);
u32 xSlide, tileTag;
enum BattlerPosition battlerPosition = GetBattlerPosition(battler);
struct SpriteTemplate template;
const s16 (*coords)[2];
@ -2668,7 +2669,7 @@ void UpdateAbilityPopup(u8 battler)
static void SpriteCb_AbilityPopUp(struct Sprite *sprite)
{
s16 *data = sprite->data;
u32 battlerPosition = GetBattlerPosition(sBattlerId);
enum BattlerPosition battlerPosition = GetBattlerPosition(sBattlerId);
u32 fullX = sprite->x + sprite->x2;
u32 speed;

View File

@ -628,7 +628,7 @@ static void BattleIntroSlidePartner(u8 taskId)
}
}
void DrawBattlerOnBg(int bgId, u8 x, u8 y, u8 battlerPosition, u8 paletteId, u8 *tiles, u16 *tilemap, u16 tilesOffset)
void DrawBattlerOnBg(int bgId, u8 x, u8 y, enum BattlerPosition battlerPosition, u8 paletteId, u8 *tiles, u16 *tilemap, u16 tilesOffset)
{
int i, j;
int offset = tilesOffset;
@ -645,7 +645,7 @@ void DrawBattlerOnBg(int bgId, u8 x, u8 y, u8 battlerPosition, u8 paletteId, u8
LoadBgTilemap(bgId, tilemap, BG_SCREEN_SIZE, 0);
}
static void UNUSED DrawBattlerOnBgDMA(u8 x, u8 y, u8 battlerPosition, u8 arg3, u8 paletteId, u16 arg5, u8 arg6, u8 arg7)
static void UNUSED DrawBattlerOnBgDMA(u8 x, u8 y, enum BattlerPosition battlerPosition, u8 arg3, u8 paletteId, u16 arg5, u8 arg6, u8 arg7)
{
int i, j, offset;

View File

@ -3510,6 +3510,8 @@ static void DoBattleIntro(void)
gBattleResults.lastOpponentSpecies = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES, NULL);
}
break;
default:
break;
}
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
@ -4089,7 +4091,7 @@ static void HandleTurnActionSelectionState(void)
gBattleCommunication[ACTIONS_CONFIRMED_COUNT] = 0;
for (battler = 0; battler < gBattlersCount; battler++)
{
u32 position = GetBattlerPosition(battler);
enum BattlerPosition position = GetBattlerPosition(battler);
switch (gBattleCommunication[battler])
{
case STATE_TURN_START_RECORD: // Recorded battle related action on start of every turn.

View File

@ -2708,6 +2708,8 @@ static const u8 *BattleStringGetOpponentName(u8 *text, u8 multiplayerId, u8 batt
else
toCpy = BattleStringGetOpponentNameByTrainerId(TRAINER_BATTLE_PARAM.opponentA, text, multiplayerId, battler);
break;
default:
break;
}
return toCpy;
@ -2745,6 +2747,8 @@ static const u8 *BattleStringGetPlayerName(u8 *text, u8 battler)
toCpy = gSaveBlock2Ptr->playerName;
}
break;
default:
break;
}
return toCpy;
@ -3231,6 +3235,8 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize)
else
toCpy = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentA);
break;
default:
break;
}
break;
case B_TXT_ATK_TRAINER_NAME_WITH_CLASS:
@ -3257,6 +3263,8 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize)
else
classString = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentA);
break;
default:
break;
}
classLength = 0;
nameLength = 0;

View File

@ -2027,7 +2027,7 @@ u32 GetUnownSpeciesId(u32 personality)
return unownLetter + SPECIES_UNOWN_B - 1;
}
void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition)
void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, enum BattlerPosition battlerPosition)
{
if (gMonSpritesGfxPtr != NULL)
gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition];
@ -2054,7 +2054,7 @@ void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition)
}
}
void SetMultiuseSpriteTemplateToTrainerBack(enum TrainerPicID trainerPicId, u8 battlerPosition)
void SetMultiuseSpriteTemplateToTrainerBack(enum TrainerPicID trainerPicId, enum BattlerPosition battlerPosition)
{
gMultiuseSpriteTemplate.paletteTag = trainerPicId;
if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT)
@ -2073,7 +2073,7 @@ void SetMultiuseSpriteTemplateToTrainerBack(enum TrainerPicID trainerPicId, u8 b
}
}
void SetMultiuseSpriteTemplateToTrainerFront(enum TrainerPicID trainerPicId, u8 battlerPosition)
void SetMultiuseSpriteTemplateToTrainerFront(enum TrainerPicID trainerPicId, enum BattlerPosition battlerPosition)
{
if (gMonSpritesGfxPtr != NULL)
gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition];

View File

@ -330,7 +330,7 @@ void CreateBattlerSprite(u32 battler)
}
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && battler == B_POSITION_PLAYER_LEFT)
{
SetMultiuseSpriteTemplateToTrainerBack(TRAINER_PIC_BACK_WALLY, GetBattlerPosition(0));
SetMultiuseSpriteTemplateToTrainerBack(TRAINER_PIC_BACK_WALLY, GetBattlerPosition(B_POSITION_PLAYER_LEFT));
gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, 0x50,
(8 - gTrainerBacksprites[TRAINER_PIC_BACK_WALLY].coordinates.size) * 4 + 80,
GetBattlerSpriteSubpriority(0));