InsanichessGame.fromICString constructor

InsanichessGame.fromICString(
  1. String s
)

Returns new InsanichessGame object from ICString representation s.

Implementation

factory InsanichessGame.fromICString(String s) {
  final List<String> lines = s.split('\n');

  final List<String> timeControlStringList = lines[2].split(' ');
  final List<String> remainingTimeStringList = lines[3].split(' ');
  final List<String> timesPerMoveStringList = lines[4].split(' ');

  final InsanichessGame game = InsanichessGame.fromPosition(
    id: lines[0],
    whitePlayer: const InsanichessPlayer.testWhite(),
    blackPlayer: const InsanichessPlayer.testBlack(),
    timeControl: InsanichessTimeControl(
      initialTime: Duration(seconds: int.parse(timeControlStringList.first)),
      incrementPerMove:
          Duration(seconds: int.parse(timeControlStringList.last)),
    ),
    timesSpentPerMove: timesPerMoveStringList
        .map<Duration>((String s) => Duration(milliseconds: int.parse(s)))
        .toList(),
    remainingTimeWhite:
        Duration(milliseconds: int.parse(remainingTimeStringList.first)),
    remainingTimeBlack:
        Duration(milliseconds: int.parse(remainingTimeStringList.last)),
    position: insanichess.Board.initialPosition,
  );

  for (int i = 6; i < lines.length; i++) {
    final List<String> splittedLine = lines[i].trim().split(' ');
    if (splittedLine.first.isEmpty) break;

    game.move(insanichess.Move.fromICString(splittedLine.first));
    if (splittedLine.length > 1) {
      game.move(insanichess.Move.fromICString(splittedLine.last));
    }
  }

  // If the status was not automatically resolved, the status is therefore
  // a draw.
  if (game.inProgress) {
    game.draw();
  }

  return game;
}