diff options
Diffstat (limited to 'server/player.cpp')
-rw-r--r-- | server/player.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/server/player.cpp b/server/player.cpp index 4407095..37dc3bc 100644 --- a/server/player.cpp +++ b/server/player.cpp @@ -36,6 +36,9 @@ Actions Game::Player::get_actions_draw() { if(!riichi) { // Check if player can riichi. + if(can_riichi()) { + possible_actions.push_back(Action(Action::Riichi)); + } // List all tiles that can be discarded. for(std::size_t i = 0; i < hand.size(); i++) { @@ -89,6 +92,31 @@ Actions Game::Player::get_actions_discard(Tile tile, PlayerNum discarder) { return possible_actions; } +bool Game::Player::can_riichi() { + if(open) { + return false; + } + + Tiles tiles = hand; + + // Take first tile out of the set. + Tile out = tiles.front(); + tiles.erase(tiles.begin()); + + // Iterate over the rest of the set, exchanging the tile until a tenpai is found or all is tested. + for(Tiles::iterator it = tiles.begin(); it != tiles.end(); it++) { + if(Hand::tenpai(tiles)) { + return true; + } + + // TODO: Skip unnecessary tests if player got several equal tiles on hand. + + std::swap(*it, out); + } + + return false; +} + Game::Player::Targets Game::Player::can_chi(Tile tile) { Targets targets; |