in csrc/SmartBot.cc [1122:1164]
void SmartBot::pleaseMakeMove(Server &server)
{
server_ = &server;
assert(server.whoAmI() == me_);
assert(server.activePlayer() == me_);
assert(UseMulligans || !server.mulligansUsed());
if (server.cardsRemainingInDeck() == 0) {
if (maybePlayLowestPlayableCard(server)) return;
if (maybePlayMysteryCard(server)) return;
}
if (maybeGiveValuableWarning(server)) return;
if (maybeDiscardFinesse(server)) return;
if (maybePlayLowestPlayableCard(server)) return;
if (maybeGiveHelpfulHint(server)) return;
if (maybePlayMysteryCard(server)) return;
/* We couldn't find a good hint to give, or else we're out of hint-stones.
* Discard a card. However, discarding is not allowed when we have all
* the hint stones, so in that case, just hint to the player on our right
* about his oldest card. */
if (!server.discardingIsAllowed()) {
const int numPlayers = server.numPlayers();
const int right_partner = (me_ + numPlayers - 1) % numPlayers;
server.pleaseGiveValueHint(right_partner, server.handOfPlayer(right_partner)[0].value);
} else {
if (maybeDiscardWorthlessCard(server)) return;
if (maybeDiscardOldCard(server)) return;
/* In this unfortunate case, which still happens fairly often, I find
* that my whole hand is composed of valuable cards, and I just have
* to discard the one of them that will block our progress the least. */
int best_index = 0;
for (int i=0; i < myHandSize_; ++i) {
assert(handKnowledge_[me_][i].valuable() == YES || permissive_); // FIXME: I'm not sure why this should ever fire...
if (handKnowledge_[me_][i].value() > handKnowledge_[me_][best_index].value()) {
best_index = i;
}
}
server.pleaseDiscard(best_index);
}
}