Position.fromFen constructor

Position.fromFen(
  1. String fen
)

Implementation

factory Position.fromFen(String fen) {
  final p = Position();
  final parts = fen.trim().split(RegExp(r'\s+'));
  final placement = parts[0];
  var rank = 7, file = 0;
  for (final ch in placement.split('')) {
    if (ch == '/') {
      rank--;
      file = 0;
    } else if (RegExp(r'[1-8]').hasMatch(ch)) {
      file += int.parse(ch);
    } else {
      final color = ch == ch.toUpperCase() ? white : black;
      final type = _pieceTypeFromChar(ch.toLowerCase());
      p._addPiece(color, type, rank * 8 + file);
      file++;
    }
  }
  p.turn = (parts.length > 1 && parts[1] == 'b') ? black : white;
  p.castling = 0;
  if (parts.length > 2 && parts[2] != '-') {
    for (final c in parts[2].split('')) {
      switch (c) {
        case 'K':
          p.castling |= castleWK;
        case 'Q':
          p.castling |= castleWQ;
        case 'k':
          p.castling |= castleBK;
        case 'q':
          p.castling |= castleBQ;
      }
    }
  }
  p.epSquare = (parts.length > 3 && parts[3] != '-')
      ? _squareFromName(parts[3])
      : -1;
  p.halfmove = parts.length > 4 ? int.tryParse(parts[4]) ?? 0 : 0;
  p.fullmove = parts.length > 5 ? int.tryParse(parts[5]) ?? 1 : 1;
  return p;
}