summaryrefslogtreecommitdiff
path: root/server/player.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'server/player.cpp')
-rw-r--r--server/player.cpp28
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;