card types:
trash, playable, useful (dispensable), critical


pace          := #(cards left in deck) + #players - #(cards left to play)
modified_pace := pace - #(players without useful cards)
endgame       := #(cards left to play) - #(cards left in deck)   = #players - pace
  -> endgame >= 0    iff   pace <= #players
in_endgame    := endgame >= 0

discard_badness(card) :=
  1               if trash
  8 - #players    if card useful but duplicate visible         # TODO: should probably account for rank of card as well, currently, lowest one is chosen
  80 - 10*rank    if card is not critical but currently unique # this ensures we prefer to discard higher ranked cards
  600 - 100*rank  if only criticals in hand                    # essentially not relevant, since we are currently only optimizing for full score 
  
 
Algorithm: 

if (have playable card):
  if (in endgame) and not (in extraround):
    stall in the following situations:
      - we have exactly one useful card, it is a 5, and a copy of each useful card is visible
      - we have exactly one useful card, it is a 4, the player with the matching 5 has another critical card to play
      - we have exactly one useful card (todo: maybe use critical here?), the deck has size 1, someone else has 2 crits
      - we have exactly one playable card, it is a 4, and a further useful card, but the playable is redistributable in the following sense:
          the other playing only has this one useful card, and the player holding the matching 5 sits after the to-be-redistributed player
      - sth else that seems messy and is currently not understood, ignored for now
  TODO: maybe introduce some midgame stalls here, since we know the deck?
  play a card, matching the first of the following criteria. if several cards match, recurse with this set of cards
    - if in extraround, play crit
    - if in second last round and we have 2 crits, play crit
    - play card with lowest rank
    - play a critical card
    - play unique card, i.e. not visible
    - lowest suit index (for determinancy)

if 8 hints:
  give a hint

if 0 hints:
  discard card with lowest badness

stall in the following situations:
  - #(cards in deck) == 2 and (card of rank 3 or lower is missing) and we have the connecting card
  - #clues >= 8 - #(useful cards in hand), there are useful cards in the deck and either:
    - the next player has no useful cards at all
    - we have two more crits than the next player and they have trash
  - we are in endgame and the deck only contains one card
  - it is possible that no-one discards in the following round and we are not waiting for a card whose rank is smaller than pace   // TODO: this feels like a weird condition

discard if (discard badness) + #hints < 10

stall if someone has a better discard