valtech-components 4.0.424 → 4.0.426

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -58,7 +58,7 @@ import fixWebmDuration from 'fix-webm-duration';
58
58
  * Current version of valtech-components.
59
59
  * This is automatically updated during the publish process.
60
60
  */
61
- const VERSION = '4.0.424';
61
+ const VERSION = '4.0.426';
62
62
 
63
63
  // Control de estado de refresco (singleton a nivel de módulo)
64
64
  let isRefreshing = false;
@@ -61029,18 +61029,66 @@ const CHESSIMALS_BOT_PROFILES = [
61029
61029
  labelKey: 'chessimalsBotSentinel',
61030
61030
  descriptionKey: 'chessimalsBotSentinelBody',
61031
61031
  },
61032
+ {
61033
+ id: 'oracle',
61034
+ difficulty: 'hard',
61035
+ avatar: '🔮',
61036
+ labelKey: 'chessimalsBotOracle',
61037
+ descriptionKey: 'chessimalsBotOracleBody',
61038
+ },
61039
+ {
61040
+ id: 'ambusher',
61041
+ difficulty: 'hard',
61042
+ avatar: '🪤',
61043
+ labelKey: 'chessimalsBotAmbusher',
61044
+ descriptionKey: 'chessimalsBotAmbusherBody',
61045
+ },
61046
+ {
61047
+ id: 'locksmith',
61048
+ difficulty: 'hard',
61049
+ avatar: '🔐',
61050
+ labelKey: 'chessimalsBotLocksmith',
61051
+ descriptionKey: 'chessimalsBotLocksmithBody',
61052
+ },
61053
+ {
61054
+ id: 'storm',
61055
+ difficulty: 'hard',
61056
+ avatar: '🌩️',
61057
+ labelKey: 'chessimalsBotStorm',
61058
+ descriptionKey: 'chessimalsBotStormBody',
61059
+ },
61060
+ {
61061
+ id: 'matriarch',
61062
+ difficulty: 'hard',
61063
+ avatar: '👑',
61064
+ labelKey: 'chessimalsBotMatriarch',
61065
+ descriptionKey: 'chessimalsBotMatriarchBody',
61066
+ },
61067
+ {
61068
+ id: 'endgame',
61069
+ difficulty: 'hard',
61070
+ avatar: '⌛',
61071
+ labelKey: 'chessimalsBotEndgame',
61072
+ descriptionKey: 'chessimalsBotEndgameBody',
61073
+ },
61032
61074
  ];
