111 lines
2.7 KiB
C++
111 lines
2.7 KiB
C++
// Copyright (c) 2022 Dominic Masters
|
|
//
|
|
// This software is released under the MIT License.
|
|
// https://opensource.org/licenses/MIT
|
|
|
|
#include "PokerPot.hpp"
|
|
#include "PokerGame.hpp"
|
|
#include "PokerPlayer.hpp"
|
|
|
|
using namespace Dawn;
|
|
|
|
void PokerPotWinning::award() {
|
|
auto it = this->winners.begin();
|
|
while(it != this->winners.end()) {
|
|
if(it == this->winners.begin()) {
|
|
(*it)->addChips(this->chipsEach + this->chipsOverflow);
|
|
} else {
|
|
(*it)->addChips(this->chipsEach);
|
|
}
|
|
++it;
|
|
}
|
|
}
|
|
|
|
struct PokerPotWinning PokerPot::getWinners(PokerGame *game) {
|
|
struct PokerPotWinning winning;
|
|
|
|
winning.pot = this;
|
|
|
|
// Calculate the winnings first.
|
|
auto it = this->players.begin();
|
|
while(it != this->players.end()) {
|
|
auto player = *it;
|
|
|
|
if(player->isOut || player->isFolded) {
|
|
++it;
|
|
continue;
|
|
}
|
|
|
|
winning.participants.push_back(player);
|
|
winning.winnings[player] = player->getWinning();
|
|
++it;
|
|
}
|
|
|
|
// Compare participating players
|
|
auto it2 = winning.participants.begin();
|
|
while(it2 != winning.participants.end()) {
|
|
auto playerLeft = *it2;
|
|
auto winnerLeft = &winning.winnings[playerLeft];
|
|
bool_t isWinner = true;
|
|
enum CardValue highNumber = CARD_VALUE_INVALD;
|
|
enum CardValue number = CARD_VALUE_INVALD;
|
|
struct Card highCard(0xFF);
|
|
struct Card card(0xFF);
|
|
|
|
auto it3 = winning.participants.begin();
|
|
while(it3 != winning.participants.end()) {
|
|
if(it2 == it3) {
|
|
++it3;
|
|
continue;
|
|
}
|
|
|
|
auto playerRight = *it3;
|
|
auto winnerRight = &winning.winnings[playerRight];
|
|
|
|
// Am I the better hand / Is it the better hand?
|
|
if(winnerLeft->type < winnerRight->type) {
|
|
++it3;
|
|
continue;
|
|
}
|
|
if(winnerLeft->type > winnerRight->type) {
|
|
isWinner = false;
|
|
break;
|
|
}
|
|
|
|
// Equal, compare hands.
|
|
card = PokerWinning::compare(winnerLeft, winnerRight);
|
|
if(card.cardValue == 0xFF) {
|
|
isWinner = false;
|
|
break;
|
|
}
|
|
|
|
// Determine high card.
|
|
number = card.getValue();
|
|
if(
|
|
highNumber == CARD_VALUE_INVALD ||
|
|
number == CARD_ACE ||
|
|
number > highNumber
|
|
) {
|
|
highCard = card;
|
|
highNumber = number;
|
|
}
|
|
++it3;
|
|
}
|
|
|
|
if(!isWinner) {
|
|
++it2;
|
|
continue;
|
|
}
|
|
|
|
winnerLeft->kicker = highCard;
|
|
winning.winners.push_back(playerLeft);
|
|
++it2;
|
|
}
|
|
|
|
winning.chipsEach = this->chips / (int32_t)winning.winners.size();
|
|
winning.chipsOverflow = this->chips - (
|
|
winning.chipsEach * (int32_t)winning.winners.size()
|
|
);
|
|
|
|
return winning;
|
|
} |