summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAtle Hellvik Havsø <atle@havso.net>2010-11-22 17:21:59 +0100
committerAtle Hellvik Havsø <atle@havso.net>2010-11-22 17:21:59 +0100
commit6b76b7542a49dd6382fdfa1a37c85712a8249b86 (patch)
tree63c1ada6b23711c99702f70876798dc4c06de7ea
parent696c8689e6362093026c34d340f6d987749ec8fd (diff)
Implemented pass on the server.
Signed-off-by: Atle Hellvik Havsø <atle@havso.net>
-rw-r--r--server/game.cpp47
1 files changed, 37 insertions, 10 deletions
diff --git a/server/game.cpp b/server/game.cpp
index 6ae899c..a02dc7b 100644
--- a/server/game.cpp
+++ b/server/game.cpp
@@ -80,7 +80,8 @@ void Game::round_start() {
}
void Game::round_update() {
-
+
+ char smart = 0;
// We're in the draw_phase whenever a player draws a tile from the wall
if(draw_phase) {
// If the wall is empty (Contains only 14 tiles) when we enter draw phase the round is over.
@@ -123,6 +124,7 @@ void Game::round_update() {
// Enter the discard phase next loop;
draw_phase = false;
+ smart = smart | (1 << current_player);
} else {
//We chwck to see if player can chi from last discard
@@ -263,26 +265,49 @@ void Game::round_update() {
}
}
-
-
//Go back into draw_phase0
draw_phase = true;
// Not implemented yet
-
+ for(Actions::iterator it = game_state.possible_actions.begin(); it != game_state.possible_actions.end(); ++it) {
+ smart = smart | (0x0001 << it->player);
+ }
+
+ if(smart & 1) {
+ Action pass;
+ pass.type = Action::Pass;
+ pass.player = 0;
+ game_state.possible_actions.push_back(pass);
+ }
+ if(smart & 2) {
+ Action pass;
+ pass.type = Action::Pass;
+ pass.player = 1;
+ game_state.possible_actions.push_back(pass);
+ }
+ if(smart & 4) {
+ Action pass;
+ pass.type = Action::Pass;
+ pass.player = 2;
+ game_state.possible_actions.push_back(pass);
+ }
+ if(smart & 8) {
+ Action pass;
+ pass.type = Action::Pass;
+ pass.player = 3;
+ game_state.possible_actions.push_back(pass);
+ }
}
+
// Send the updates state to the players
-
players[0]->round_state(game_state);
players[1]->round_state(game_state);
players[2]->round_state(game_state);
players[3]->round_state(game_state);
+
// Only implemented discard so far, so only current player that needs to be able to do a action.
- char smart = 0;
- for(Actions::iterator it = game_state.possible_actions.begin(); it != game_state.possible_actions.end(); ++it) {
- smart = smart | (0x0001 << it->player);
- }
+
if(smart & 1) {
num_player_actions++;
@@ -400,8 +425,10 @@ void Game::handle_action(Action action) {
position++;
}
if (!positions.empty()) {
+ int found = 0;
for(std::vector<int>::iterator it = positions.begin(); it != positions.end(); ++it) {
- game_state.possible_actions.erase(game_state.possible_actions.begin() + *it);
+ game_state.possible_actions.erase(game_state.possible_actions.begin() + (*it - found));
+ found++;
}
}