61033
61075
  const BOT_STYLES = {
61034
- explorer: { advancement: 1.05, capture: 0.82, safety: 0.62, power: 0.8, center: 1.15, unlock: 1.05, reply: 0.7, randomness: 260, spread: 0.68 },
61035
- impulsive: { advancement: 0.9, capture: 1.45, safety: 0.48, power: 1.15, center: 0.8, unlock: 0.9, reply: 0.55, randomness: 290, spread: 0.62 },
61036
- runner: { advancement: 1.55, capture: 0.78, safety: 0.5, power: 0.95, center: 0.7, unlock: 1.1, reply: 0.55, randomness: 250, spread: 0.6 },
61037
- hunter: { advancement: 0.95, capture: 1.45, safety: 0.9, power: 1.05, center: 0.95, unlock: 0.95, reply: 1, randomness: 90, spread: 0.3 },
61038
- guardian: { advancement: 0.88, capture: 1, safety: 1.45, power: 0.85, center: 1.05, unlock: 1, reply: 1.15, randomness: 70, spread: 0.26 },
61039
- jumper: { advancement: 1.12, capture: 1, safety: 0.92, power: 1.42, center: 1.18, unlock: 1.08, reply: 0.95, randomness: 95, spread: 0.32 },
61040
- strategist: { advancement: 1.05, capture: 1.08, safety: 1.22, power: 1.08, center: 1.16, unlock: 1.1, reply: 1.25, randomness: 22, spread: 0.14 },
61041
- predator: { advancement: 0.98, capture: 1.68, safety: 1.02, power: 1.34, center: 1, unlock: 1, reply: 1.12, randomness: 28, spread: 0.16 },
61042
- sprinter: { advancement: 1.72, capture: 0.9, safety: 0.95, power: 1.08, center: 0.86, unlock: 1.18, reply: 1, randomness: 26, spread: 0.15 },
61043
- sentinel: { advancement: 0.9, capture: 1.12, safety: 1.72, power: 0.95, center: 1.28, unlock: 1.05, reply: 1.38, randomness: 18, spread: 0.12 },
61076
+ explorer: { advancement: 1.05, capture: 0.82, safety: 0.62, power: 0.8, center: 1.15, unlock: 1.05, reply: 0.7, randomness: 260, spread: 0.68, mobility: 0.75, trap: 0.5, endgame: 0.55 },
61077
+ impulsive: { advancement: 0.9, capture: 1.45, safety: 0.48, power: 1.15, center: 0.8, unlock: 0.9, reply: 0.55, randomness: 290, spread: 0.62, mobility: 0.85, trap: 0.62, endgame: 0.5 },
61078
+ runner: { advancement: 1.55, capture: 0.78, safety: 0.5, power: 0.95, center: 0.7, unlock: 1.1, reply: 0.55, randomness: 250, spread: 0.6, mobility: 0.72, trap: 0.45, endgame: 1.1 },
61079
+ hunter: { advancement: 0.95, capture: 1.45, safety: 0.9, power: 1.05, center: 0.95, unlock: 0.95, reply: 1, randomness: 90, spread: 0.3, mobility: 0.95, trap: 0.82, endgame: 0.76 },
61080
+ guardian: { advancement: 0.88, capture: 1, safety: 1.45, power: 0.85, center: 1.05, unlock: 1, reply: 1.15, randomness: 70, spread: 0.26, mobility: 0.82, trap: 0.72, endgame: 0.72 },
61081
+ jumper: { advancement: 1.12, capture: 1, safety: 0.92, power: 1.42, center: 1.18, unlock: 1.08, reply: 0.95, randomness: 95, spread: 0.32, mobility: 1.15, trap: 0.9, endgame: 0.82 },
61082
+ strategist: { advancement: 1.05, capture: 1.08, safety: 1.22, power: 1.08, center: 1.16, unlock: 1.1, reply: 1.25, randomness: 22, spread: 0.14, mobility: 1.08, trap: 1.06, endgame: 1 },
61083
+ predator: { advancement: 0.98, capture: 1.68, safety: 1.02, power: 1.34, center: 1, unlock: 1, reply: 1.12, randomness: 28, spread: 0.16, mobility: 1.02, trap: 1.18, endgame: 0.82 },
61084
+ sprinter: { advancement: 1.72, capture: 0.9, safety: 0.95, power: 1.08, center: 0.86, unlock: 1.18, reply: 1, randomness: 26, spread: 0.15, mobility: 0.95, trap: 0.78, endgame: 1.42 },
61085
+ sentinel: { advancement: 0.9, capture: 1.12, safety: 1.72, power: 0.95, center: 1.28, unlock: 1.05, reply: 1.38, randomness: 18, spread: 0.12, mobility: 0.86, trap: 1.04, endgame: 0.84 },
61086
+ oracle: { advancement: 1, capture: 1.12, safety: 1.42, power: 1.1, center: 1.18, unlock: 1.08, reply: 1.8, randomness: 8, spread: 0.08, mobility: 1.06, trap: 1.22, endgame: 1.08 },
61087
+ ambusher: { advancement: 0.9, capture: 1.48, safety: 1.08, power: 1.46, center: 1.05, unlock: 1.02, reply: 1.32, randomness: 14, spread: 0.1, mobility: 1.12, trap: 1.72, endgame: 0.92 },
61088
+ locksmith: { advancement: 0.88, capture: 1.04, safety: 1.55, power: 1.02, center: 1.48, unlock: 1.12, reply: 1.52, randomness: 12, spread: 0.1, mobility: 1.58, trap: 1.24, endgame: 0.86 },
61089
+ storm: { advancement: 1.18, capture: 1.38, safety: 0.98, power: 1.62, center: 1.08, unlock: 1.18, reply: 1.22, randomness: 18, spread: 0.13, mobility: 1.36, trap: 1.28, endgame: 1.02 },
61090
+ matriarch: { advancement: 0.96, capture: 1.18, safety: 1.64, power: 1.18, center: 1.22, unlock: 1.08, reply: 1.66, randomness: 10, spread: 0.08, mobility: 1.02, trap: 1.36, endgame: 1 },
61091
+ endgame: { advancement: 1.46, capture: 1, safety: 1.28, power: 1.04, center: 0.94, unlock: 1.08, reply: 1.44, randomness: 10, spread: 0.09, mobility: 0.98, trap: 1.02, endgame: 1.86 },
61044
61092
  };
