diff --git a/charmap.txt b/charmap.txt index a35709d652..34fb683d0c 100644 --- a/charmap.txt +++ b/charmap.txt @@ -1064,6 +1064,7 @@ ROUND_RIGHT_PAREN = F9 14 CIRCLE_DOT = F9 15 TRIANGLE = F9 16 BIG_MULT_X = F9 17 +CIRCLE_HOLLOW = F9 18 EMOJI_UNDERSCORE = F9 D0 EMOJI_PIPE = F9 D1 diff --git a/graphics/fonts/latin_narrow.png b/graphics/fonts/latin_narrow.png index 434638ed17..bb9d0670d3 100644 Binary files a/graphics/fonts/latin_narrow.png and b/graphics/fonts/latin_narrow.png differ diff --git a/graphics/fonts/latin_narrower.png b/graphics/fonts/latin_narrower.png index 19a6a98fb6..ab4ce4322e 100644 Binary files a/graphics/fonts/latin_narrower.png and b/graphics/fonts/latin_narrower.png differ diff --git a/graphics/fonts/latin_normal.png b/graphics/fonts/latin_normal.png index d1de69d136..b3fa87b0e0 100644 Binary files a/graphics/fonts/latin_normal.png and b/graphics/fonts/latin_normal.png differ diff --git a/graphics/fonts/latin_short.png b/graphics/fonts/latin_short.png index 98ad3c5cc3..12aa01835d 100644 Binary files a/graphics/fonts/latin_short.png and b/graphics/fonts/latin_short.png differ diff --git a/graphics/fonts/latin_short_narrow.png b/graphics/fonts/latin_short_narrow.png index 6bf1bae0cf..b551f3215c 100644 Binary files a/graphics/fonts/latin_short_narrow.png and b/graphics/fonts/latin_short_narrow.png differ diff --git a/graphics/fonts/latin_short_narrower.png b/graphics/fonts/latin_short_narrower.png index 5c4f4c1d4d..920a88aa01 100644 Binary files a/graphics/fonts/latin_short_narrower.png and b/graphics/fonts/latin_short_narrower.png differ diff --git a/graphics/fonts/latin_small.png b/graphics/fonts/latin_small.png index 41bb38cff8..31c4444dc4 100644 Binary files a/graphics/fonts/latin_small.png and b/graphics/fonts/latin_small.png differ diff --git a/graphics/fonts/latin_small_narrow.png b/graphics/fonts/latin_small_narrow.png index ff07b857d7..4fbb13aad4 100644 Binary files a/graphics/fonts/latin_small_narrow.png and b/graphics/fonts/latin_small_narrow.png differ diff --git a/graphics/fonts/latin_small_narrower.png b/graphics/fonts/latin_small_narrower.png index c20fa4ae48..69bca4645a 100644 Binary files a/graphics/fonts/latin_small_narrower.png and b/graphics/fonts/latin_small_narrower.png differ diff --git a/include/config/battle.h b/include/config/battle.h index b61494ee44..59c90aacb0 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -323,6 +323,12 @@ #define SHOW_TYPES_SEEN 3 // Only show types if you've seen a species of the mon. #define B_SHOW_TYPES SHOW_TYPES_NEVER // When to show type indicators next to Pokémon health bars in battle, while choosing a move after selecting a target Pokémon. +#define SHOW_EFFECTIVENESS_NEVER 0 // Never show effectiveness when selecting moves. +#define SHOW_EFFECTIVENESS_ALWAYS 1 // Always show effectiveness when selecting moves. +#define SHOW_EFFECTIVENESS_CAUGHT 2 // Only show effectiveness if you've caught a species of the mon. +#define SHOW_EFFECTIVENESS_SEEN 3 // Only show effectiveness if you've seen a species of the mon. +#define B_SHOW_EFFECTIVENESS SHOW_EFFECTIVENESS_SEEN // If not SHOW_EFFECTIVENESS_NEVER, the PP string is replaced by a type effectiveness indicator based off the moves and the opposing side. + // Pokémon battle sprite settings #define B_ENEMY_MON_SHADOW_STYLE GEN_LATEST // In Gen4+, all enemy Pokemon will have a shadow drawn beneath them. diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 96f3e6b67d..dbbfeb40db 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -46,6 +46,7 @@ #include "menu.h" #include "pokemon_summary_screen.h" #include "type_icons.h" +#include "pokedex.h" static void PlayerBufferExecCompleted(u32 battler); static void PlayerHandleLoadMonSprite(u32 battler); @@ -99,6 +100,9 @@ static void Task_UpdateLvlInHealthbox(u8); static void PrintLinkStandbyMsg(void); static void ReloadMoveNames(u32 battler); +static u32 CheckTypeEffectiveness(u32 targetId, u32 battler); +static u32 CheckTargetTypeEffectiveness(u32 battler); +static void MoveSelectionDisplayMoveEffectiveness(u32 foeEffectiveness, u32 battler); static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = { @@ -502,6 +506,8 @@ void HandleInputChooseTarget(u32 battler) i++; break; } + if (B_SHOW_EFFECTIVENESS) + MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(GetBattlerPosition(gMultiUsePlayerCursor), battler), battler); if (gAbsentBattlerFlags & (1u << gMultiUsePlayerCursor) || !CanTargetBattler(battler, gMultiUsePlayerCursor, move) @@ -551,6 +557,8 @@ void HandleInputChooseTarget(u32 battler) i++; break; } + if (B_SHOW_EFFECTIVENESS) + MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(GetBattlerPosition(gMultiUsePlayerCursor), battler), battler); if (gAbsentBattlerFlags & (1u << gMultiUsePlayerCursor) || !CanTargetBattler(battler, gMultiUsePlayerCursor, move) @@ -749,6 +757,8 @@ void HandleInputChooseMove(u32 battler) gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); else gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + if (B_SHOW_EFFECTIVENESS) + MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(GetBattlerPosition(gMultiUsePlayerCursor), battler), battler); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_ShowAsMoveTarget; break; @@ -785,6 +795,8 @@ void HandleInputChooseMove(u32 battler) gMoveSelectionCursor[battler] ^= 1; PlaySE(SE_SELECT); MoveSelectionCreateCursorAt(gMoveSelectionCursor[battler], 0); + if (B_SHOW_EFFECTIVENESS) + MoveSelectionDisplayMoveEffectiveness(CheckTargetTypeEffectiveness(battler), battler); MoveSelectionDisplayPpNumber(battler); MoveSelectionDisplayMoveType(battler); TryMoveSelectionDisplayMoveDescription(battler); @@ -800,6 +812,8 @@ void HandleInputChooseMove(u32 battler) gMoveSelectionCursor[battler] ^= 1; PlaySE(SE_SELECT); MoveSelectionCreateCursorAt(gMoveSelectionCursor[battler], 0); + if (B_SHOW_EFFECTIVENESS) + MoveSelectionDisplayMoveEffectiveness(CheckTargetTypeEffectiveness(battler), battler); MoveSelectionDisplayPpNumber(battler); MoveSelectionDisplayMoveType(battler); TryMoveSelectionDisplayMoveDescription(battler); @@ -814,6 +828,8 @@ void HandleInputChooseMove(u32 battler) gMoveSelectionCursor[battler] ^= 2; PlaySE(SE_SELECT); MoveSelectionCreateCursorAt(gMoveSelectionCursor[battler], 0); + if (B_SHOW_EFFECTIVENESS) + MoveSelectionDisplayMoveEffectiveness(CheckTargetTypeEffectiveness(battler), battler); MoveSelectionDisplayPpNumber(battler); MoveSelectionDisplayMoveType(battler); TryMoveSelectionDisplayMoveDescription(battler); @@ -829,6 +845,8 @@ void HandleInputChooseMove(u32 battler) gMoveSelectionCursor[battler] ^= 2; PlaySE(SE_SELECT); MoveSelectionCreateCursorAt(gMoveSelectionCursor[battler], 0); + if (B_SHOW_EFFECTIVENESS) + MoveSelectionDisplayMoveEffectiveness(CheckTargetTypeEffectiveness(battler), battler); MoveSelectionDisplayPpNumber(battler); MoveSelectionDisplayMoveType(battler); TryMoveSelectionDisplayMoveDescription(battler); @@ -866,6 +884,8 @@ void HandleInputChooseMove(u32 battler) ClearStdWindowAndFrame(B_WIN_MOVE_DESCRIPTION, FALSE); CopyWindowToVram(B_WIN_MOVE_DESCRIPTION, COPYWIN_GFX); PlaySE(SE_SELECT); + if (B_SHOW_EFFECTIVENESS) + MoveSelectionDisplayMoveEffectiveness(CheckTargetTypeEffectiveness(battler), battler); MoveSelectionDisplayPpNumber(battler); MoveSelectionDisplayMoveType(battler); } @@ -900,6 +920,8 @@ static void ReloadMoveNames(u32 battler) MoveSelectionDestroyCursorAt(battler); MoveSelectionDisplayMoveNames(battler); MoveSelectionCreateCursorAt(gMoveSelectionCursor[battler], 0); + if (B_SHOW_EFFECTIVENESS) + MoveSelectionDisplayMoveEffectiveness(CheckTargetTypeEffectiveness(battler), battler); MoveSelectionDisplayPpNumber(battler); MoveSelectionDisplayMoveType(battler); } @@ -1052,7 +1074,10 @@ void HandleMoveSwitching(u32 battler) gBattlerControllerFuncs[battler] = HandleInputChooseMove; gMoveSelectionCursor[battler] = gMultiUsePlayerCursor; MoveSelectionCreateCursorAt(gMoveSelectionCursor[battler], 0); - MoveSelectionDisplayPpString(battler); + if (B_SHOW_EFFECTIVENESS) + MoveSelectionDisplayMoveEffectiveness(CheckTargetTypeEffectiveness(battler), battler); + else + MoveSelectionDisplayPpString(battler); MoveSelectionDisplayPpNumber(battler); MoveSelectionDisplayMoveType(battler); AssignUsableZMoves(battler, moveInfo->moves); @@ -1063,7 +1088,10 @@ void HandleMoveSwitching(u32 battler) MoveSelectionDestroyCursorAt(gMultiUsePlayerCursor); MoveSelectionCreateCursorAt(gMoveSelectionCursor[battler], 0); gBattlerControllerFuncs[battler] = HandleInputChooseMove; - MoveSelectionDisplayPpString(battler); + if (B_SHOW_EFFECTIVENESS) + MoveSelectionDisplayMoveEffectiveness(CheckTargetTypeEffectiveness(battler), battler); + else + MoveSelectionDisplayPpString(battler); MoveSelectionDisplayPpNumber(battler); MoveSelectionDisplayMoveType(battler); } @@ -2152,7 +2180,10 @@ void InitMoveSelectionsVarsAndStrings(u32 battler) MoveSelectionDisplayMoveNames(battler); gMultiUsePlayerCursor = 0xFF; MoveSelectionCreateCursorAt(gMoveSelectionCursor[battler], 0); - MoveSelectionDisplayPpString(battler); + if (B_SHOW_EFFECTIVENESS) + MoveSelectionDisplayMoveEffectiveness(CheckTargetTypeEffectiveness(battler), battler); + else + MoveSelectionDisplayPpString(battler); MoveSelectionDisplayPpNumber(battler); MoveSelectionDisplayMoveType(battler); } @@ -2386,3 +2417,100 @@ static void PlayerHandleBattleDebug(u32 battler) SetMainCallback2(CB2_BattleDebugMenu); gBattlerControllerFuncs[battler] = Controller_WaitForDebug; } + +// Order based numerically, with EFFECTIVENESS_CANNOT_VIEW at 0 to always prioritize any other effectiveness during comparison +enum +{ + EFFECTIVENESS_CANNOT_VIEW, + EFFECTIVENESS_NO_EFFECT, + EFFECTIVENESS_NOT_VERY_EFFECTIVE, + EFFECTIVENESS_NORMAL, + EFFECTIVENESS_SUPER_EFFECTIVE, +}; + +static bool32 ShouldShowTypeEffectiveness(u32 targetId) +{ + if (B_SHOW_EFFECTIVENESS == SHOW_EFFECTIVENESS_CAUGHT) + return GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[targetId].species), FLAG_GET_CAUGHT); + + if (B_SHOW_EFFECTIVENESS == SHOW_EFFECTIVENESS_SEEN) + return GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[targetId].species), FLAG_GET_SEEN); + + return TRUE; +} + +static u32 CheckTypeEffectiveness(u32 targetId, u32 battler) +{ + struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleResources->bufferA[battler][4]); + struct Pokemon *mon = &gPlayerParty[gBattlerPartyIndexes[battler]]; + u32 move = moveInfo->moves[gMoveSelectionCursor[battler]]; + u32 moveType = CheckDynamicMoveType(mon, move, battler); + uq4_12_t modifier = CalcTypeEffectivenessMultiplier(move, moveType, battler, targetId, GetBattlerAbility(targetId), FALSE); + + if (!ShouldShowTypeEffectiveness(targetId)) + return EFFECTIVENESS_CANNOT_VIEW; + + if (modifier == UQ_4_12(0.0)) + return EFFECTIVENESS_NO_EFFECT; // No effect + else if (modifier <= UQ_4_12(0.5)) + return EFFECTIVENESS_NOT_VERY_EFFECTIVE; // Not very effective + else if (modifier >= UQ_4_12(2.0)) + return EFFECTIVENESS_SUPER_EFFECTIVE; // Super effective + return EFFECTIVENESS_NORMAL; // Normal effectiveness +} + +static u32 CheckTargetTypeEffectiveness(u32 battler) +{ + u32 battlerFoe = BATTLE_OPPOSITE(GetBattlerPosition(battler)); + u32 foeEffectiveness = CheckTypeEffectiveness(battlerFoe, battler); + + if (IsDoubleBattle()) + { + u32 partnerFoe = BATTLE_PARTNER(battlerFoe); + u32 partnerFoeEffectiveness = CheckTypeEffectiveness(partnerFoe, battler); + if (!IsBattlerAlive(battlerFoe)) + return partnerFoeEffectiveness; + if (IsBattlerAlive(battlerFoe) && IsBattlerAlive(partnerFoe) + && partnerFoeEffectiveness > foeEffectiveness) + return partnerFoeEffectiveness; + } + return foeEffectiveness; // fallthrough for any other circumstance +} + +static void MoveSelectionDisplayMoveEffectiveness(u32 foeEffectiveness, u32 battler) +{ + static const u8 noIcon[] = _(""); + static const u8 effectiveIcon[] = _("{CIRCLE_HOLLOW}"); + static const u8 superEffectiveIcon[] = _("{CIRCLE_DOT}"); + static const u8 notVeryEffectiveIcon[] = _("{TRIANGLE}"); + static const u8 immuneIcon[] = _("{BIG_MULT_X}"); + struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleResources->bufferA[battler][4]); + u8 *txtPtr; + + txtPtr = StringCopy(gDisplayedStringBattle, gText_MoveInterfacePP); + + if (!IsBattleMoveStatus(moveInfo->moves[gMoveSelectionCursor[battler]])) + { + switch (foeEffectiveness) + { + case EFFECTIVENESS_SUPER_EFFECTIVE: + StringCopy(txtPtr, superEffectiveIcon); + break; + case EFFECTIVENESS_NOT_VERY_EFFECTIVE: + StringCopy(txtPtr, notVeryEffectiveIcon); + break; + case EFFECTIVENESS_NO_EFFECT: + StringCopy(txtPtr, immuneIcon); + break; + case EFFECTIVENESS_NORMAL: + StringCopy(txtPtr, effectiveIcon); + break; + default: + case EFFECTIVENESS_CANNOT_VIEW: + StringCopy(txtPtr, noIcon); + break; + } + } + + BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_PP); +} diff --git a/src/battle_message.c b/src/battle_message.c index cf25e7c221..2887e1512e 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -1635,9 +1635,9 @@ static const struct BattleWindowText sTextOnWindowsInfo_Normal[] = .x = 0, .y = 1, .speed = 0, - .fgColor = 12, + .fgColor = B_SHOW_EFFECTIVENESS != SHOW_EFFECTIVENESS_NEVER ? 13 : 12, .bgColor = 14, - .shadowColor = 11, + .shadowColor = B_SHOW_EFFECTIVENESS != SHOW_EFFECTIVENESS_NEVER ? 15 : 11, }, [B_WIN_DUMMY] = { .fillValue = PIXEL_FILL(0xE), @@ -1887,9 +1887,9 @@ static const struct BattleWindowText sTextOnWindowsInfo_Arena[] = .x = 0, .y = 1, .speed = 0, - .fgColor = 12, + .fgColor = B_SHOW_EFFECTIVENESS != SHOW_EFFECTIVENESS_NEVER ? 13 : 12, .bgColor = 14, - .shadowColor = 11, + .shadowColor = B_SHOW_EFFECTIVENESS != SHOW_EFFECTIVENESS_NEVER ? 15 : 11, }, [B_WIN_DUMMY] = { .fillValue = PIXEL_FILL(0xE), diff --git a/src/fonts.c b/src/fonts.c index 853f6fbde2..46f3a335c4 100644 --- a/src/fonts.c +++ b/src/fonts.c @@ -19,7 +19,7 @@ ALIGNED(4) const u8 gFontSmallNarrowLatinGlyphWidths[] = { 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 3, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 8, 3, 3, 3, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 3, 3, 3, 3, 3, 3, 3, 3, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, @@ -55,7 +55,7 @@ ALIGNED(4) const u8 gFontSmallLatinGlyphWidths[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 7, 5, 5, 5, 5, 5, 5, 9, 3, 3, 3, 8, 3, 3, 3, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 3, 3, 3, 3, 3, 3, 3, 3, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, @@ -91,7 +91,7 @@ ALIGNED(4) const u8 gFontNarrowLatinGlyphWidths[] = { 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 3, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 8, 3, 3, 3, 3, 10, 10, 10, 10, 8, 8, 10, 8, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 3, 3, 3, 3, 3, 3, 3, 3, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, @@ -127,7 +127,7 @@ ALIGNED(4) const u8 gFontShortLatinGlyphWidths[] = { 5, 6, 5, 6, 6, 6, 5, 5, 5, 6, 6, 6, 6, 6, 6, 8, 5, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 8, 3, 3, 3, 3, 12, 12, 12, 12, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 3, 3, 3, 3, 3, 3, 3, 3, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, @@ -163,7 +163,7 @@ ALIGNED(4) const u8 gFontNormalLatinGlyphWidths[] = { 4, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 8, 3, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 8, 3, 3, 3, 3, 10, 10, 10, 10, 8, 10, 10, 8, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 3, 3, 3, 3, 3, 3, 3, 3, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, @@ -199,7 +199,7 @@ ALIGNED(4) const u8 gFontNarrowerLatinGlyphWidths[] = { 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 2, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 8, 3, 3, 3, 3, 10, 10, 10, 10, 8, 8, 10, 8, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 3, 3, 3, 3, 3, 3, 3, 3, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, @@ -235,7 +235,7 @@ ALIGNED(4) const u8 gFontSmallNarrowerLatinGlyphWidths[] = { 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 2, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 8, 3, 3, 3, 3, 8, 8, 8, 8, 8, 7, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 3, 3, 3, 3, 3, 3, 3, 3, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, @@ -271,7 +271,7 @@ ALIGNED(4) const u8 gFontShortNarrowLatinGlyphWidths[] = { 4, 6, 5, 5, 5, 5, 5, 5, 4, 5, 5, 6, 4, 5, 5, 8, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 8, 3, 3, 3, 3, 12, 12, 12, 12, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 3, 3, 3, 3, 3, 3, 3, 3, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, @@ -307,7 +307,7 @@ ALIGNED(4) const u8 gFontShortNarrowerLatinGlyphWidths[] = { 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10, 10, 10, 10, 8, 8, 10, 8, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 3, 3, 3, 3, 3, 3, 3, 3, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,