Hand constructor

Hand(
  1. List cards,
  2. String name,
  3. Game game,
  4. bool? canDisqualify,
)

Implementation

Hand(List<dynamic> cards, this.name, this.game, bool? canDisqualify) {
  cardPool = [];
  this.cards = [];
  suits = {};
  values = List.generate(14, (index) => []);
  wilds = [];
  sfLength = 0;
  alwaysQualifies = true;

  if (canDisqualify == true && game.lowestQualified != null) {
    alwaysQualifies = false;
  }

  if (game.descr == 'standard' && Set.from(cards).length != cards.length) {
    throw Error();
  }

  var handRank = game.handValues.length;
  var i = 0;
  for (; i < game.handValues.length; i++) {
    if (game.handValues[i] == runtimeType) {
      break;
    }
  }
  rank = handRank - i;

  cardPool = cards.map((c) => (c is String) ? Card(c) : c as Card).toList();

  for (var i = 0; i < cardPool.length; i++) {
    var card = cardPool[i];
    if (card.value == game.wildValue) {
      card.rank = -1;
    }
  }
  cardPool.sort((a, b) => Card.sort(a, b));

  for (var i = 0; i < cardPool.length; i++) {
    var card = cardPool[i];
    if (card.rank == -1) {
      wilds.add(card);
    } else {
      suits.putIfAbsent(card.suit, () => []);
      suits[card.suit]!.add(card);
      values[card.rank].add(card);
    }
  }

  values = List.from(values.reversed);
  isPossible = solve();
}