61045
61093
  const DEFAULT_BOT_PROFILE_BY_DIFFICULTY = {
61046
61094
  easy: 'explorer',
@@ -61126,8 +61174,17 @@ function chooseChessimalsBotMove(state, difficulty = 'normal', profileId = DEFAU
61126
61174
  if (moves.length === 0)
61127
61175
  return undefined;
61128
61176
  const style = BOT_STYLES[profileId] ?? BOT_STYLES[DEFAULT_BOT_PROFILE_BY_DIFFICULTY[difficulty]];
61129
- const scored = moves
61130
- .map((move) => ({ move, score: scoreBotMoveWithLookahead(state, move, difficulty, style) }))
61177
+ const quickScored = moves
61178
+ .map((move) => ({ move, score: scoreBotMove(state, move, difficulty, style) }))
61179
+ .sort((a, b) => b.score - a.score);
61180
+ const lookaheadLimit = difficulty === 'hard' ? 32 : difficulty === 'normal' ? 24 : 0;
61181
+ const scored = quickScored
61182
+ .map((item, index) => ({
61183
+ move: item.move,
61184
+ score: index < lookaheadLimit
61185
+ ? scoreBotMoveWithLookahead(state, item.move, difficulty, style)
61186
+ : item.score,
61187
+ }))
61131
61188
  .sort((a, b) => b.score - a.score);
61132
61189
  if (difficulty === 'easy') {
61133
61190
  const playable = scored.filter((item) => item.score > -3000);
@@ -61325,7 +61382,7 @@ function getPowerMoves(state, piece, animal) {
61325
61382
  const directions = getPowerDirections(animal);
61326
61383
  const moves = [];
61327
61384
  for (const direction of directions) {
61328
- for (let distance = 1; distance <= 3; distance += 1) {
61385
+ for (let distance = 1; distance < state.boardSize; distance += 1) {
61329
61386
  const target = {
61330
61387
  row: piece.position.row + direction.row * distance,
61331
61388
  col: piece.position.col + direction.col * distance,
@@ -61386,7 +61443,7 @@ function getKangarooMoves(state, piece) {
61386
61443
  }
61387
61444
  return moves;
61388
61445
  }
61389
- function scoreBotMove(state, move, difficulty, style) {
61446
+ function scoreBotMove(state, move, difficulty, style, includeTacticalPressure = true) {
61390
61447
  const color = state.currentTurn;
61391
61448
  const targetPiece = move.capturesPieceId
61392
61449
  ? activePieces(state).find((piece) => piece.id === move.capturesPieceId)
@@ -61412,6 +61469,14 @@ function scoreBotMove(state, move, difficulty, style) {
61412
61469
  score += 14 * style.power;
61413
61470
  if (wouldUnlockPower(state, color, move.to))
61414
61471
  score += 90 * style.unlock;
61472
+ if (includeTacticalPressure && state.boardSize <= 6) {
61473
+ score += countPowerReachAfterMove(state, move, color) * (difficulty === 'hard' ? 8 : 4) * style.mobility;
61474
+ score += countProtectedThreatsAfterMove(state, move, color) * (difficulty === 'hard' ? 36 : 18) * style.trap;
61475
+ score += scoreEndgamePressure(state, move, color) * style.endgame;
61476
+ }
61477
+ else {
61478
+ score += scoreEndgamePressure(state, move, color) * style.endgame;
61479
+ }
61415
61480
  if (difficulty === 'hard' && isSquareVulnerableAfterMove(state, move)) {
61416
61481
  score -= (targetPiece ? 80 : 140) * style.safety;
61417
61482
  }
@@ -61442,7 +61507,7 @@ function scoreBotMoveWithLookahead(state, move, difficulty, style) {
61442
61507
  score += centerControl * (difficulty === 'hard' ? 18 : 10) * style.center;
61443
61508
  }
61444
61509
  const opponentBestReply = opponentMoves
61445
- .map((opponentMove) => scoreBotMove(afterMove, opponentMove, difficulty, style))
61510
+ .map((opponentMove) => scoreBotMove(afterMove, opponentMove, difficulty, style, false))
61446
61511
  .sort((a, b) => b - a)[0];
61447
61512
  if (opponentBestReply) {
61448
61513
  const replyWeight = difficulty === 'easy' ? 0.12 : difficulty === 'normal' ? 0.32 : 0.48;
@@ -61454,6 +61519,34 @@ function scoreBotMoveWithLookahead(state, move, difficulty, style) {
61454
61519
  }
61455
61520
  return score;
61456
61521
  }
61522
+ function countPowerReachAfterMove(state, move, color) {
61523
+ try {
61524
+ const afterMove = applyChessimalsMove(state, move);
61525
+ const evaluationState = { ...afterMove, currentTurn: color };
61526
+ return getChessimalsAllLegalMoves(evaluationState, color).filter((nextMove) => nextMove.kind === 'power').length;
61527
+ }
61528
+ catch {
61529
+ return 0;
61530
+ }
61531
+ }
61532
+ function countProtectedThreatsAfterMove(state, move, color) {
61533
+ try {
61534
+ const afterMove = applyChessimalsMove(state, move);
61535
+ const evaluationState = { ...afterMove, currentTurn: color };
61536
+ const ourMoves = getChessimalsAllLegalMoves(evaluationState, color);
61537
+ const enemyPieces = activePieces(afterMove).filter((piece) => piece.color !== color && !piece.captured);
61538
+ return enemyPieces.filter((piece) => ourMoves.some((nextMove) => nextMove.capturesPieceId === piece.id)).length;
61539
+ }
61540
+ catch {
61541
+ return 0;
61542
+ }
61543
+ }
61544
+ function scoreEndgamePressure(state, move, color) {
61545
+ const remainingEnemyPieces = activePieces(state).filter((piece) => piece.color !== color && !piece.captured).length;
61546
+ const urgency = remainingEnemyPieces <= Math.max(2, Math.floor(state.boardSize / 2)) ? 1.6 : 1;
61547
+ const distanceToPromotion = color === 'white' ? move.to.row : state.boardSize - 1 - move.to.row;
61548
+ return Math.max(0, state.boardSize - distanceToPromotion) * 14 * urgency;
61549
+ }
61457
61550
  function pickNoisyBotMove(scored, spread) {
61458
61551
  if (scored.length === 0)
61459
61552
  return undefined;
@@ -62486,10 +62579,10 @@ const MINI_GAMES_I18N = {
62486
62579
  chessimalsRulePowersTitle: 'Cuándo se activan los poderes',
62487
62580
  chessimalsRulePowersBody: 'Tus cartas se desbloquean cuando uno de tus peones cruza la línea central o cuando un peón rival entra en tu mitad del tablero.',
62488
62581
  chessimalsRuleCardsTitle: 'Cartas de animales',
62489
- chessimalsRuleEagle: 'Águila: se mueve hasta 3 casillas en diagonal, hacia adelante o atrás.',
62490
- chessimalsRuleBull: 'Toro: se mueve hasta 3 casillas en línea recta, incluso hacia los lados.',
62582
+ chessimalsRuleEagle: 'Águila: se mueve en diagonal por todo el tablero, hacia adelante o atrás, sin entrar a la última fila.',
62583
+ chessimalsRuleBull: 'Toro: se mueve en línea recta por todo el tablero, incluso hacia los lados, sin entrar a la última fila.',
62491
62584
  chessimalsRuleKangaroo: 'Canguro: salta en L, como el caballo del ajedrez. Puede saltar por encima de piezas y caer libre o capturar una pieza rival.',
62492
- chessimalsRuleLion: 'León: se mueve hasta 3 casillas en cualquier dirección.',
62585
+ chessimalsRuleLion: 'León: se mueve en cualquier dirección por todo el tablero, sin entrar a la última fila.',
62493
62586
  chessimalsRuleLimitsTitle: 'Reglas de equilibrio',
62494
62587
  chessimalsRuleLimitsBody: 'Cada carta se usa una sola vez por partida. Ningún poder puede entrar directamente a la última fila: el paso final para ganar siempre debe ser un avance normal.',
62495
62588
  chessimalsBoardSize: 'Tamaño del tablero',
@@ -62602,6 +62695,18 @@ const MINI_GAMES_I18N = {
62602
62695
  chessimalsBotSprinterBody: 'Optimiza rutas de promoción.',
62603
62696
  chessimalsBotSentinel: 'Centinela',
62604
62697
  chessimalsBotSentinelBody: 'Defiende sólido y castiga errores.',
62698
+ chessimalsBotOracle: 'Oráculo',
62699
+ chessimalsBotOracleBody: 'Lee respuestas y evita trampas profundas.',
62700
+ chessimalsBotAmbusher: 'Emboscador',
62701
+ chessimalsBotAmbusherBody: 'Prepara capturas dobles con poderes largos.',
62702
+ chessimalsBotLocksmith: 'Cerrajero',
62703
+ chessimalsBotLocksmithBody: 'Cierra el centro y reduce tus rutas.',
62704
+ chessimalsBotStorm: 'Tormenta',
62705
+ chessimalsBotStormBody: 'Usa poderes largos para presionar todo el tablero.',
62706
+ chessimalsBotMatriarch: 'Matriarca',
62707
+ chessimalsBotMatriarchBody: 'Protege su estructura y gana por desgaste.',
62708
+ chessimalsBotEndgame: 'Finalista',
62709
+ chessimalsBotEndgameBody: 'Convierte ventajas pequeñas en promoción.',
62605
62710
  chessimalsBotExplorerTendency: 'Tiende a variar rutas, probar el centro y cometer errores suaves.',
62606
62711
  chessimalsBotImpulsiveTendency: 'Tiende a capturar rápido, incluso cuando puede quedar expuesto.',
62607
62712
  chessimalsBotRunnerTendency: 'Tiende a avanzar hacia la promoción antes que defender.',
@@ -62612,6 +62717,12 @@ const MINI_GAMES_I18N = {
62612
62717
  chessimalsBotPredatorTendency: 'Tiende a forzar capturas y usar poderes agresivos.',
62613
62718
  chessimalsBotSprinterTendency: 'Tiende a encontrar caminos rápidos de promoción.',
62614
62719
  chessimalsBotSentinelTendency: 'Tiende a defender sólido y castigar errores.',
62720
+ chessimalsBotOracleTendency: 'Tiende a anticipar respuestas y elegir jugadas difíciles de refutar.',
62721
+ chessimalsBotAmbusherTendency: 'Tiende a dejar piezas bajo amenaza múltiple antes de capturar.',
62722
+ chessimalsBotLocksmithTendency: 'Tiende a cortar rutas por el centro y dejarte sin buenas casillas.',
62723
+ chessimalsBotStormTendency: 'Tiende a convertir poderes largos en presión desde varios ángulos.',
62724
+ chessimalsBotMatriarchTendency: 'Tiende a conservar piezas y cambiar solo cuando queda mejor.',
62725
+ chessimalsBotEndgameTendency: 'Tiende a simplificar y correr hacia la promoción cuando ve ventaja.',
62615
62726
  chessimalsBotReportTitle: 'Reporte del bot',
62616
62727
  chessimalsBotReportVs: 'Contra {bot}',
62617
62728
  chessimalsBotReportBody: '{outcome}. Hizo {captures} capturas y usó {powers} poderes. {style}',
@@ -62659,7 +62770,7 @@ const MINI_GAMES_I18N = {
62659
62770
  chessimalsTutorialStep4Title: 'Devuelve el turno',
62660
62771
  chessimalsTutorialStep4Body: 'Mueve el peón negro de la columna F una casilla hacia abajo para continuar.',
62661
62772
  chessimalsTutorialStep5Title: 'Usa el poder Canguro',
62662
- chessimalsTutorialStep5Body: 'Selecciona la carta Canguro y salta en L para capturar el peón negro.',
62773
+ chessimalsTutorialStep5Body: 'Selecciona la carta Canguro y salta en L para capturar el peón negro. Las otras cartas pueden cruzar todo el tablero, pero ningún poder puede entrar a la última fila.',
62663
62774
  chessimalsTutorialStep6Title: 'Prepara la llegada',
62664
62775
  chessimalsTutorialStep6Body: 'Mueve el último peón negro hacia abajo. Después tendrás camino para ganar.',
62665
62776
  chessimalsTutorialStep7Title: 'Llega a la última fila',
@@ -62847,10 +62958,10 @@ const MINI_GAMES_I18N = {
62847
62958
  chessimalsRulePowersTitle: 'When powers unlock',
62848
62959
  chessimalsRulePowersBody: 'Your cards unlock when one of your pawns crosses the center line, or when a rival pawn enters your half of the board.',
62849
62960
  chessimalsRuleCardsTitle: 'Animal cards',
62850
- chessimalsRuleEagle: 'Eagle: moves up to 3 squares diagonally, forward or backward.',
62851
- chessimalsRuleBull: 'Bull: moves up to 3 squares in a straight line, including sideways.',
62961
+ chessimalsRuleEagle: 'Eagle: moves diagonally across the whole board, forward or backward, without entering the final row.',
62962
+ chessimalsRuleBull: 'Bull: moves in a straight line across the whole board, including sideways, without entering the final row.',
62852
62963
  chessimalsRuleKangaroo: 'Kangaroo: jumps in an L shape, like a chess knight. It can jump over pieces and land on an empty square or capture a rival piece.',
62853
- chessimalsRuleLion: 'Lion: moves up to 3 squares in any direction.',
62964
+ chessimalsRuleLion: 'Lion: moves in any direction across the whole board, without entering the final row.',
62854
62965
  chessimalsRuleLimitsTitle: 'Balance rules',
62855
62966
  chessimalsRuleLimitsBody: 'Each card can be used once per game. No power can land directly on the final row: the winning step must always be a normal forward move.',
62856
62967
  chessimalsBoardSize: 'Board size',
@@ -62963,6 +63074,18 @@ const MINI_GAMES_I18N = {
62963
63074
  chessimalsBotSprinterBody: 'Optimizes promotion routes.',
62964
63075
  chessimalsBotSentinel: 'Sentinel',
62965
63076
  chessimalsBotSentinelBody: 'Defends solidly and punishes mistakes.',
63077
+ chessimalsBotOracle: 'Oracle',
63078
+ chessimalsBotOracleBody: 'Reads replies and avoids deep traps.',
63079
+ chessimalsBotAmbusher: 'Ambusher',
63080
+ chessimalsBotAmbusherBody: 'Sets up double captures with long powers.',
63081
+ chessimalsBotLocksmith: 'Locksmith',
63082
+ chessimalsBotLocksmithBody: 'Closes the center and reduces your routes.',
63083
+ chessimalsBotStorm: 'Storm',
63084
+ chessimalsBotStormBody: 'Uses long powers to pressure the whole board.',
63085
+ chessimalsBotMatriarch: 'Matriarch',
63086
+ chessimalsBotMatriarchBody: 'Protects structure and wins by attrition.',
63087
+ chessimalsBotEndgame: 'Endgame',
63088
+ chessimalsBotEndgameBody: 'Turns small edges into promotion.',
62966
63089
  chessimalsBotExplorerTendency: 'Tends to vary routes, test the center, and make soft mistakes.',
62967
63090
  chessimalsBotImpulsiveTendency: 'Tends to capture quickly, even when it can become exposed.',
62968
63091
  chessimalsBotRunnerTendency: 'Tends to push toward promotion before defending.',
@@ -62973,6 +63096,12 @@ const MINI_GAMES_I18N = {
62973
63096
  chessimalsBotPredatorTendency: 'Tends to force captures and use aggressive powers.',
62974
63097
  chessimalsBotSprinterTendency: 'Tends to find fast promotion paths.',
62975
63098
  chessimalsBotSentinelTendency: 'Tends to defend solidly and punish mistakes.',
63099
+ chessimalsBotOracleTendency: 'Tends to anticipate replies and choose hard-to-refute moves.',
63100
+ chessimalsBotAmbusherTendency: 'Tends to leave pieces under multiple threats before capturing.',
63101
+ chessimalsBotLocksmithTendency: 'Tends to close central routes and leave you without good squares.',
63102
+ chessimalsBotStormTendency: 'Tends to turn long powers into pressure from several angles.',
63103
+ chessimalsBotMatriarchTendency: 'Tends to preserve pieces and trade only when it improves.',
63104
+ chessimalsBotEndgameTendency: 'Tends to simplify and race toward promotion when ahead.',
62976
63105
  chessimalsBotReportTitle: 'Bot report',
62977
63106
  chessimalsBotReportVs: 'Against {bot}',
62978
63107
  chessimalsBotReportBody: '{outcome}. It made {captures} captures and used {powers} powers. {style}',
@@ -63020,7 +63149,7 @@ const MINI_GAMES_I18N = {
63020
63149
  chessimalsTutorialStep4Title: 'Return the turn',
63021
63150
  chessimalsTutorialStep4Body: 'Move the black pawn on file F one square downward to continue.',
63022
63151
  chessimalsTutorialStep5Title: 'Use the Kangaroo power',
63023
- chessimalsTutorialStep5Body: 'Select the Kangaroo card and jump in an L shape to capture the black pawn.',
63152
+ chessimalsTutorialStep5Body: 'Select the Kangaroo card and jump in an L shape to capture the black pawn. The other cards can cross the whole board, but no power can enter the final row.',
63024
63153
  chessimalsTutorialStep6Title: 'Prepare the finish',
63025
63154
  chessimalsTutorialStep6Body: 'Move the last black pawn downward. Then your path to win is open.',
63026
63155
  chessimalsTutorialStep7Title: 'Reach the last row',