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.
- package/esm2022/lib/components/organisms/mini-games/chessimals-engine.mjs +109 -16
- package/esm2022/lib/components/organisms/mini-games/mini-games.i18n.mjs +45 -9
- package/esm2022/lib/components/organisms/mini-games/types.mjs +1 -1
- package/esm2022/lib/version.mjs +2 -2
- package/fesm2022/valtech-components.mjs +153 -24
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/mini-games/chessimals-game.component.d.ts +1 -1
- package/lib/components/organisms/mini-games/types.d.ts +1 -1
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -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.
|
|
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
|
|
61130
|
-
.map((move) => ({ move, score:
|
|
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
|
|
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
|
|
62490
|
-
chessimalsRuleBull: 'Toro: se mueve
|
|
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
|
|
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
|
|
62851
|
-
chessimalsRuleBull: 'Bull: moves
|
|
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
|
|
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',
|