2024-04-06 13:00:30 +01:00
# include "global.h"
# include "test/test.h"
2024-10-21 18:52:45 +01:00
# include "battle.h"
2024-04-25 07:05:51 +01:00
# include "battle_main.h"
2024-10-21 18:52:45 +01:00
# include "battle_message.h"
# include "battle_setup.h"
2024-04-06 13:00:30 +01:00
# include "item.h"
2024-10-21 18:52:45 +01:00
# include "malloc.h"
# include "main_menu.h"
# include "string_util.h"
2024-04-06 13:00:30 +01:00
# include "text.h"
2024-04-20 17:14:37 +01:00
# include "constants/abilities.h"
2024-10-21 18:52:45 +01:00
# include "constants/battle.h"
# include "constants/battle_string_ids.h"
2024-03-16 15:26:03 +00:00
# include "constants/items.h"
2024-04-06 13:00:30 +01:00
# include "constants/moves.h"
2024-10-21 18:52:45 +01:00
# include "test/overworld_script.h"
2024-04-06 13:00:30 +01:00
TEST ( " Move names fit on Pokemon Summary Screen " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 72 ;
u32 move = MOVE_NONE ;
for ( i = 1 ; i < MOVES_COUNT ; i + + )
{
PARAMETRIZE_LABEL ( " %S " , gMovesInfo [ i ] . name ) { move = i ; }
}
2024-10-21 18:52:45 +01:00
//DebugPrintf("Move %d: %S", GetStringWidth(fontId, gMovesInfo[move].name, 0), gMovesInfo[move].name);
2024-04-06 13:00:30 +01:00
EXPECT_LE ( GetStringWidth ( fontId , gMovesInfo [ move ] . name , 0 ) , widthPx ) ;
}
TEST ( " Move names fit on Battle Screen " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 64 ;
u32 move = MOVE_NONE ;
for ( i = 1 ; i < MOVES_COUNT ; i + + )
{
PARAMETRIZE_LABEL ( " %S " , gMovesInfo [ i ] . name ) { move = i ; }
}
EXPECT_LE ( GetStringWidth ( fontId , gMovesInfo [ move ] . name , 0 ) , widthPx ) ;
}
TEST ( " Move names fit on Contest Screen " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 61 ;
u32 move = MOVE_NONE ;
for ( i = 1 ; i < MOVES_COUNT ; i + + )
{
PARAMETRIZE_LABEL ( " %S " , gMovesInfo [ i ] . name ) { move = i ; }
}
// All moves explicitly listed here are too big to fit.
switch ( move )
{
case MOVE_NATURES_MADNESS :
EXPECT_GT ( GetStringWidth ( fontId , gMovesInfo [ move ] . name , 0 ) , widthPx ) ;
break ;
default :
EXPECT_LE ( GetStringWidth ( fontId , gMovesInfo [ move ] . name , 0 ) , widthPx ) ;
break ;
}
}
TEST ( " Move names fit on TMs & HMs Bag Screen " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 63 ;
u32 move = MOVE_NONE ;
for ( i = 1 ; i < ITEMS_COUNT ; i + + )
{
if ( gItemsInfo [ i ] . pocket = = POCKET_TM_HM )
{
PARAMETRIZE_LABEL ( " %S " , gMovesInfo [ gItemsInfo [ i ] . secondaryId ] . name ) { move = gItemsInfo [ i ] . secondaryId ; }
}
}
EXPECT_LE ( GetStringWidth ( fontId , gMovesInfo [ move ] . name , 0 ) , widthPx ) ;
}
TEST ( " Move names fit on Move Relearner Screen " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 72 ;
u32 move = MOVE_NONE ;
for ( i = 1 ; i < MOVES_COUNT ; i + + )
{
PARAMETRIZE_LABEL ( " %S " , gMovesInfo [ i ] . name ) { move = i ; }
}
EXPECT_LE ( GetStringWidth ( fontId , gMovesInfo [ move ] . name , 0 ) , widthPx ) ;
}
2024-03-16 15:26:03 +00:00
2024-10-12 18:37:11 +01:00
TEST ( " Move descriptions fit on Pokemon Summary Screen " )
{
u32 i ;
const u32 fontId = FONT_NORMAL , widthPx = 152 ;
u32 move = MOVE_NONE ;
for ( i = 1 ; i < MOVES_COUNT ; i + + )
{
PARAMETRIZE_LABEL ( " %S " , gMovesInfo [ i ] . description ) { move = i ; }
}
EXPECT_LE ( GetStringWidth ( fontId , gMovesInfo [ move ] . description , 0 ) , widthPx ) ;
}
2024-03-16 15:26:03 +00:00
TEST ( " Item names fit on Bag Screen (list) " )
{
u32 i ;
const u32 fontId = FONT_NARROWER ;
const u32 tmHmBerryWidthPx = 71 , restWidthPx = 88 ;
u32 item = ITEM_NONE ;
for ( i = 1 ; i < ITEMS_COUNT ; i + + )
{
PARAMETRIZE_LABEL ( " %S " , gItemsInfo [ i ] . name ) { item = i ; }
}
2024-10-21 18:52:45 +01:00
//DebugPrintf("Item %d: %S", GetStringWidth(fontId, gItemsInfo[item].name, 0), gItemsInfo[item].name);
2024-03-16 15:26:03 +00:00
if ( gItemsInfo [ item ] . pocket = = POCKET_TM_HM | | gItemsInfo [ item ] . pocket = = POCKET_BERRIES )
EXPECT_LE ( GetStringWidth ( fontId , gItemsInfo [ item ] . name , 0 ) , tmHmBerryWidthPx ) ;
else
EXPECT_LE ( GetStringWidth ( fontId , gItemsInfo [ item ] . name , 0 ) , restWidthPx ) ;
}
TEST ( " Item plural names fit on Bag Screen (left box) " )
{
u32 i ;
// -6 for the question mark in FONT_NORMAL.
const u32 fontId = FONT_NARROWER , widthPx = 102 - 6 ;
u32 item = ITEM_NONE ;
u8 pluralName [ ITEM_NAME_PLURAL_LENGTH + 1 ] ;
for ( i = 1 ; i < ITEMS_COUNT ; i + + )
{
PARAMETRIZE_LABEL ( " %S " , gItemsInfo [ i ] . name ) { item = i ; }
}
CopyItemNameHandlePlural ( item , pluralName , 2 ) ;
EXPECT_LE ( GetStringWidth ( fontId , pluralName , 0 ) , widthPx ) ;
}
TEST ( " Item plural names fit on PC storage (left box) " )
{
u32 i ;
// -6 for the question mark in FONT_NORMAL.
const u32 fontId = FONT_NARROWER , widthPx = 104 - 6 ;
u32 item = ITEM_NONE ;
u8 pluralName [ ITEM_NAME_PLURAL_LENGTH + 1 ] ;
for ( i = 1 ; i < ITEMS_COUNT ; i + + )
{
PARAMETRIZE_LABEL ( " %S " , gItemsInfo [ i ] . name ) { item = i ; }
}
CopyItemNameHandlePlural ( item , pluralName , 2 ) ;
EXPECT_LE ( GetStringWidth ( fontId , pluralName , 0 ) , widthPx ) ;
}
TEST ( " Item names fit on Pokemon Storage System " )
{
u32 i ;
const u32 fontId = FONT_SMALL_NARROWER , widthPx = 50 ;
u32 item = ITEM_NONE ;
for ( i = 1 ; i < ITEMS_COUNT ; i + + )
{
if ( gItemsInfo [ i ] . importance ) continue ;
PARAMETRIZE_LABEL ( " %S " , gItemsInfo [ i ] . name ) { item = i ; }
}
// All items explicitly listed here are too big to fit. The ones
// with a hold effect are listed at the bottom in case you want to
// focus on making them fit (they are the most likely to appear on
// the storage system UI, along with anything that could be held
// in the wild).
switch ( item )
{
case ITEM_ENERGY_POWDER :
case ITEM_PEWTER_CRUNCHIES :
case ITEM_RAGE_CANDY_BAR :
case ITEM_LUMIOSE_GALETTE :
case ITEM_HEALTH_FEATHER :
case ITEM_MUSCLE_FEATHER :
case ITEM_RESIST_FEATHER :
case ITEM_GENIUS_FEATHER :
case ITEM_CLEVER_FEATHER :
case ITEM_ABILITY_CAPSULE :
case ITEM_DYNAMAX_CANDY :
case ITEM_MAX_MUSHROOMS :
case ITEM_GOLD_BOTTLE_CAP :
case ITEM_PRETTY_FEATHER :
case ITEM_STRANGE_SOUVENIR :
case ITEM_FOSSILIZED_BIRD :
case ITEM_FOSSILIZED_FISH :
case ITEM_FOSSILIZED_DRAKE :
case ITEM_FOSSILIZED_DINO :
case ITEM_SURPRISE_MULCH :
case ITEM_YELLOW_APRICORN :
case ITEM_GREEN_APRICORN :
case ITEM_WHITE_APRICORN :
case ITEM_BLACK_APRICORN :
case ITEM_THUNDER_STONE :
case ITEM_GALARICA_WREATH :
case ITEM_STRAWBERRY_SWEET :
case ITEM_AUSPICIOUS_ARMOR :
case ITEM_BIG_BAMBOO_SHOOT :
case ITEM_GIMMIGHOUL_COIN :
case ITEM_LEADERS_CREST :
case ITEM_MALICIOUS_ARMOR :
case ITEM_TINY_BAMBOO_SHOOT :
case ITEM_BUG_TERA_SHARD :
case ITEM_DARK_TERA_SHARD :
case ITEM_DRAGON_TERA_SHARD :
case ITEM_ELECTRIC_TERA_SHARD :
case ITEM_FAIRY_TERA_SHARD :
case ITEM_FIGHTING_TERA_SHARD :
case ITEM_FIRE_TERA_SHARD :
case ITEM_FLYING_TERA_SHARD :
case ITEM_GHOST_TERA_SHARD :
case ITEM_GRASS_TERA_SHARD :
case ITEM_GROUND_TERA_SHARD :
case ITEM_ICE_TERA_SHARD :
case ITEM_NORMAL_TERA_SHARD :
case ITEM_POISON_TERA_SHARD :
case ITEM_PSYCHIC_TERA_SHARD :
case ITEM_ROCK_TERA_SHARD :
case ITEM_STEEL_TERA_SHARD :
case ITEM_WATER_TERA_SHARD :
case ITEM_BLACK_AUGURITE :
case ITEM_UNREMARKABLE_TEACUP :
case ITEM_MASTERPIECE_TEACUP :
case ITEM_FRESH_START_MOCHI :
case ITEM_STELLAR_TERA_SHARD :
case ITEM_JUBILIFE_MUFFIN :
case ITEM_SUPERB_REMEDY :
case ITEM_AUX_POWERGUARD :
case ITEM_CHOICE_DUMPLING :
case ITEM_TWICE_SPICED_RADISH :
// Items with hold effects:
case ITEM_ELECTRIC_MEMORY :
case ITEM_FIGHTING_MEMORY :
case ITEM_GROUND_MEMORY :
case ITEM_PSYCHIC_MEMORY :
case ITEM_DRAGON_MEMORY :
case ITEM_CHARIZARDITE_X :
case ITEM_CHARIZARDITE_Y :
case ITEM_ULTRANECROZIUM_Z :
case ITEM_DEEP_SEA_SCALE :
case ITEM_DEEP_SEA_TOOTH :
case ITEM_NEVER_MELT_ICE :
case ITEM_WEAKNESS_POLICY :
case ITEM_SAFETY_GOGGLES :
case ITEM_ADRENALINE_ORB :
case ITEM_TERRAIN_EXTENDER :
case ITEM_PROTECTIVE_PADS :
case ITEM_HEAVY_DUTY_BOOTS :
case ITEM_UTILITY_UMBRELLA :
case ITEM_MARANGA_BERRY :
case ITEM_PUNCHING_GLOVE :
case ITEM_BOOSTER_ENERGY :
case ITEM_ADAMANT_CRYSTAL :
case ITEM_LUSTROUS_GLOBE :
case ITEM_CORNERSTONE_MASK :
case ITEM_WELLSPRING_MASK :
case ITEM_HEARTHFLAME_MASK :
EXPECT_GT ( GetStringWidth ( fontId , gItemsInfo [ item ] . name , 0 ) , widthPx ) ;
break ;
default :
EXPECT_LE ( GetStringWidth ( fontId , gItemsInfo [ item ] . name , 0 ) , widthPx ) ;
break ;
}
}
TEST ( " Item names fit on Pokemon Summary Screen " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 72 ;
u32 item = ITEM_NONE ;
for ( i = 1 ; i < ITEMS_COUNT ; i + + )
{
if ( gItemsInfo [ i ] . importance ) continue ;
PARAMETRIZE_LABEL ( " %S " , gItemsInfo [ i ] . name ) { item = i ; }
}
// All items explicitly listed here are too big to fit.
switch ( item )
{
case ITEM_UNREMARKABLE_TEACUP :
EXPECT_GT ( GetStringWidth ( fontId , gItemsInfo [ item ] . name , 0 ) , widthPx ) ;
break ;
default :
EXPECT_LE ( GetStringWidth ( fontId , gItemsInfo [ item ] . name , 0 ) , widthPx ) ;
break ;
}
}
TEST ( " Item names fit on Shop Screen " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 84 ;
u32 item = ITEM_NONE ;
for ( i = 1 ; i < ITEMS_COUNT ; i + + )
{
PARAMETRIZE_LABEL ( " %S " , gItemsInfo [ i ] . name ) { item = i ; }
}
EXPECT_LE ( GetStringWidth ( fontId , gItemsInfo [ item ] . name , 0 ) , widthPx ) ;
}
2024-04-06 14:42:41 +01:00
2024-10-12 18:37:11 +01:00
TEST ( " Item descriptions fit on Bag and Shop Screen " )
{
u32 i ;
const u32 fontId = FONT_NORMAL , widthPx = 102 ;
u32 item = ITEM_NONE ;
for ( i = 1 ; i < ITEMS_COUNT ; i + + )
{
PARAMETRIZE_LABEL ( " %S " , gItemsInfo [ i ] . description ) { item = i ; }
}
EXPECT_LE ( GetStringWidth ( fontId , gItemsInfo [ item ] . description , 0 ) , widthPx ) ;
}
2024-04-06 14:42:41 +01:00
TEST ( " Species names fit on Battle Screen HP box " )
{
u32 i , genderWidthPx ;
2024-07-15 16:01:36 +01:00
const u32 fontId = FONT_SMALL_NARROWER , widthPx = 55 ;
2024-04-06 14:42:41 +01:00
u32 species = SPECIES_NONE ;
genderWidthPx = GetStringWidth ( fontId , COMPOUND_STRING ( " ♂ " ) , 0 ) ;
for ( i = 1 ; i < NUM_SPECIES ; i + + )
{
if ( IsSpeciesEnabled ( i ) )
{
PARAMETRIZE_LABEL ( " %S " , gSpeciesInfo [ i ] . speciesName ) { species = i ; }
}
}
if ( gSpeciesInfo [ i ] . genderRatio ! = MON_GENDERLESS )
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . speciesName , 0 ) - genderWidthPx , widthPx ) ;
else
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . speciesName , 0 ) , widthPx ) ;
}
TEST ( " Species names fit on Party Screen " )
{
u32 i ;
const u32 fontId = FONT_SMALL_NARROWER , widthPx = 50 ;
u32 species = SPECIES_NONE ;
for ( i = 1 ; i < NUM_SPECIES ; i + + )
{
if ( IsSpeciesEnabled ( i ) )
{
PARAMETRIZE_LABEL ( " %S " , gSpeciesInfo [ i ] . speciesName ) { species = i ; }
}
}
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . speciesName , 0 ) , widthPx ) ;
}
TEST ( " Species names fit on Pokemon Summary Screen " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 63 ;
u32 species = SPECIES_NONE ;
for ( i = 1 ; i < NUM_SPECIES ; i + + )
{
if ( IsSpeciesEnabled ( i ) )
{
PARAMETRIZE_LABEL ( " %S " , gSpeciesInfo [ i ] . speciesName ) { species = i ; }
}
}
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . speciesName , 0 ) , widthPx ) ;
}
TEST ( " Species names fit on Pokedex Screen " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 50 ;
u32 species = SPECIES_NONE ;
for ( i = 1 ; i < NUM_SPECIES ; i + + )
{
if ( IsSpeciesEnabled ( i ) )
{
PARAMETRIZE_LABEL ( " %S " , gSpeciesInfo [ i ] . speciesName ) { species = i ; }
}
}
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . speciesName , 0 ) , widthPx ) ;
}
2024-04-06 15:15:08 +01:00
TEST ( " Species names fit on Pokedex Screen - Cries " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 60 ;
u32 species = SPECIES_NONE ;
for ( i = 1 ; i < NUM_SPECIES ; i + + )
{
if ( IsSpeciesEnabled ( i ) )
{
PARAMETRIZE_LABEL ( " %S " , gSpeciesInfo [ i ] . speciesName ) { species = i ; }
}
}
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . speciesName , 0 ) , widthPx ) ;
}
2024-04-06 14:42:41 +01:00
TEST ( " Species names fit on Pokemon Storage System " )
{
u32 i ;
u32 species = SPECIES_NONE ;
for ( i = 1 ; i < NUM_SPECIES ; i + + )
{
if ( IsSpeciesEnabled ( i ) )
{
PARAMETRIZE_LABEL ( " %S " , gSpeciesInfo [ i ] . speciesName ) { species = i ; }
}
}
EXPECT_LE ( GetStringWidth ( FONT_NARROWER , gSpeciesInfo [ species ] . speciesName , 0 ) , 66 ) ;
EXPECT_LE ( GetStringWidth ( FONT_SHORT_NARROW , gSpeciesInfo [ species ] . speciesName , 0 ) , 60 ) ;
}
TEST ( " Species names fit on Contest Screen " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 50 ;
u32 species = SPECIES_NONE ;
for ( i = 1 ; i < NUM_SPECIES ; i + + )
{
if ( IsSpeciesEnabled ( i ) )
{
PARAMETRIZE_LABEL ( " %S " , gSpeciesInfo [ i ] . speciesName ) { species = i ; }
}
}
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . speciesName , 0 ) , widthPx ) ;
}
2024-04-06 15:15:08 +01:00
TEST ( " Species names fit on Contest Screen - Rankings " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 49 ;
u32 species = SPECIES_NONE ;
for ( i = 1 ; i < NUM_SPECIES ; i + + )
{
if ( IsSpeciesEnabled ( i ) )
{
PARAMETRIZE_LABEL ( " %S " , gSpeciesInfo [ i ] . speciesName ) { species = i ; }
}
}
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . speciesName , 0 ) , widthPx ) ;
}
TEST ( " Species names fit on Battle Dome Screen " )
{
u32 i ;
const u32 fontId = FONT_SHORT_NARROW , widthPx = 60 ;
u32 species = SPECIES_NONE ;
for ( i = 1 ; i < NUM_SPECIES ; i + + )
{
if ( IsSpeciesEnabled ( i ) )
{
PARAMETRIZE_LABEL ( " %S " , gSpeciesInfo [ i ] . speciesName ) { species = i ; }
}
}
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . speciesName , 0 ) , widthPx ) ;
}
TEST ( " Species names fit on Hall of Fame " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 66 ;
u32 species = SPECIES_NONE ;
for ( i = 1 ; i < NUM_SPECIES ; i + + )
{
if ( IsSpeciesEnabled ( i ) )
{
PARAMETRIZE_LABEL ( " %S " , gSpeciesInfo [ i ] . speciesName ) { species = i ; }
}
}
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . speciesName , 0 ) , widthPx ) ;
}
TEST ( " Species names fit on Naming Screen " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 64 ;
u32 species = SPECIES_NONE ;
for ( i = 1 ; i < NUM_SPECIES ; i + + )
{
if ( IsSpeciesEnabled ( i ) )
{
PARAMETRIZE_LABEL ( " %S " , gSpeciesInfo [ i ] . speciesName ) { species = i ; }
}
}
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . speciesName , 0 ) , widthPx ) ;
}
TEST ( " Species names fit on PokeNav Condition Screen " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 57 ;
u32 species = SPECIES_NONE ;
for ( i = 1 ; i < NUM_SPECIES ; i + + )
{
if ( IsSpeciesEnabled ( i ) )
{
PARAMETRIZE_LABEL ( " %S " , gSpeciesInfo [ i ] . speciesName ) { species = i ; }
}
}
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . speciesName , 0 ) , widthPx ) ;
}
TEST ( " Species names fit on PokeNav Condition Search Screen " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 60 ;
u32 species = SPECIES_NONE ;
for ( i = 1 ; i < NUM_SPECIES ; i + + )
{
if ( IsSpeciesEnabled ( i ) )
{
PARAMETRIZE_LABEL ( " %S " , gSpeciesInfo [ i ] . speciesName ) { species = i ; }
}
}
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . speciesName , 0 ) , widthPx ) ;
}
TEST ( " Species names fit on PokeNav Ribbon Screen " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 60 ;
u32 species = SPECIES_NONE ;
for ( i = 1 ; i < NUM_SPECIES ; i + + )
{
if ( IsSpeciesEnabled ( i ) )
{
PARAMETRIZE_LABEL ( " %S " , gSpeciesInfo [ i ] . speciesName ) { species = i ; }
}
}
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . speciesName , 0 ) , widthPx ) ;
}
TEST ( " Species names fit on PokeNav Ribbon List Screen " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 60 ;
u32 species = SPECIES_NONE ;
for ( i = 1 ; i < NUM_SPECIES ; i + + )
{
if ( IsSpeciesEnabled ( i ) )
{
PARAMETRIZE_LABEL ( " %S " , gSpeciesInfo [ i ] . speciesName ) { species = i ; }
}
}
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . speciesName , 0 ) , widthPx ) ;
}
2024-04-20 17:14:37 +01:00
2024-07-15 16:01:36 +01:00
TEST ( " Species names fit on Battle Screen HP box for vanilla mons with the default font " )
{
u32 i , genderWidthPx ;
const u32 fontId = FONT_SMALL , widthPx = 55 ;
u32 species = SPECIES_NONE ;
genderWidthPx = GetStringWidth ( fontId , COMPOUND_STRING ( " ♂ " ) , 0 ) ;
for ( i = 1 ; i < SPECIES_TURTWIG ; i + + )
{
if ( IsSpeciesEnabled ( i ) )
{
PARAMETRIZE_LABEL ( " %S " , gSpeciesInfo [ i ] . speciesName ) { species = i ; }
}
}
if ( gSpeciesInfo [ i ] . genderRatio ! = MON_GENDERLESS )
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . speciesName , 0 ) - genderWidthPx , widthPx ) ;
else
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . speciesName , 0 ) , widthPx ) ;
}
2024-10-12 18:37:11 +01:00
TEST ( " Species dex entries fit on Pokedex Screen " )
{
u32 i ;
const u32 fontId = FONT_NORMAL , widthPx = 224 ;
u32 species = SPECIES_NONE ;
for ( i = 1 ; i < NUM_SPECIES ; i + + )
{
if ( IsSpeciesEnabled ( i ) )
{
PARAMETRIZE_LABEL ( " %S " , gSpeciesInfo [ i ] . description ) { species = i ; }
}
}
EXPECT_LE ( GetStringWidth ( fontId , gSpeciesInfo [ species ] . description , 0 ) , widthPx ) ;
}
2024-04-20 17:14:37 +01:00
TEST ( " Ability names fit on Pokemon Summary Screen " )
{
u32 i ;
const u32 fontId = FONT_NORMAL , widthPx = 144 ;
u32 ability = ABILITY_NONE ;
for ( i = 1 ; i < ABILITIES_COUNT ; i + + )
{
PARAMETRIZE_LABEL ( " %S " , gAbilitiesInfo [ i ] . name ) { ability = i ; }
}
EXPECT_LE ( GetStringWidth ( fontId , gAbilitiesInfo [ ability ] . name , 0 ) , widthPx ) ;
}
TEST ( " Ability names fit on Ability Pop-Up " )
{
u32 i ;
const u32 fontId = FONT_SMALL_NARROWER , widthPx = 76 ;
u32 ability = ABILITY_NONE ;
for ( i = 1 ; i < ABILITIES_COUNT ; i + + )
{
PARAMETRIZE_LABEL ( " %S " , gAbilitiesInfo [ i ] . name ) { ability = i ; }
}
EXPECT_LE ( GetStringWidth ( fontId , gAbilitiesInfo [ ability ] . name , 0 ) , widthPx ) ;
}
2024-04-25 07:05:51 +01:00
2024-10-12 18:37:11 +01:00
TEST ( " Ability descriptions fit on Pokemon Summary Screen " )
{
u32 i ;
const u32 fontId = FONT_NORMAL , widthPx = 146 ;
u32 ability = ABILITY_NONE ;
for ( i = 1 ; i < ABILITIES_COUNT ; i + + )
{
PARAMETRIZE_LABEL ( " %S " , gAbilitiesInfo [ i ] . description ) { ability = i ; }
}
EXPECT_LE ( GetStringWidth ( fontId , gAbilitiesInfo [ ability ] . description , 0 ) , widthPx ) ;
}
2024-04-25 07:05:51 +01:00
TEST ( " Type names fit on Battle Screen " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 39 ;
u32 type = TYPE_NORMAL ;
for ( i = 0 ; i < NUMBER_OF_MON_TYPES ; i + + )
{
PARAMETRIZE_LABEL ( " %S " , gTypesInfo [ i ] . name ) { type = i ; }
}
EXPECT_LE ( GetStringWidth ( fontId , gTypesInfo [ type ] . name , 0 ) , widthPx ) ;
}
TEST ( " Type names fit on Pokedex Search Screen " )
{
u32 i ;
const u32 fontId = FONT_NARROWER , widthPx = 38 ;
u32 type = TYPE_NORMAL ;
for ( i = 0 ; i < NUMBER_OF_MON_TYPES ; i + + )
{
PARAMETRIZE_LABEL ( " %S " , gTypesInfo [ i ] . name ) { type = i ; }
}
EXPECT_LE ( GetStringWidth ( fontId , gTypesInfo [ type ] . name , 0 ) , widthPx ) ;
}
2024-10-21 18:52:45 +01:00
extern u16 sBattlerAbilities [ MAX_BATTLERS_COUNT ] ;
//*
# define BATTLE_STRING_BUFFER_SIZE 1000
TEST ( " Battle strings fit on the battle message window " )
{
u32 i , j , strWidth ;
u32 start = BATTLESTRINGS_TABLE_START ;
u32 end = BATTLESTRINGS_COUNT - 1 ;
const u32 fontId = FONT_NORMAL ;
u32 battleStringId = 0 ;
u8 * battleString = Alloc ( BATTLE_STRING_BUFFER_SIZE ) ;
s32 sixDigitNines = 999999 ; // 36 pixels.
u8 nickname [ POKEMON_NAME_LENGTH + 1 ] = _ ( " MMMMMMMMMMMM " ) ; // 72 pixels.
u32 longMoveID = MOVE_NATURES_MADNESS ; // 89 pixels.
u32 longAbilityID = ABILITY_SUPERSWEET_SYRUP ; // 91 pixels.
u32 longStatName = STAT_EVASION ; // 40 pixels.
u32 longTypeName = TYPE_ELECTRIC ; // 43 pixels.
u32 longSpeciesName = SPECIES_SANDY_SHOCKS ; // 47 pixels.
u32 longItemName = ITEM_UNREMARKABLE_TEACUP ; // 73 pixels.
u8 boxName [ 9 ] = _ ( " MMMMMMMM " ) ; // 54 pixels.
// Set longest default player name, JOHNNY
NewGameBirchSpeech_SetDefaultPlayerName ( 10 ) ; // JOHNNY
RUN_OVERWORLD_SCRIPT (
givemon SPECIES_WOBBUFFET , 100 ;
createmon 1 , 0 , SPECIES_WOBBUFFET , 100 ;
) ;
SetMonData ( & gPlayerParty [ 0 ] , MON_DATA_NICKNAME , nickname ) ;
SetMonData ( & gEnemyParty [ 0 ] , MON_DATA_NICKNAME , nickname ) ;
for ( i = start ; i < = end ; i + + )
{
2024-11-09 23:22:37 +00:00
PARAMETRIZE_LABEL ( " %S " , gBattleStringsTable [ i ] ) { battleStringId = i ; }
2024-10-21 18:52:45 +01:00
}
// Clear buffers
PREPARE_STRING_BUFFER ( gBattleTextBuff1 , STRINGID_EMPTYSTRING3 ) ;
PREPARE_STRING_BUFFER ( gBattleTextBuff2 , STRINGID_EMPTYSTRING3 ) ;
PREPARE_STRING_BUFFER ( gBattleTextBuff3 , STRINGID_EMPTYSTRING3 ) ;
* gStringVar1 = EOS ;
* gStringVar2 = EOS ;
* gStringVar3 = EOS ;
// Set positions
gBattlerPositions [ 0 ] = B_POSITION_PLAYER_LEFT ;
gBattlerPositions [ 1 ] = B_POSITION_OPPONENT_LEFT ;
gBattlerPositions [ 2 ] = B_POSITION_PLAYER_RIGHT ;
gBattlerPositions [ 3 ] = B_POSITION_OPPONENT_RIGHT ;
// Set abilities
gLastUsedAbility = longAbilityID ;
for ( j = 0 ; j < MAX_BATTLERS_COUNT ; j + + )
sBattlerAbilities [ j ] = longAbilityID ;
// Set Trainers
gTrainerBattleOpponent_A = 1 ;
gTrainerBattleOpponent_B = 1 ;
// Set battler to 1, so "The opposing " is prefixed when refering to battlers.
gBattleTypeFlags | = BATTLE_TYPE_TRAINER ;
gBattlerAttacker = gBattlerTarget = gBattleScripting . battler = gEffectBattler = 1 ;
// Set moves
gCurrentMove = longMoveID ;
gBattleMsgDataPtr = AllocZeroed ( sizeof ( struct BattleMsgData ) ) ;
gBattleMsgDataPtr - > currentMove = longMoveID ;
// Set Items
gLastUsedItem = longItemName ;
// Buffer specific strings for each Battle String.
// In cases where a buffer is used with multiple contexts, the widest string is used.
// Eg. STRINGID_CANACTFASTERTHANKSTO is used for both with abilities and items,
// so ability is chosen because it's longer.
2024-11-09 23:22:37 +00:00
switch ( battleStringId )
2024-10-21 18:52:45 +01:00
{
// Testing Trainer messages is out of the current scope for this test.
case STRINGID_TRAINER1LOSETEXT :
case STRINGID_TRAINER2LOSETEXT :
case STRINGID_TRAINER1WINTEXT :
case STRINGID_TRAINER2WINTEXT :
break ;
// Buffer Nickname with prefix to B_BUFF1, " a boosted" to B_BUFF2, "999999" to B_BUFF3
case STRINGID_PKMNGAINEDEXP :
PREPARE_MON_NICK_WITH_PREFIX_BUFFER ( gBattleTextBuff1 , 0 , 0 ) ;
PREPARE_STRING_BUFFER ( gBattleTextBuff2 , STRINGID_ABOOSTED ) ; // 'gained a boosted'
PREPARE_WORD_NUMBER_BUFFER ( gBattleTextBuff3 , 6 , sixDigitNines ) ;
break ;
// Buffer Nickname with prefix to B_BUFF1, "100" to B_BUFF2
case STRINGID_PKMNGREWTOLV :
PREPARE_MON_NICK_WITH_PREFIX_BUFFER ( gBattleTextBuff1 , 0 , 0 ) ;
PREPARE_BYTE_NUMBER_BUFFER ( gBattleTextBuff2 , 3 , 100 ) ;
break ;
// Buffer Nickname with prefix to B_BUFF1, move name to B_BUFF2
case STRINGID_PKMNLEARNEDMOVE :
case STRINGID_TRYTOLEARNMOVE1 :
case STRINGID_TRYTOLEARNMOVE2 :
case STRINGID_TRYTOLEARNMOVE3 :
case STRINGID_PKMNFORGOTMOVE :
case STRINGID_STOPLEARNINGMOVE :
case STRINGID_DIDNOTLEARNMOVE :
PREPARE_MON_NICK_WITH_PREFIX_BUFFER ( gBattleTextBuff1 , 0 , 0 ) ;
PREPARE_MOVE_BUFFER ( gBattleTextBuff2 , longMoveID ) ;
break ;
// Buffer Move name to B_BUFF1
case STRINGID_PKMNLEARNEDMOVE2 :
case STRINGID_TEAMSTOPPEDWORKING : // Unused
case STRINGID_FOESTOPPEDWORKING : // Unused
case STRINGID_PKMNHURTBY :
case STRINGID_PKMNFREEDFROM :
case STRINGID_PKMNMOVEWASDISABLED :
case STRINGID_PKMNSKETCHEDMOVE :
case STRINGID_PKMNGOTFREE :
case STRINGID_PKMNLOSTPPGRUDGE :
case STRINGID_PKMNSITEMRESTOREDPP :
case STRINGID_PKMNSXWOREOFF :
case STRINGID_BUFFERENDS :
case STRINGID_FOREWARNACTIVATES :
case STRINGID_CUSEDBODYDISABLED :
case STRINGID_CURRENTMOVECANTSELECT :
case STRINGID_TARGETISHURTBYSALTCURE :
PREPARE_MOVE_BUFFER ( gBattleTextBuff1 , longMoveID ) ;
break ;
// Buffer "999999" to B_BUFF1
case STRINGID_PLAYERGOTMONEY :
case STRINGID_PLAYERWHITEOUT2 :
case STRINGID_PLAYERPICKEDUPMONEY :
case STRINGID_PLAYERPAIDPRIZEMONEY :
PREPARE_WORD_NUMBER_BUFFER ( gBattleTextBuff1 , 6 , sixDigitNines ) ;
break ;
// Buffer "99" to B_BUFF1
case STRINGID_HITXTIMES :
case STRINGID_MAGNITUDESTRENGTH :
PREPARE_WORD_NUMBER_BUFFER ( gBattleTextBuff1 , 2 , 99 ) ;
break ;
// Buffer "9" to B_BUFF1
case STRINGID_PKMNSTOCKPILED :
case STRINGID_PKMNPERISHCOUNTFELL :
PREPARE_WORD_NUMBER_BUFFER ( gBattleTextBuff1 , 1 , 9 ) ;
break ;
// Buffer Ability name to B_BUFF1
case STRINGID_PKMNMADESLEEP :
case STRINGID_PKMNPOISONEDBY :
case STRINGID_PKMNBURNEDBY :
case STRINGID_PKMNFROZENBY :
case STRINGID_PKMNWASPARALYZEDBY :
case STRINGID_CANACTFASTERTHANKSTO :
PREPARE_ABILITY_BUFFER ( gBattleTextBuff1 , longAbilityID ) ;
break ;
// Buffer Stat name to B_BUFF1
case STRINGID_STATSWONTINCREASE :
case STRINGID_STATSWONTDECREASE :
case STRINGID_PKMNSXPREVENTSYLOSS :
case STRINGID_TARGETABILITYSTATRAISE :
case STRINGID_TARGETSSTATWASMAXEDOUT :
case STRINGID_ATTACKERABILITYSTATRAISE :
case STRINGID_LASTABILITYRAISEDSTAT :
case STRINGID_TARGETABILITYSTATLOWER :
case STRINGID_SCRIPTINGABILITYSTATRAISE :
case STRINGID_BATTLERABILITYRAISEDSTAT :
case STRINGID_ABILITYRAISEDSTATDRASTICALLY :
case STRINGID_STATWASHEIGHTENED :
StringCopy ( gBattleTextBuff1 , gStatNamesTable [ longStatName ] ) ;
break ;
// Buffer Type name to B_BUFF1
case STRINGID_PKMNCHANGEDTYPE :
case STRINGID_PKMNCHANGEDTYPEWITH :
case STRINGID_TARGETCHANGEDTYPE :
case STRINGID_PROTEANTYPECHANGE :
case STRINGID_THIRDTYPEADDED :
case STRINGID_ATTACKERLOSTITSTYPE :
case STRINGID_PKMNTERASTALLIZEDINTO :
PREPARE_TYPE_BUFFER ( gBattleTextBuff1 , longTypeName ) ;
break ;
// Buffer Species name to B_BUFF1
case STRINGID_PKMNTRANSFORMEDINTO :
case STRINGID_WILDPKMNFLED :
case STRINGID_MEGAEVOEVOLVED :
case STRINGID_PKMNREVIVEDREADYTOFIGHT :
case STRINGID_ITEMRESTOREDSPECIESHEALTH : // Should probably use nickname instead?
case STRINGID_ITEMCUREDSPECIESSTATUS : // Should probably use nickname instead?
case STRINGID_ITEMRESTOREDSPECIESPP : // Should probably use nickname instead?
PREPARE_SPECIES_BUFFER ( gBattleTextBuff1 , longSpeciesName )
break ;
// Buffer nickname with prefix to B_BUFF1
case STRINGID_PKMNATTACK :
case STRINGID_PKMNWISHCAMETRUE :
PREPARE_MON_NICK_WITH_PREFIX_BUFFER ( gBattleTextBuff1 , 1 , 0 ) ;
break ;
// Buffer nickname with prefix in lower case to B_BUFF1
case STRINGID_USEDINSTRUCTEDMOVE :
PREPARE_MON_NICK_WITH_PREFIX_LOWER_BUFFER ( gBattleTextBuff1 , 1 , 0 ) ;
break ;
// Buffer nickname to B_BUFF2
case STRINGID_ENEMYABOUTTOSWITCHPKMN :
PREPARE_MON_NICK_BUFFER ( gBattleTextBuff2 , 1 , 0 ) ;
break ;
// Buffer Item name to B_BUFF1
case STRINGID_PKMNHURTSWITH :
case STRINGID_PKMNCURIOUSABOUTX :
case STRINGID_PKMNENTHRALLEDBYX :
case STRINGID_PKMNIGNOREDX :
case STRINGID_PREVENTEDFROMWORKING :
case STRINGID_PKMNOBTAINEDX :
case STRINGID_ABOUTTOUSEPOLTERGEIST :
PREPARE_ITEM_BUFFER ( gBattleTextBuff1 , longItemName ) ;
break ;
// Buffer Item name to B_BUFF2
case STRINGID_PKMNOBTAINEDX2 :
PREPARE_ITEM_BUFFER ( gBattleTextBuff2 , longItemName ) ;
break ;
// Buffer Item name to B_BUFF1 and B_BUFF2
case STRINGID_PKMNOBTAINEDXYOBTAINEDZ :
PREPARE_ITEM_BUFFER ( gBattleTextBuff1 , longItemName ) ;
PREPARE_ITEM_BUFFER ( gBattleTextBuff2 , longItemName ) ;
break ;
// Buffer nickname with prefix to B_BUFF1, Ability name to B_BUFF2
case STRINGID_PKMNTRACED :
PREPARE_MON_NICK_WITH_PREFIX_LOWER_BUFFER ( gBattleTextBuff1 , 1 , 0 ) ;
PREPARE_ABILITY_BUFFER ( gBattleTextBuff2 , longAbilityID ) ;
break ;
// Buffer Stat name to B_BUFF1, "drastically rose" to B_BUFF2
case STRINGID_ATTACKERSSTATROSE :
case STRINGID_DEFENDERSSTATROSE :
case STRINGID_USINGITEMSTATOFPKMNROSE :
StringCopy ( gBattleTextBuff1 , gStatNamesTable [ longStatName ] ) ;
2024-11-09 23:22:37 +00:00
StringCopy ( gBattleTextBuff2 , gText_drastically ) ;
2024-10-21 18:52:45 +01:00
StringAppend ( gBattleTextBuff2 , gText_StatRose ) ;
break ;
// Buffer Stat name to B_BUFF1, "severely fell" to B_BUFF2
case STRINGID_ATTACKERSSTATFELL :
case STRINGID_DEFENDERSSTATFELL :
StringCopy ( gBattleTextBuff1 , gStatNamesTable [ longStatName ] ) ;
2024-11-09 23:22:37 +00:00
StringCopy ( gBattleTextBuff2 , gText_severely ) ;
StringAppend ( gBattleTextBuff2 , gText_StatFell ) ;
2024-10-21 18:52:45 +01:00
break ;
// Buffer Status name to B_BUFF2
case STRINGID_PKMNSITEMCUREDPROBLEM :
case STRINGID_PKMNSXCUREDYPROBLEM :
case STRINGID_PKMNSXCUREDITSYPROBLEM :
StringCopy ( gBattleTextBuff1 , gText_Confusion ) ;
break ;
// Buffer Box name to STR_VAR_1 and STR_VAR_3, Nickname to STR_VAR_2
case STRINGID_PKMNTRANSFERREDSOMEONESPC :
case STRINGID_PKMNTRANSFERREDLANETTESPC :
case STRINGID_PKMNBOXSOMEONESPCFULL :
case STRINGID_PKMNBOXLANETTESPCFULL :
StringCopy ( gStringVar1 , boxName ) ;
StringCopy ( gStringVar2 , nickname ) ;
StringCopy ( gStringVar3 , boxName ) ;
break ;
default :
break ;
}
BattleStringExpandPlaceholders ( gBattleStringsTable [ battleStringId ] , battleString , BATTLE_STRING_BUFFER_SIZE ) ;
2024-11-09 23:22:37 +00:00
DebugPrintf ( " Battle String ID %d: %S " , battleStringId , battleString ) ;
2024-10-21 18:52:45 +01:00
for ( j = 1 ; ; j + + )
{
2024-11-01 14:07:58 +00:00
strWidth = GetStringLineWidth ( fontId , battleString , 0 , j , BATTLE_STRING_BUFFER_SIZE ) ;
2024-10-21 18:52:45 +01:00
if ( strWidth = = 0 )
break ;
EXPECT_LE ( strWidth - 1 , BATTLE_MSG_MAX_WIDTH ) ; // -1 because there's a pixel-wide space that doesn't visually look like it's out of frame when using FONT_NORMAL.
}
Free ( gBattleMsgDataPtr ) ;
Free ( battleString ) ;
}
//*/