|
1 | | -import { Color } from 'chess.ts' |
| 1 | +import { Chess, Color } from 'chess.ts' |
2 | 2 | import { StockfishEvaluation, MaiaEvaluation } from '.' |
3 | 3 | import { MOVE_CLASSIFICATION_THRESHOLDS } from 'src/constants/analysis' |
4 | 4 | import { calculateMoveColor } from 'src/hooks/useAnalysisController/utils' |
@@ -48,7 +48,7 @@ export class GameNode { |
48 | 48 | this._excellentMove = false |
49 | 49 | this._bestMove = false |
50 | 50 | this._turn = this.parseTurn(fen) |
51 | | - this._check = fen.includes('+') |
| 51 | + this._check = this.parseCheck(fen) |
52 | 52 | this._moveNumber = this.parseMoveNumber(fen, this._turn) |
53 | 53 | this._time = time |
54 | 54 | this._color = null |
@@ -108,12 +108,31 @@ export class GameNode { |
108 | 108 |
|
109 | 109 | private parseTurn(fen: string): Color { |
110 | 110 | const parts = fen.split(' ') |
111 | | - return parts[1] as Color |
| 111 | + if (parts[1] === 'w' || parts[1] === 'b') { |
| 112 | + return parts[1] |
| 113 | + } |
| 114 | + |
| 115 | + return 'w' |
112 | 116 | } |
113 | 117 |
|
114 | 118 | private parseMoveNumber(fen: string, turn: string): number { |
115 | 119 | const parts = fen.split(' ') |
116 | | - return parseInt(parts[5]) - (turn === 'w' ? 1 : 0) |
| 120 | + const fullMoveNumber = parseInt(parts[5], 10) |
| 121 | + |
| 122 | + if (Number.isNaN(fullMoveNumber)) { |
| 123 | + return 1 |
| 124 | + } |
| 125 | + |
| 126 | + return fullMoveNumber - (turn === 'w' ? 1 : 0) |
| 127 | + } |
| 128 | + |
| 129 | + private parseCheck(fen: string): boolean { |
| 130 | + try { |
| 131 | + const chess = new Chess(fen) |
| 132 | + return chess.inCheck() |
| 133 | + } catch { |
| 134 | + return false |
| 135 | + } |
117 | 136 | } |
118 | 137 |
|
119 | 138 | private performMoveClassification( |
|
0 commit comments