Type Effectiveness Indicators when selecting moves (#6559)

This commit is contained in:
agsmgmaster64
2025-04-11 19:03:45 -04:00
committed by GitHub
parent c1ad43b1cc
commit 1344d8e9dd
14 changed files with 151 additions and 16 deletions

View File

@@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -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.

View File

@@ -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);
}

View File

@@ -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),

View File

@@ -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,