summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/game.h5
-rw-r--r--server/player.cpp42
2 files changed, 42 insertions, 5 deletions
diff --git a/server/game.h b/server/game.h
index f8d9ff4..bf7d37f 100644
--- a/server/game.h
+++ b/server/game.h
@@ -63,9 +63,12 @@ class Game : public boost::enable_shared_from_this<Game> {
//! Check if tile can be called for a pon.
int can_pon(Tile tile);
- //! Check if it's possible to make a concealed kan or extend an open kan.
+ //! Check if it's possible to make a concealed kan.
Targets can_kan();
+ //! Check if it's possible to extend a pon to a kan.
+ Targets can_kan_extend();
+
//! Check if tile can be called to kan target.
bool can_kan(Tile tile, int target);
diff --git a/server/player.cpp b/server/player.cpp
index b6776df..ae07360 100644
--- a/server/player.cpp
+++ b/server/player.cpp
@@ -36,12 +36,24 @@ Actions Game::Player::get_actions_draw() {
Actions possible_actions;
// Check if player can force a draw.
+ // TODO: Implementation. (Low priority)
+
// Check if player can tsumo.
if(can_tsumo()) {
possible_actions.push_back(Action(Action::Tsumo));
}
- // Check if player can declare a concealed kan or extend an open pon. List all possibilities.
+ // Check if player can declare a concealed kan.
+ Targets targets = can_kan();
+ for(Targets::iterator it = targets.begin(); it != targets.end(); it++) {
+ possible_actions.push_back(Action(Action::Kan, Action::Index, *it + 2));
+ }
+
+ // Check if player can extend an open pon.
+ targets = can_kan_extend();
+ for(Targets::iterator it = targets.begin(); it != targets.end(); it++) {
+ possible_actions.push_back(Action(Action::Kan, Action::Group, *it));
+ }
if(!riichi) {
// Check if player can riichi.
@@ -51,6 +63,11 @@ Actions Game::Player::get_actions_draw() {
// List all tiles that can be discarded.
for(std::size_t i = 0; i < hand.size(); i++) {
+ // Skip tiles already used to call kan.
+ if(possible_actions.contains(Action(Action::Kan, Action::Index, i))) {
+ continue;
+ }
+
possible_actions.push_back(Action(Action::Discard, Action::Index, i));
}
@@ -180,9 +197,26 @@ int Game::Player::can_pon(Tile tile) {
return -1;
}
-//Game::Player::Targets Game::Player::can_kan() {
-// return Targets(); // TODO
-//}
+Game::Player::Targets Game::Player::can_kan() {
+ Targets targets;
+
+ for(Tiles::iterator it = hand.begin(); it != hand.end(); it++) {
+ Tiles::iterator it_s = it;
+ int i = 1;
+ do {
+ it_s = std::find(it_s + 1, hand.end(), *it);
+ } while(it_s != hand.end() && i++);
+ if(i >= 4) {
+ targets.push_back(it - hand.begin());
+ }
+ }
+
+ return targets;
+}
+
+Game::Player::Targets Game::Player::can_kan_extend() {
+ return Targets(); // TODO: Waiting for sets.
+}
bool Game::Player::can_kan(Tile tile, int target) {
if(std::size_t(target + 2) < hand.size() && hand[target + 2] == tile) {